前言
面渣逆袭 Java 基础篇
Java概述
1. 什么是Java
C++(--):吸收了C++的优点,并且抛弃了指针、多继承等概念
是一门面向对象语言
2. Java特点
面向对象(封装、继承、多态)
跨平台
3. JVM、JRE、JDK有什么区别
关系是 JDK>JRE>JVM
JVM:Java虚拟机,用于解释Class文件成为机器码
JRE:Java运行时环境,包含JVM和核心类库(lang、util...)
JDK:Java开发环境,在JRE基础上多了javac、jdb、javadoc等命令
4.说说什么是跨平台性,原理是什么
指java代码一次编译,到处运行
因为java代码跑在虚拟机上,每个操作系统对应不同平台的虚拟机,他们可以解释同一份class文件
5. 什么是字节码?采用字节码的好处是什么
是java编译之后的文件,能够被虚拟机识别
实现跨平台性
6. 为什么说 Java 语⾔“编译与解释并存
要先编译再解释
基础语法
7. Java有哪些数据类型
。。。
8. ⾃动类型转换、强制类型转换、看看这⼏⾏代码
小范围 --> 大范围:隐式转换
大范围 --> 小范围:强制转换
float f=3.4; //编译错误,3.4是double类型, 赋值给float时要强制转换或者加上f/F让编译器识别初始化
short s1 = 1; s1 = s1 + 1; // s1+1的结果是int类型,需要强转,错误
short s1 = 1; s1 += 1; // +=自动转换类型, 正确
9. 什么是⾃动拆箱/封箱
例如Integer
使用的是integer.valueOf 和 intValue实现的
10. &和&&有什么区别
&&如果左边的表达式为flase不再执行右边的表达式,&还会执行
|| 左边为true不再执行右边,|还会执行
11. switch 是否能作⽤在 byte/long/String 上
1.7开始支持的类型包括:byte、short、int、char、enum、string
到现在都不支持的有:long、float、double
12. break ,continue ,return 的区别及作⽤
。。。
13. ⽤最有效率的⽅法计算 2 乘以 8
位运算:2 <<< 3 无符号左移3位相当于*2^3
14. 说说⾃增⾃减运算?看下这⼏个代码运⾏结果
int i = 1 ;
i = i + + ;
System . out . println ( i) ; // 结果为1 因为i++返回的是自增前的结果
面向对象
15. ⾯向对象和⾯向过程的区别
对象:将步骤定义在各个对象内,成为一个个的对象方法,把这些方法组装起来就是逻辑
过程:把逻辑定义在具体的过程中
16. ⾯向对象有哪些特性
封装:把许多个属性和方法封装在一个对象内,属性是私有的,只提供方法
继承:把公共部分抽离出来,通过继承的方式得到对应的属性
多态:利用继承和接口接收不确定返回的子类,如果要使用子类的方法,需要强转为子类
17. 重载和重写
。。。
18. 访问修饰符 public、private、protected、以及不写(默认)时的区别
private和protected不能修饰类
19. this 关键字有什么作⽤
用于表示指向自身的一个指针,可以调用自身的方法
用于区分成员变量和局部变量
20. 抽象类(abstract class)和接⼜(interface)有什么区别
21. 成员变量与局部变量的区别有哪些
成:定义在类中,存储在堆中(static和final除外),可以被修饰符修饰,随对象的创建而存在,有默认值
局:定义在方法中,基本(栈中)引用(也是栈中存放地址),不可被修饰符修饰,随方法的调用创建,无默认值
22. 静态变量和实例变量的区别?静态⽅法、实例⽅法呢
1)静态变量存储在方法区中,方法区的位置参考这篇文章,静态变量属于类,多个实例只有一个副本。实例变量有多个副本存储在堆
2)静态方法用Class.调用, 实例方法用实例.
23. final 关键字有什么作⽤
。。。
24. final、finally、finalize
finalize() 会在垃圾回收器回收对象之前被调用,用于允许开发者清理对象所持有的非 Java 堆内存资源
每个对象的 finalize() 方法最多被调用一次
25. ==和 equals 的区别
。。。
26. .hashCode 与 equals
为什么重写 equals 时必须重写 hashCode ⽅法?
hashcode默认是基于地址生成的,重写hashcode让他基于对象内容生成。
关系是:hashcode相同不一定equals相同(hash碰撞),equals相同hashcode一定需要相同
如果hashmap中两个对象AB的key相同,但是没有重写hashcode就会导致hashmap中存储相同key的对象,因为hashcode不同
总结
- 保证两个相等的对象具有相同的哈希码
- 不重写
hashCode()会导致哈希表无法正确存储和查找对象
27. Java 是值传递,还是引⽤传递
值
28. 深拷贝和浅拷贝
29. Java创建对象有哪些方式
new
clone
序列化
反射
String
30. String是 Java 基本数据类型吗?可以被继承吗
。。。
31. String 和 StringBuilder、StringBuffer
string:每次对string的修改都会new一个新的string
buffer:提供了对string类型修改的方法,线程安全
builder:线程不安全,性能高
32. String str1 = new String("abc")和 String str2 = "abc"和 区别
1)创建了两个对象
都会去字符串常量池z
33. String不是不可变类吗?字符串拼接是如何实现的?
JDK8之后使用+拼接其实是利用了stringbuilder的append方法
所以+和stringbuilder效率一样
不能在循环中使用+因为会生成多个builder对象
34. intern ⽅法有什么作⽤
将string对象放到串池中,如果已存在则返回原来的引用
Integer
35. Integer a= 127 Integer b = 127 Integer c= 128 Integer d=128相等吗
integer缓存范围 -128~127
36. String 怎么转成 Integer 的 原理
利用ascll
Object
37. Object类公用的方法
异常
38. Java 中异常处理体系
39. 异常的处理⽅式
40. 三道经典异常处理代码题
I/O
41. Java中 IO 流分为⼏种
inputstream:file、bytearray、buffered、Object...
outputstream:。。。
reader:file、chararray、buffered、inputstreamReader
writer:。。。
42. 既然有了字节流,为什么还要有字符流
自动处理字符编码问题
43. BIO、NIO、AIO
序列化
44. 什么是序列化?什么是反序列化
序列化:java对象 --> 二进制流
反:二进制流 --> java对象
serialVersionUID 又有什么⽤:标识一个对象有没有被修改,自定义防止修改结构之后无法反序列化(编译器会自动生成)
哪些不会被序列化:transient、static(属于类不能被实例对象序列化)、父类没有实现Serializable接口的字段
45. 常见的序列化方式
实现Serializable接口利用ObjectoutputStream.writeObject()
jackson:JSON.xxx()
泛型
46. Java 泛型了解么?什么是类型擦除?介绍⼀下常⽤的通配符
编译时期的检测机制,其实都是object类型
注解
47. 说⼀下你对注解的理解
一种标记,没了
反射
48. 什么是反射?应⽤?原理
。。。
JDK1.8新特性
49. JDK1.8 都有哪些新特性
接口默认方法default
lambda ()-> {}
stream
optional