1、JDK 和 JRE和JVM 有什么区别?
JDK是Java开发工具包,JRE是Java运行环境,JVM是java虚拟机。
其中JDK包括了JRE和开发工具,JRE又包括了JVM和核心类库,
JVM是一个软件技术模拟出计算机运行的虚拟计算机,可以运行Java字节码文件,是Java实现跨平台的核心,由于每个平台都有对应的JVM,Java字节码文件的运行只依赖于JVM而不是系统平台,因此可以实现跨平台
核心类库是给程序员开发时调用的一些基础代码
开发工具包括了如javac.exe可以将源代码编译成字节码文件,java.exe可以将class文件加载到内存中运行,还有其他一些反编译工具、文档工具等
2、== 和 equals 的区别是什么?
当==比较的是基本数据类型,会比较基本数据类型的值,
当==比较的是引用数据类型,会比较引用类型的引用地址,
equals会比较两个对象内容是否相同,通常会重写equals方法,按照自定义的规则来进行比较
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不一定,如在map中,存在hashcode()值相同,只能说明键值对的哈希值相同,并不能说明键值是相等的。
如果两个对象相等,则hashcode()值一定相同,两个对象分别调用equals方法也都返回true
4、final 在 java 中有什么作用?
final是Java的关键字,可以修饰Java中的类、方法和变量
final修饰的类不可被继承
final修饰的方法不可被重写
final修饰的变量不可被改变
fianl修饰的对象引用不可变,内容可变
5、八大基本数据类型及封装类
基本数据类型byte(8) short(16) char(16) int(32) long(64) float(32) double(64) boolean(1位,会补到8位)
封装类Byte、Short、Character、Integer、Float、Double、Boolean(位数与基本类型相同)
6、访问修饰符有哪些及范围
访问修饰符共有4中,范围由大到小为public、protected、default、private
当由public修饰时,无论是否是同一个包下的同一个类或子类或其他类,都可以访问
当由protected修饰时,只要是同一个包中的类,或不同包中的子类都可以访问
当由default修饰时,不加修饰符默认为default,此时只有同一个包下的类可以访问
当由private修饰时,只有同一个类中可以访问
7、方法重写和重载的区别
重写发生在父子类之间,要求子类方法中的方法名与参数列表相同,返回值小于等于父类,访问修饰符的范围大于等于父类,抛出的异常小于等于父类
重载发生在同一个类中,重载方法的方法名相同,参数列表不同(数量、类型、顺序不同),与返回值和修饰符无关(重载的方法不能通过返回类型区分)
8、String str="i"与 String str=new String("i")一样吗?
不一样,他们的内存分配方式不同。第一种,JVM会将其分配到常量池中,栈内存通过地址直接到常量池中取到值,第二种会分配到堆内存中,栈内存通过地址到堆内存中找,堆内存再通过地址到常量池中去找
9、&和&&的区别
&运算符用法有按位与和逻辑与,按位与常是底层数据的运算,开发中常用逻辑与
&&是短路与,与逻辑与用法对应,共同点为要求运算符两边布尔值都是true时表达式才为true,否则为false,不同点为短路与当判断运算符左边为flase时会直接得出表达式为false,右边的表达式会被短路,不再进行计算,但&及时左边为flase,还是会计算右边的值
10、静态变量与普通变量区别
静态变量也称为static变量,与普通变量的区别在于静态变量被所有对象共享,在内存中只有一个副本,当且仅当在类初次加载时会被初始化,静态变量属于类,而非静态变量是对象对拥有的,在创建对象时被初始化,每个不同的对象都拥有一个互不影响的副本
静态变量初始化的顺序按照定义顺序,普通变量初始化顺序按照所属对象被定义的顺序
11、抽象类必须要有抽象方法吗?
不用。抽象类是由abstract修饰的类,类中可以定义由abstract修饰的方法,也可以定义普通方法的具体实现。有抽象方法的一定是抽象类,但抽象类中可以没有抽象方法
12、普通类和抽象类有哪些区别?
首先抽象类被abstract修饰,普通类则不用
普通类是为了实例化一个对象,而抽象类的存在是为了被继承,不能实例化,因此抽象类的子类必须重写抽象类的抽象方法,而普通类可以不重写父类方法,同时抽象类也不能被final、static、private修饰
13、抽象类能使用 final 修饰吗?
不能。抽象类的存在就是为被继承,从而重写里面的抽象方法,final修饰的类将不能被继承,用final修饰抽象类会变得毫无意义
14、接口和抽象类有什么区别?
接口是对行为的抽象,是行为的规范,是like a的关系,抽象类是对类的抽象,是一种模版设计,是is a的关系。
接口中一般不能做方法的实现,在jdk1.8之后可以用default修饰来实现,抽象类可以做方法实现
接口没有构造方法,而抽象类有,一般给子类使用
接口可以继承接口(抽象类也可以继承抽象类),可以多继承,类只能单根继承
15、java 中 IO 流分为几种?
按照流的方向可以分为输入流和输出流
按照流处理数据的单位可以分为字节流和字符流
16、BIO、NIO、AIO 有什么区别?
BIO,NIO和AIO是java网络编程的三种模型。
BIO(同步阻塞):服务端对客户端的每个请求处理完成后,才会继续接受客户端的请求,客户端也会等待服务端处理完请求后才会发送请求,通常会使用多线程去处理,因为BIO每个连接都是一个单独的线程
NIO(同步非阻塞):NIO使用单线程或者只使用少量的多线程,一个请求一个线程,多个连接共用一个线程(即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。)
AIO(异步非阻塞):AIO的读写方法都是异步的,完成后会主动调用回调函数。
如:
假设有这么一个场景,有一排水壶(客户)在烧水。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
17、 break continue return 的区别
break跳出上一层循环,不再执行循环(结束当前循环体)
continue跳出本次循环,依然执行下次循环
return程序返回,不再执行下面的代码(结束当前的方法,直接返回)
18、什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
19、什么是 java 序列化?什么情况下需要序列化?
将Java对象转换成二进制序列的过程就是序列化,类实现Serializable接口来实现;
当java对象需要在网络上传输或者持久化存储到文件中,就需要对Java对象进行序列化;
此外,将二进制序列转换成Java对象的过程是反序列化,声明为static和transient的成员变量不能被序列化
20、动态代理是什么?有哪些应用?
动态代理创建一个新的代理类,这个代理类不仅继承了原有类的方法功能,还能够在执行这些方法时插入额外的逻辑。这个代理类是在运行时动态生成的,而不是在编译时定义的,从而提供了解耦、灵活和可扩展的解决方案。当需要为实现了某个接口的类中的方法添加额外处理(如日志记录、事务管理等)时,可以通过动态代理来实现。动态代理的应用包括 Spring AOP、事务管理、权限控制和日志记录等场景。