1024答题时发现自己很多基础知识都遗忘了,可能是以前背过或者怎样,没有深刻了解的知识都容易遗忘,所以在这里回顾下各种问题,以及结合经验谈下自己的见解
常见问题Java篇
1、谈谈java三大特性
Java三大特性分为 继承,封装,多态
思考:继承是通过对父类属性和函数的复用表示类之间逻辑上的联系,封装是每个类不对外暴露的属性或函数及业务逻辑部分,是实现自身特性的方式,通过继承得到多个子类,每个子类通过封装实现自身特性,并在外部对于同一函数调用时表现为不同的行为
答:继承和封装是为了实现多态,即任何使用父类的地方,都可以使用子类来替代,并且对同一函数的调用会根据子类的不同而变化
2、讲下对String的了解
思考:这个问题比较广泛,首先需要知道String不是java基础类型,它的值是存储在常量池中的,它的引用有可能是在java堆里面,它在常量池里是以byte数组形式存在的
例如:
String a = "hello" (常量池)
String b = "he"+"llo" (常量池)
String b1 = "he"
String b2 = "llo"
String c = b1+b2 (java 堆 这里使用了StringBuilder字符串拼接)
String d = new String("hello") (java堆)
a == b != c != d
答:String在常量池里以byte数组存在,new String()对象指向java堆,但是它的值指向常量池
3、String StringBuilder StringBuffer三者的区别
思考:我们上面已经知道String是指向常量池的,它的值是不可变的,变更时其实是使用了StringBuilder进行拼接,再将拼接后的值在常量池中的地址指向给String,StringBuilder和StringBuffer的区别是前者线程不安全,效率高,后者线程安全
答:String的值无法变更,变更的实质是指向了其他地址,StringBuilder和StringBuffer的区别是两者线程是否安全
4、String为什么要设计成不可变的?
思考:String不可变的代码层原因是它的本质是一个设置为final的byte数组,内容不可变更,设计上是基于稳定考虑,毕竟不可变的对象是原子性的,线程安全的,避免了变化引起的问题
答:为了保证数据是原子性的,线程安全的,避免了变化引起的问题
5、各种数据类型的大小
思考:1Byte(字节) = 8bit(比特)
bit是计算机存储的最小单位,是二进制位(Binary digit)的简称,可以表示二进制中的0或1,Byte(字节)简写为B 是计算机处理的最小单位
字是计算机处理二进制代码的位数,由多个Byte组成,例如64位计算机就是64bit(比特)也就是8个Byte(字节)
答:byte为1字节,char和short为2字节,int和float及bolean为4字节,long和double为8字节
注意:JVM规范中,boolean变量作为int处理,也就是4字节;boolean数组当做byte数组处理
6、int和Integer的区别是什么
思考:除了简单的Integer是int的包装类,它们的值也有所区别,在装箱的时候,Integer.valueOf()方法会缓存值为-128~127之内的数,所以为同一个数,在拆箱的场景下,int和Integer可以相等
即:
int a = 127
Integer b = new Integer(127)
Integer c = 127
Integer d1 = new Integer(128)
Integer d2 = new Integer(128)
a=b=c
d1!=d2
答:Integer是int的包装类,初始值为null,int初始值为0,同为装箱的情况,Integer -128~127之内的数值可以相等,拆箱情况下,int和Integer可以相等
7、equals和==的区别
答:如果是同一个对象的引用,可以使用==来作判断,但是如果是两个地址不同的对象进行比较,需要重写hashCode方法,并通过equals方法来判断内容是否相同
8、sleep和wait的区别
答:sleep是在线程中使用的,在设定的时间结束后会自动醒来,也可以调用interreput打断,它不会释放线程锁,wait是object中使用,可以用notify唤醒,它会释放线程锁
9、内部类和闭包的关系
答:内部类是用来解决java无法多继承而使用的技术,可以很好的隐藏,可以用来实现多个同名函数的调用,闭包是使用接口+内部类的形式,利用了内部类可以调用外部类参数及函数的功能来实现的,
10、谈谈对线程和进程的看法
思考:线程是进程的一部分,是进程最小的执行单元
11、谈谈反射
思考:程序运行时允许改变结构和成员类型,这种语言被称为动态语言,而Java虽然不是动态语言,但是它有动态机制——反射,任何一个类都是Class类的实例化对象
答:我们可以通过类的反射实现在运行时实例化对象的架构设计,来实现动态加载,可以获取类不允许外部访问的方法及变量进行操作
12、谈谈注解
答:注解处理器利用反射获取注解中的属性并处理,使得业务逻辑在代码层面更直观简洁