1.java语言的三大特性
- 封装
属性可以描述事物特征,方法可以描述事物可做的操作。封装就是将同一事物的属性和方法归到一个类中,使其形成一个不可分割的独立实体。用户无需知道内部方法的实现细节,可以根据对象提供的外部接口访问。 - 继承
子类是父类的特殊化实现,父类私有的属性和构造方法不能被继承,静态方法,静态/非静态的属性不能被重写。 - 多态
子类以父类的身份出现(向上转型),调用子类的方法
2. JDK和JRE的区别
jdk为开发工具包,jre为运行环境。jdk包括jre
3. 为什么需要包装类
泛型使用的参数都是对象类型,无法直接使用基本数据类型
4. 基本数据类型与封装类的区别
- 基本数据类型按值传递,封装类按引用传递
- 基本数据类型在栈中创建,封装类对象在堆中创建,对象的引用在栈中创建
5. == 与equals的区别
== 比较的是内存地址和值,equals比较值
用法:
"".equals(a)
a==null
6. while和do/while循环区别
while在循环开始前会判断循环是否继续;do/while在结尾判断,会先执行一次循环体
7. float f = 3.4 是否正确?
不正确,3.4是double类型,这样复制属于向下转型,应使用float f = (float) 3.4 或者 float = 3.4F
8. IntegerCache
public class IntegerTest {
public static void main(String[] args) {
Integer a = 100, b = 100 ,c = 129,d = 129;
System.out.println(a==b); // true
System.out.println(c==d); // false
}
}
原因:integer在-128~127之间做了缓存,超过这个范围才会生成新的对象
9. Locale类
用来根据语言环境来动态调整程序的输出
10. final,finally,finalize区别及用法
- final
是修饰符也时关键字
- 被final修饰的类无法被继承
- 定义常量
- 被final修饰的方法无法被重写,但允许重载
- finally
是关键字
- 在异常处理时不管有没有异常被抛出或者捕获,都会执行,通常用于释放资源
- 在正常情况下一定会被执行,除了至少两个极端条件
- 对应的try块没有执行
- try中jvm关机
- finally块中如果有return语句,则会覆盖try/catch语句中的return语句,所以不要再finally块中存放return语句
- finalize
GC在回收对象之前会调用该方法
11. hashCode()和equals
hashCode:可靠性低,效率高
equals:可靠性高,效率低
equals()相等的两个对象的hashCode()一定相等
hashCode()相等的两个对象的equals()不一定相等
- 只要重写equals,就必须重写hashCode。
因为只重写equals,可能造成两个对象的hashCode却不一样,而将对象存储进HashMap等集合中时,就会造成数据的不唯一性() - 什么时候需要重写hashCode?
涉及到对象之间的比较大小就需要重写equals方法,而涉及到将对象存储进Hash存储结构中的就必须重写hashCode,虽然如此但建议同时重写这两个方法,因为也不知道后期会不会用到。 - 放入Hash结构的步骤
在HashSet中插入同一个元素(hashCode和equals均相等)时,会被舍弃,而在HashMap中插入同一个Key(Value 不同)时,原来的元素会被覆盖。
12. 浅拷贝与深拷贝
- 浅拷贝:
只复制原对象的值,不复制值的引用。 - 深拷贝:
复制原对象的值和引用。
13. String ,StringBuffer,StringBuilder
- String:不可变对象,每次操作会生成新的String对象,然后将指针指向新的String对象,而其他两个是在原对象基础上操作,效率低下且浪费内存空间,所以经常改变字符串最好不使用String。
- StringBuffer:线程安全,性能低(建议多线程使用)
- StringBuilder:线程不安全,性能高(建议单线程使用)
String s = "a"; // 存放在常量池
String s = new String("a") // 存放在堆内存
14. static关键字
- 抽象方法不可以使用static
- 不可以在静态方法内部调用非静态方法
- 不可以修饰局部变量
- 内部类与静态内部类区别?
静态内部类与外部类相互独立,可以看做是一个独立的外部类。普通内部类可以调用外部类的所有属性和方法,为外部类需要创建实例才可以调用内部类中的方法 - 不可以重写static或private方法
15. 重载和重写
都是实现多态的方式。
重载是实现编译时的多态,同名的方法有不用的参数列表,对返回类型没有要求。
重写是运行时的多态,重写要求与原来的方法相同的参数列表,返回类型。
16. 四种引用
- 强引用:最普遍,例如String s = “abc”,变量s就是abc的强引用,只要存在就不会垃圾回收掉
- 软引用:描述有用但非必须的对象,内存不足则回收。
- 弱引用:内存不管是否足够都会回收
- 虚引用:不像其他三个决定回收周期,必须与引用队列(ReferenceQueue)联合使用,在对象回收之前把虚引用加入到与之关联的引用队列中。
17. Comparator和Comparable接口,compareTo方法
Comparator比较器排序
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1,Person o2) {
}
}
Comparable自然排序
public class People implements Comparable<People>{
@Override
public int compareTo(People o) {
}
}
compatrTo:比较两个字符串
18.序列化
- 序列化:将对象转换为字节序列的过程;反序列化:是将字节序列转换成对象的过程
- 何时需要序列化:当java对象需要在网络上传输或者持久化存储到文件中时,
- 如何实现:让类实现Serializable接口
- 数据不想序列化:字段前加transient关键字
19.泛型和类型擦除
java中的泛型是一种伪泛型,虚拟机中并没有泛型对象,只是存在于编译期的一种语法糖,在编译器会进行类型擦除,如果定义了上界则用上界替换;没有则用Object替换