Java基础面试题
1、Java中的几种基本类型,各占用多少字节?
boolean | 1字节 |
---|---|
byte | 1字节 |
char | 2字节 |
float | 4字节 |
double | 8字节 |
short | 2字节 |
int | 4字节 |
long | 8字节 |
2、String能被继承吗?为什么?
不可以,因为String类被final修饰符修饰,
被final修饰的类是不能被继承的。实现的细节也不允许被改变。比如平常我们定义的String a = “aaa”(直接赋一个字面量)和String a = new String(“aaa”) 使用构造器创建,还是有差异的。
那它们的差异有哪些?能细说一下吗?
1.它们创建的对象数量会不一致,前者会先看字符串常量池中有没有?如果没有则会在常量池中创建1个,然后直接引用。后者也会先看常量池中有没有,但是后者并不会直接引用,它还会在堆内存中创建一个实例对象。所以前者创建的对象数量最多只有一个,而后者则有两个。
2.为了提升Java虚拟机(JVM)的性能和减少内存开销。我们要尽量避免使用String a = new String(“aaa”)去创建对象,因为这样会导致实例对象的重复创建。
3.常量存储在常量池中,变量和引用存储在栈中
3、StringBuffer、StringBuilder、String的区别?
1.String是Java基础中很重要的类,它被final修饰,且不可被继承和修改。所以如果用来拼接字符串,就会产生很多无用的中间对象,频繁的进行这样的操作,也会对JVM性能有所影响。
2.StringBuffer就是为了解决大量拼接字符串时产生许多中间对象问题的一个类。它提供了append和add方法,可以将字符串添加到已有序列的末尾或指定的位置。它的本质是一个线程安全的可修改的字符序列,把所有的修改数据的所有方法都加上了synchronized(同步代码块)
3.StringBuilder和StringBuffer本质没有什么区别,StringBuilder就是去掉了线程安全那部分,减少了JVM的内存开销。因为在很多情况下我们操作字符串不需要保证线程安全。
4、ArrayList和LinkedList有什么区别。
共同点:它们都实现了List接口
不同点:
1.ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)的时间复杂度对元素进行随机访问。
2.Linked的底层是链表,所以它的每一个元素都和它的上一个元素和下一个元素都是链接在一起的,它的数据是以元素列表的形式来存储的。但是在这种情况下想要访问元素的话,就只能以O(n)的时间复杂度来访问。
3.相对于ArrayList,LinkedList的插入、添加、删除操作的速度更快,因为当元素被添加到LinkedList中后,它不用再重新计算大小和更新索引了。
4.相对于LinkedList,ArrayList又更节省内存。因为LinkedLsit的每一个节点存储两个引用,一个引用指向前一个元素,另一个引用指向后一个元素
5、抽象类和接口的区别,类可以继承多个类吗?接口可以实现多个接口吗?类可以实现多个接口吗?
1.抽象类和接口都不能被实例化,如果想要实例化,抽象类的变量必须指向实现了所有抽象方法的子类对象,接口变量必须指向实现了所有接口方法的类对象。
2.如果一个类里有抽象方法,那么这个类只能是抽象类
3.抽象方法必须全部被子类实现。如果子类不能实现实现全部的抽象方法,那么此类只能是抽象类。同理,接口的方法也必须全部被实现,如不能全部实现,那么此类也只能为抽象类
4.抽象方法要被子类实现。所以不能是私有的、静态的
- 抽象类中的抽象方法不能有方法体,普通方法可以有
6.抽象类里也可以没有抽象方法
7.接口只能做方法声明,不能方法实现,抽象类中可以做方法声明,也可以方法实现
8.接口里定义的变量只能是公共的静态常量、抽象类中的变量可以是普通变量
9.接口不可以实现接口,但可以继承接口、多继承接口。
10.类只能单继承