Java基础(1)--面试
1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。
数据类型 | 关键字 | 内置类 | 内存占用字节数 |
---|---|---|---|
布尔型 | boolean | Boolean | 1字节 |
字符型 | char | Character | 2字节 |
字节型 | byte | Byte | 1字节 |
短整型 | short | Short | 2字节 |
整形 | int | Integer | 4字节 |
长整型 | long | Long | 8字节 |
单精度型 | float | Float | 4字节 |
双精度型 | double | Double | 8字节 |
2.&和&&的区别。
&是位运算符;不管前面对与错,后面都参与运算。
&&是布尔逻辑运算符;只要前面第一个为true,则后面的就不进行运算。
3. String 类能被继承吗,为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
4.String,Stringbuffer,StringBuilder的区别?
- 1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String:字符串常量
StringBuffer:字符串变量
StringBuilder:字符串变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码:
String s = "ABCabc";
System.out.println("s = " + s);
s = "123456";
System.out.println("s = " + s);
打印结果为:
s = ABCabc
s = 123456
首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。
也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。
内存结构如下图所示:
所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
-
2.StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结:1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。
- Java中的初始化顺序:
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是
(静态变量、静态初始化块)>(变量、初始化块)> 构造器。
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
- 类的实例化顺序:
初始化顺序:先初始化父类的静态代码—>初始化子类的静态代码–>
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码(变量定义等)—>初始化父类构造函数—>初始化子类非静态代码(变量定义等)—>初始化子类构造函数
6.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者是 public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
7.谈谈final, finally, finalize的区别。
final:
修饰符(关键字) 修饰类,则该类不能被继承;修饰方法,不能被重写;修饰成员变量,不能被二次赋值(所以说必须给定初始值);
不能和abstract同时使用;
finally:
专门用于在try-catch块之后,一般用于关闭某些流之类的。
finalize:方法名。
专门用在垃圾回收机制的时候;每一个对象都有一个finalize()方法;
当回收对象的时候,在进行可达性分析后发现没有与GC Roots相连接的引用链,会被第一次标记且进行一次筛选,筛选的条件就是是否有必要执行该方法,当对象没有覆盖该方法或者已经被调用过,就不会再执行该方法了;
上一篇: java面试准备(1)
下一篇: 多线程-出现非线程安全的底层原因