Java面试题总结-Day2
Java面试题总结-Day2
Table of Contents
1 面试题-Day2
1.1 String和StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?
1.1.1 可变性
- String类中使用字符数组:
private final char value[]
保存字符串,所以String对象是不可变的. - StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组
char[] value
保存字符串,这两种对象都是可变的.
1.1.2 线程安全性
- String对象是你不可变的,也就是可以理解为常量,线程安全.
- AbstractStringBuilder是StringBuilder和StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity,append,insert,indexOf等公共方法.
- StringBuffer对AbstractStringBuilder的公共方法添加了同步锁或者对调用的方法加了同步锁,所以是线程安全的.
- StringBuilder并没有对AbstractStringBuilder的公共方法添加同步锁,所以是非线程安全的.
1.1.3 对于三者使用总结
- 如果操作少量的数据用String.
- 单线程操作字符串缓冲区下操作大量数据用StringBuilder.
- 多线程操作字符串缓冲区下操作大量数据用StringBuffer.
1.2 什么是反射机制?反射机制的应用场景有哪些呢?
1.2.1 反射机制的介绍
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的
任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能被称为Java的反射机制.
1.2.2 静态编译和动态编译
- 静态编译: 在编译时确定类型,绑定对象
- 动态编译: 运行时确定类型,绑定对象
1.2.3 反射机制的优缺点
- 优点: 运行期类型的判断,动态加载类,提高代码灵活度.
- 缺点: 性能瓶颈: 反射相当于一系列解释操作,通知JVM要做很多事情,性能比直接的Java代码要慢很多.
1.2.4 反射机制的应用场景
- 动态代理设计模式.
- Spring/Hibernate等框架也大量使用到了反射机制.
1.3 接口与抽象类的区别是什么?
- 接口的方法默认是public的,所有方法在接口中都不能有实现,抽象类中可以有非抽象的方法.
- 接口中的实例变量默认是final类型的,而抽象类中则不一定.
- 一个类可以实现多个接口,但是一个类最多只能实现一个抽象类.
- 一个类实现接口需要实现接口中的所有方法,一个类实现抽象类只需实现它的抽象方法.
- 接口不能用new实例化,但是可以声明,必须引用一个实现该接口的对象.
- 从设计层面来说,抽象类是对类的抽象,是一种模板设计.接口是行为的抽象,是一种行为的规范.
1.4 成员变量和局部变量有哪些区别?
- 从语法形式看,成员变量属于类,局部变量是在方法中定义的变量或者是方法的参数.
- 成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制权限符及static所修饰.
- 成员变量和局部变量都能被final所修饰.
- 从变量在内存中的存储方式看,成员变量是对象的一部分,对象存在于堆内存中,局部变量存在于栈内存中.
- 从变量在内存中的生存时间看,成员变量是对象的一部分, 它随着对象的创建而存在,而局部变量随着方法调用而自动消失.
- 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显式的复制),局部变量则不会自动赋值.
1.5 重载与重写的区别
- 重载: 发生在同一个类中,方法名必须相同,参数参数类型不同(个数不同,顺序不同),方法返回值的访问修饰符可以不同,发生在编译时.
- 重写: 发生在父子类中,方法名,参数列表必须相同,返回值范围小于父类,抛出的异常范围小于父类,修饰符范围大于等于父类,如果父类方法访问修饰符为private则子类就不能重写该方法.