培训班学习Java第一天
测试题讲解之查缺补漏
选择题
一、标识符

标识符的概念:给类、接口、方法变量取名字的字符序列。
组成:大小写字母、数字、_、$、中文。
注意事项:
不能以数字开头;
字母区分大小写;
不能使用除$和_以外的特殊符号。
不能使用Java关键字
考虑编码问题,尽量不使用中文
二、重载

重载的概念:方法与方法间的关系。
条件:
在同一个类中;
方法名相同;
参数列表的个数或者类型不一致;
与返回值无关
好处:系统会根据传入的参数自动匹配相应的重载方法。减少写多个函数名的重复步骤。
三、数组初始化
分为静态初始化和动态初始化。
静态初始化:数据由程序员给定,数组长度由系统自动分配——String[] name = {"张三","李四","王五"};
动态初始化:数组长度由程序员给定,数据由系统自动分配——String[] names = new String[3];
不同类型的数组内数据初始值:
整数类型---0;2.浮点类型---0.0;字符类型---‘ ’(空格);布尔类型---false;引用类型---null。
四、位运算

位运算:十进制数据转换为二进制数据,再做运算。
&:同位比较,两者为1,结果才为1;
|:同位比较,两者有1,结果就为1;
^:同位比较,两者相同为0,不同为1;
<<:整体向左移动n位,就用n个0补位;
>>:整体向右移动n位,就用n个最高位(符号位)补位;
>>> :整体向右移动n位,就用n个0补位。
(正数右移'>>',高位用0补,负数右移,高位用1补,当负数使用无符号右移'>>>'时,用0进行部位(负数变为了整数))
五、能供switch使用的数据类型:byte、short、int、char、字符串(JDK1.7)、枚举(JDK1.5)。

六、构造方法的概念:与类名相同且没有返回项的方法;作用:创建对象、初始化数据。

七、final

final的含义:被称为最终方法。
final修饰类:类不能被继承;
final修饰方法:方法不能被重写;
final修饰变量:常量。
简答题
1.论述面向对象的三大特征及其使用场景?
封装、继承、多态
封装:一般类的属性都必须封装(私有化属性+get/set),保证了属性的安全性
继承:多个类有共同的属性和方法,就抽取出放在父类中,减少代码的冗余,增加了程序的复杂度和可维护性
多态:编写方法,参数尽可能选择接口或者父类类型,提高了程序的可扩展性
2. 多态的优缺点?
优点:提高了程序的可扩展性,不违反OCP原则
缺点:不能使用子类独有的属性和方法(多态主要作用 :调用子类重写父类的方法)
3. 抽象类和接口的区别?
抽象类:单继承,抽象类中可以有属性、构造方法、成员方法、静态方法、抽象方法
接口:多实现,接口中只能有静态常量、抽象方法、静态方法(JDK1.8)、默认方法(JDK1.8)
4. Java类加载机制的步骤?
含义:JVM会将该类的class文件加载到方法区中的过程
什么时候JVM会将该类的class文件加载到方法区中?
1. 第一次创建该类的对象
2. 第一次调用该类的静态方法
3. 第一次获取该类的class对象 -- Class<?> clazz = Class.forName("com.qf.test01.A");
class文件加载几次?
1次
class文件里的内容有什么?
class文件中包含了该类所有的信息,属性、构造方法、成员方法、静态方法、抽象方法...
class对象的作用是什么?
class对象作为class文件的访问入口
加载步骤:
1. 加载(获取类的全限定名生成字节流,读取到方法区中,并在堆中创建该类的class对象)
2. 连接
2.1验证(验证class文件是否合法 - 是否符合class文件规范、语法/数据、符号引用是否正确)
2.2 准备(类变量开辟空间,给类变量赋系统初始值,但是静态常量直接赋值)
2.3 解析(符号引用,转换为直接引用)
3. 初始化(将代码中的静态值赋值给静态变量)
5. Switch的表达式类型,底层原理?
表达式类型:byte、short、int、char、枚举(JDK1.5)、字符串(JDK1.7)
底层原理:
byte、short自动向上转型成int
char获取对应的Unicode码
枚举获取的是对象编号
字符串获取的hash码+equals
总结:表达式的类型最终都会转换为int,去做识别
6. 内部类分类及区别?
成员内部类:内部类可以调动外部类所有的属性
静态内部类:内部类只能调用外部类的静态属性
接口内部类:相当于静态内部类
局部内部类:方法中声明的类,可以调用外部类的方法中的局部变量,局部变量自动使用final修饰(JDK1.8)
匿名内部类:抽象类子类的对象或接口实现类的对象只使用一次,就使用匿名内部类去替代
7. ArrayList与Vector的区别?
ArrayList:线程不安全,扩容机制(原来的1.5倍)
Vector:线程安全,扩容机制(判断容量增量,如果容量增量为0,原来长度的2倍;如果容量增量不为0,原来长度+容量增量)
8. LinkedList删除元素的过程
1. 判断元素是否为空,如果为空,判断条件使用元素==null,如果不为空,判断条件使用equals,直到找到该元素或者遍历到最后一个元素
2. 加入A、B、C三个节点,删除的是B节点,通过B节点找到A节点,将A节点下一个位置指向C节点,通过B节点找到C节点,将C节点上一个位置指向A节点 -- 断链
9. 什么叫做Hash碰撞
多个元素的hash值一样造成Hash碰撞(将数据存入到HashMap或者ConcurrentHashMap,一般会重写Key元素所属类的hashCode()和equals(),从而降低Hash碰撞,因为hash碰撞会损耗性能,因为HashMap或ConcurrentHashMap的数据结构为一维数组+单向链表,数据直接存在数组中的效率胜过存在单向链表中)
10. JDK1.7 和 1.8下HashMap的区别?
HashMap - JDK1.7:一维数组+单向链表,头插法
HashMap - JDK1.8:一维数组+单向链表+红黑树,尾插法,计算hash值高16位^低16位
JDK1.8的HashMap什么时候做到一维数组+单向链表 和 一维数组 + 红黑树的转换?
一维数组+单向链表 --> 一维数组 + 红黑树:数组长度大于64,链表长度大于8
一维数组 + 红黑树 --> 一维数组+单向链表:红黑树节店小于6
JDK1.8的HashMap数据结构为什么加上了红黑树?
提高了查询效率
11. 论述多线程的生命周期?

12. Java线程安全的几种方式?
1. synchronized
2. lock
15.线程池的运行流程?
1. 核心线程
2. 任务队列
3.普通线程
4. 拒绝策略
16创建自定义线程池的参数有哪些?
核心线程数、最大线程数、任务队列、线程工厂、闲置时间、时间单位、拒绝策略
17.TCP连接机制和断连机制是什么?
三次握手
四次挥手
18. 异常的处理机制是什么?
1. 程序中出现的异常,会创建异常对象交给JVM -- 抛出异常
2. JVM会循环是否有处理异常的代码
2.1 有 - 就将异常对象交给其处理 -- 捕获异常+处理异常
2.2 没有 - 程序就终止运行
19. 什么叫做序列化接口?有什么作用?
Serializable为序列化接口
ObjecOutputStream将对象写入到文件,该对象所属的类必须实现序列化接口,序列化接口作为写入文件的凭证
钝化/序列化:将程序中的对象写入到文件中
活化/反序列化:将文件中的对象读取到程序中
20. 字节流和字符流的区别?
字节流以字节为单位去传输数据
字符流以字符为单位去传输数据,字符流底层由字节流+编译器实现,编译器会根据编码格式去操作数据