JAVA篇
1.JDK和JRE有什么区别?
JRE: Java Runtime Environment (Java运行时环境)。即是java程序的运行时环境,包含了java虚拟机,java基础类库。
JDK: Java Development Kit (java 开发工具包)。即java语言编写的程序所需要的开发工具包。JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。
2. ==和equals 的区别是什么?
- == 是关系运算符,equals()是方法,结果都返回布尔值
- Object 的 == 和 equals()比较的是都是地址,作用相同
== 作用:
- 基本类型,比较值是否相等
- 引用类型,比较内存地址值是否相等
- 不能比较没有父子关系的两个对象
equals() 作用
- JDK中的类的一般已经重写了equals(),比较的是内容
- 自定义类如果没有重写equals(),将调用父类(Object类)的equals()方法,Object的equals()比较使用了this == obj
- 可以按照需求逻辑,重写对象的equals()方法(重写equals方法,一般须重写hashCode方法)
3. 基本类型和包装类对象使用 == 和 equals 进行比较的结果?
1. 值不同, 使用 == 和 equals() 比较都返回false
2.值相同
使用 == 比较
- 基本类型 - 基本类型、 基本类型 - 包装对象 返回 true
- 包装对象 - 包装对象, 非同同一个对象(对象的内存地址不同) 返回 false;对象的内存地址相同返回true ,如下值等于100的两个Integer 对象(原因是JVM缓存部分基本类型常用的包装对象,如 Integer - 128~ 127 是被缓存的)
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2); //true
System.out.println(i3 == i4); //false
使用equals() 比较
- 包装对象 - 基本类型返回 true
- 包装对象 - 包装对象 返回true
4. 什么是装箱? 什么是拆箱? 装箱和拆箱的执行过程?常见问题
①什么是装箱?什么是拆箱?
装箱: 基本类型转变为包装器类型的过程。
拆箱:包装器类型转变为基本类型的过程。
//JDK 1.5之前是不支持自动装箱和自动拆箱的
Integer i = new Integer(8);
//JDK 1.5 开始,提供了自动装箱的功能,定义Integer对象可以这样
Integer i = 8;
int n = i; //自动拆箱
② 装箱和拆箱的执行过程?
- 装箱是通过调用包装器类型的valueOf方法实现的
- 拆箱是通过调用包装器类的xxxValue 方法是实现的,xxx代表对应的基本数据类型
- 如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的IntValue方法
③ 常见问题?
- 整型的包装类 valueOf 方法返回对象时,在常用的取值范围,会返回缓存对象。
- 浮点型的包装类valueOf方法返回新的对象。
- 布尔型的包装类valueOf方法Boolean类的静态常量TRUE | FALSE;
5. hashCode() 相同, equals()也一定为true?
首先,答案肯定是不一定,同时反过来equals()为true,hashCode()也不一定相同。
- 类的hashCode() 方法和equals()方法都可以重写,放回的值完全在于自己定义。
- hashCode() 返回对象的哈希码值;equals()返回两个对象是否相等。
关于hashCode() 和 equals() 是方法是有一些规定协议:
① 两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
② 两个对象用equals() 比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,以提高哈希表性能。
③ 重写equals()方法,必须重写hashCode()方法,以保证equals()方法相等时两个对象的hashCode()返回相同的值。
6. final在java中的作用
final 语义是不可改变的。
- 被final修饰的类,不能够被继承
- 被final修饰的成员变量必须要初始化,赋初始值后不能再被重新赋值(可以调用对象方法修改属性值)。对基本类型来说是其值不可变,即不能再指向其他的对象
- 被final修饰的方法不能重写。
7. final finally finalize()区别
- final 表示最终的、不可改变的。用于修饰类、方法和变量。final修饰的类不能被继承;final方法也同样只能使用,不能重写,但能够被重载;final修饰的成员变量必须在声明式给定初始值或者在构造方法内设置初始值,只能读取,不可修改;final修饰的局部变量必须在声明时给定初值;final修饰的变量是非基本类型,对象的引用地址不能变,但对象的属性值可以改变。
- finally 异常处理的一部分呢,它只能用在try/catch语句中,表示希望finally语句块中的代码最后一定被执行(存在一些情况导致finally语句块不会被执行,如jvm结束)
- finalize() 是在java.lang.Object里定义的,Object的finalize()方法什么都不做,对象被回收时finalize()方法会被调用。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前被调用的。一般情况下,此方法由JVM调用。特殊情况下,可重写finalize()方法,当对象被回收的时候释放一些资源,须调用super.finalize()。
8. finally语句块一定执行吗?
不一定。存在很多特殊情况导致finally语句块不执行,如:
- 直接返回未执行到try-finally语句块
- 抛出异常未执行到try-finally语句块
- 系统退出未执行到finally语句块
9.final与static的区别?
- 都可以修饰类、方法、成员变量
- 都不能用于修饰构造方法。
- static 可以修饰类的代码块,final不可以
- static不可以修饰方法内部的局部变量,final可以
static
- static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性/方法名访问
- static修饰的代码块白哦是静态代码块,当java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次
- static 修饰的属性,也就是类变量,是在类加载是被创建,并进行初始化,只会被创建一次
- static修饰的变量可以重新赋值
- static 方法中不能用this和super关键字
- static 方法必须被实现,不饿能是抽象的abtract
- static 方法不能被重写
final
- final修饰表示常量、一旦创建不可改变
- final标记的成员变量必须在声明的同时赋值,或者该类的构造方法中赋值,不可以重新赋值
- final方法不能被子类重写
- final类不能被继承,没有子类,final类中的方法默认是final的
10.return 与 finally的执行顺序对返回值的影响
对于try 和finally 至少应该语句块包含return语句的情况:
- finally语句块会执行
- finally没有return,finally对return变量的重新赋值修改无效
- try 和 finally 都包含return,return值会以finally语句块return值为准