2021-5-12
一:JDK和JRE有什么区别?
JDK:Java Development Kit( java 开发工具包)包含JRE,同时还包括 java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm等。(JDK = JRE +Javac)
JRE: Java Runtime Environment( java 运行时环境)。即java程序的运行时环境,包含了 java 虚拟机,java基础类库。(JRE = JVM + JavaSe 核心类库)
二:
二:== 和 equals()区别?
== 是比较运算符 基础数据类型比较的是值 引用数据类型比较的是内存地址
equals()是Object类中定义的方法,底层就是 == ,JDK中类一般都重写了equals() 比较的是对象中的内容
public boolean equals(Object obj) {
return (this == obj);
}
三: 阐述String、StringBuffer、StringBuilder三者的区别以及各自使用的场景
String 不可变字符序列 底层使用char数组进行存储
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
StringBuffer 可变字符序列 底层使用char数组进行存储,属于线程安全
//StringBuffer str = new StringBuffer(“hi”); super(str.length() + 16);
在传递字符串的长度上加上16
StringBuffer str = new StringBuffer();
当使用空参构造创建了一个StringBuffer对象底层默认创建了一个长度为16的char[]. 调用 str.append(“xx”)添加元素,如果底层数组容量不够则会进行扩容. 默认情况扩容为原来的两倍加2int newCapacity = (value.length << 1) + 2;
指导意见: 建议使用 StringBuffer(int capacity) 或 StringBuilder(int capacity) 指定数组长度
StringBuilder 可变字符序列 底层使用char数组进行存储,线程不安全
使用场景:
1.String: 字符串不经常改变,操作少量数据,如常量定义,少量变量运算
2.StringBuffer: 多线程情况下,操作字符串的拼接、删除、替换,考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
3.StringBuilder: 单线程情况下,操作字符串的拼接、删除、替换,考虑使用StringBuilder,例如SQL语句的拼装、JSON封装等。
四:hashCode()相同、equals()就一定相同吗
hashCode()作用 计算对象实例的哈希码,对于Java中的对象会返回其内存地址。
equals()作用 比较对象中的内容
hashCode()相同 equals()不一定相同
equals()相同 hashCode()一定相同
即相同的对象,hashCode码一定相同
五:final、finally、finalize的区别
final表示最终的、不可变的。用于修饰类、方法、成员变量、局部变量。
- 修饰的类不可被继承 一但类被修饰final修饰,类中的所有方法默认隐式指定为final方法
- 修饰基本数据类型 进行初始化后值是不能在改变
- 修饰引用数据类型的变量,初始化后对象的引用地址不能改变,但对象的属性值可以改变
finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如 jvm 结束)
finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。一般情况下,此方法由JVM调用。特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,须调用 super.finalize() 。