1. Java种操作字符串都有哪些类?它们之间有什么区别?
- String、StringBuffer、StringBuilder
- String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象(String类中使用final关键字字符数组保存字符串,private final char value[], 所以String对象是不可变的),每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作(都是继承自AbstractStringBuilder类,但是AbstractStringBuilder中字符数组没有使用final关键字修饰),所以在经常改变字符串内容的情况下最好不要使用String
- StringBuffer和StringBuilder最大区别在于,StringBuffer是线程安全的(对方法加了同步锁或者对调用方法加了同步锁),而StringBuilder是非线程安全的(没有对方法进行加同步锁),但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer
2. String str = “a” 与 String str = new String(“a”)一样吗?
- 不一样,因为内存分配方式不一样
- String str = “a”; —>常量池 String str = new String(“a”); —>堆内存
3. 抽象类能否使用final修饰?
- 不能。定义抽象类就是让其它类继承的,而final修饰的类不能被继承
4. static关键字五个问题
- 抽象的(abstract)方法是否可同时是静态的?
抽象方法将来是要被重写的,而静态方法是不能重写的,所以不能
- 是否可以从一个静态(static)方法内部发出对非静态方法的调用?
不可以,静态方法只能访问静态成员,非静态方法的调用要先创建对象
- static可否用来修饰局部变量?
static不允许用来修饰局部变量
- 内部类和静态内部类的区别?
1. 静态内部类相对于外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个内部类的对象,
使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法
2. 普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法
3. 如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法
4. 如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外部类
可以通过该属性调用普通内部类的方法或者访问普通内部类的属性
5. 如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可
- Java中是否可以覆盖(override)一个private或者是static的方法?
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟任何实例都不相关,
所以概念上不适用
5. 重载(Overload)和重写(Override)
- 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
- 重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时
- 重写:发生在子父类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常返回小于等于父类,访问修饰符返回大于等于父类;若父类方法访问修饰符为private则子类就不能重写该方法
- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者两者都不同)则视为重载
- 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
- 重载对返回类型没有特殊的要求,不能根据返回类型进行区分
6. Java的四种引用
- 强引用
最普遍的一种引用方式,如String s= “abc”;变量s就是字符串"abc"的强引用,只要强引用在,则垃圾回收器就不会回收这个对象
- 软引用(SoftReference)
用于描述还有用但非必须的对象,如果内存足够,不回收,如果内存不足,则回收。一般用于实现内存敏感的高速缓存,软引用可以和
引用队列ReferenceQueue联合使用,如果软引用的对象被垃圾回收,JVM就会把这个软引用加入到与之关联的引用队列中
- 弱引用(WeakReference)
弱引用和软引用大致相同,弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的
内存区域的过程中,一旦发现有了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
- 虚引用(PhantomReference)
就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,
在任何时候都有可能被垃圾回收器回收,虚引用主要用来跟踪对象被垃圾回收器回收的活动
虚引用和软引用、弱引用一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
7. Java中Comparator与Comparable有什么不同?
- Comparable接口用于定义对象的自然顺序,是排序接口,而comparator通常用于定义用户定制的顺序,是比较接口。我们如果需要控制某个类的次序,而该类不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序。Comparable总是只有一个,但是可以有多个comparable来定义对象的顺序
8. Java序列化、反序列化
- 序列化:将对象转换为字节序列的过程
- 反序列化:将字节序列转换成目标对象的过程
9. 什么情况下需要Java序列化?
- 当Java对象需要在网络上传输或者持久化存储到文件中时
10. 序列化的实现? 如果某些数据不想序列化怎么处理?
- 实现: 让类实现Serializable接口,标注该类对象是可被序列
- 不想序列化:在字段前面加transient关键字,如
transient private String name; // 不参与序列化
上一篇:Java面试手册V2.0+突击V3.0知识点整理(二) 附封面图片😍
下一篇:Java面试手册V2.0+突击V3.0知识点整理(四) 附封面图片😍
如果觉得封面图片还行,请顺手点个赞😍