1.双亲委派机制是什么?
当类加载器收到一个类加载请求的时候,类加载器会先将请求委派给其父类加载器,每个类加载器都是如此,只有父类加载器没有在搜索范围内找到指定类文件,子类加载器才会尝试加载
2.双亲委派机制的作用
1.放置加载同一个类,通过询问父类加载器是否加载过此类,如果加载过,就不用重复加载,保证了数据的安全。
2.保证核心类class不被篡改,比如定义一个类String,从上到下加载,只会使用自己核心内库中的String,而不会使用自定义的String。
3.什么是反射?
反射是运行时获取一个累的成员方法和成员变量的信息,通过获取的信息创建对象,调用方法的机制。
4.线程的状态
NEW 线程的新建状态,还没有被start启动的线程状态
RUNNABLE 调用start方法后,线程会进入就绪状态,登待cpu调度。
BLOCKED 等待获取锁对象的状态,得到锁对象后转为RUNNABLE状态
WAITING 线程等待其他线程进行时的状态
TIMED_WAITING 线程需要等待一定时间的状态
TEAMINATED 线程结束的状态
5.线程池的好处
线程池启动时会创造大量空闲线程存储于线程池中,当我们提交任务时,线程池会分配空闲线程执行该任务,当任务结束,线程不会死亡,会再次回到线程池中成为空闲线程,等待下一个任务执行,这样就做到了对线程对象的重复使用。
6.什么是守护线程?
守护线程是为了守护其他线程执行而存在的,为了保证其他线程可以拥有良好的运行环境,当被守护的线程结束消失,守护线程也会在不久消失。
7.解决多线程安全问题的三种方式
1.同步方法
2.同步代码块
3.锁接口
8.什么是对象序列化?什么是对象反序列化?
对象序列化就是把java对象内存存储在硬盘之中,或者将网络传输的瞬时态数据变为持久态数据,序列化就是一种对象持久化的手段。
反序列化就是把字节序列从文件中读取出来,重构对象,将持久态数据转换为瞬时态数据。
9.什么是线程?什么是进程?
进程是一个运行程序
线程是进程的一个执行单元,依赖于进程,一个进程可以有一个或者多个线程。
10.什么是并行?什么是并发?
并行是指多个事件同时发生,同时处理,执行者不止一个。
并发是指多个事件在同一个时间内交替发生,处理,执行者只有一个
11.java实现多线程的三种方式
1.继承Thread类,重写run方法
2.实现Runnable接口,
3.实现Callable接口
12.字符缓冲流高效的原理
当字符输入缓冲流读取字符的时候,首先会在内存中创建一个8192大小的字符数组,从目标文件中一次性读取8192个字符,然后内部的字符输入流在从字符数组中将字符读取到内存中,减少内存与文件的交互次数,提高了效率。
当字符输出缓冲流写字符的时候,首先会在内存中创建一个8192大小的字符数组,从内存中一次写8192个字符,然后内部的字符输出流在从字符数组中将字符写到目标文件中,减少内存与文件的交互次数,提高了效率。
13.转换流作用
1.指定io流的操作的使用编码集
2.完成字节流与字符流之间的转换
14.HashMap和Hashtable的区别
1.出现时机不同
HashMap在jdk 1.2时出现
Hashtable在jdk 1.0时出现
2.线程安全不同
HashMap不安全
Hashtable安全
3.效率不同
HashMap效率高
Hashtable效率低
4.存储数据要求不同
HashMap可以存储Null值和Null键
Hashtable不支持Null数据
5.HashMap和Hashtable具有相同的api。
15.HashMap和HashSet的关系
HashSet集合底层是由HashMap构建的
HashSet集合的数据添加在HashMap集合中
HashSet存储元素唯一原理就是HashMap键值唯一原理相同
16.HashSet元素唯一性原理分析
首先调用HashCode方法,获取元素的的哈希值,判断元素所在索引位置,如果该索引位置吗没有其他元素,就直接插入。如果有,就判断两个元素的哈希值和equals方法是否相同,如果相同,说明元素相同,不插入直接退出,如果不相同
,就判断该结点是否为树节点,如果是,就红黑树直接插入,如果不是就遍历链表插入,判断链表长度是否大于8,没有就链表插入,大于就转为红黑树插入,
然后判断是否满足扩容条件,如果满足扩容条件,判断长度是否大于64,就链表或红黑树存储,如果超过,就树化,转为红黑树存储。
17.栈和队列
栈:先进后出
队列:先进先出
18.数组和链表特点
数组:查询快,增删慢
链表:增删快,查改慢
19.泛型的好处
1.把运行时期的问题提前到了编译期间,避免了向下转型的错误
2.避免了强制类型转换,避免向下转型麻烦操作。
20.集合体系
集合体系包括Collection接口和Map接口
Collection接口包括List单列有序集合接口,和Set单列无序集合接口
List包括ArrayList实现类和LinkedList实现类
Set包括HashSet实现类和TreeSet实现类
Map接口包括HashMap实现类和TreeMap实现类
21.throws和throw的区别
位置不同:
throws在方法上定义,写在参数列表后面
throw写在方法中
作用不同
1.throws声明异常,调用该方法还是可能会出现异常
throw手动抛出异常,只要执行必然抛出异常
2.throws 用来处理异常
throw 用来产生异常对象
22.为什么java对基本类型数据提供包装类
因为java是一门面向对象的语言,基本数据类型不具备面向对象的特性,不能调用方法,没有属性,为了让基本数据类型具有面向对象性,设计了对应的包装类型
23.equals方法和 == 的区别
比较内容不同:
==可以比较任意数据类型
equals比较引用数据类型
比较规则不同
==基本数据类型比较数值,引用数据类型比较地址值
equals方法重写前,比较地址值,重写后不仅比较地址值还比较属性值
24.StringBuilder和StringBuffer区别
1.出现时间不一样
StringBuilder是jdk 1.5出现的
StringBuffer是jdk 1.0出现的
2.线程安全
StringBuilder不安全
StringBuffer安全
3.执行效率
StringBuilder高效
StringBuffer低效
25.多态是什么?
多态是一个事物,对象的多种表现形态。
26.多态的特点
父类类型的引用指向子类对象
接口类型的引用指向实现类对象
27.多态的弊端和好处
弊端:一旦产生多态,就相当于缩小了真实类型对象的访问范围,因为只能访问父类中的内容或者父类与子类都出现的内容,子类独有的内容就访问不到了。
好处:增强了代码的扩展性和复用性
例如:在定义方法的时候,如果参数类型是父亲类型形参,那么实参范围就比较大了,实参可以是父亲类型对象,也可以是子类类型对象。
如果一个返回值类型是父亲类型,那么return既可以返回父亲类型对象,
也可以返回子类类型对象。
28.权限修饰符及其限定范围
public 公开的 没有范围
protected 受保护的 在本包子类、本类、本包其他类、其他包子类可以使用
默认的 在本类、本包子类、本包其他类可以使用
private 只能在本类中使用
29.类与类,类与接口,接口与接口之间的关系
类与类:只支持单继承,多层继承
类与接口:单实现,多实现
接口与接口:单继承 多继承 多层继承
30.重载和重写
重写是子类对父类同名方法的重新实现;
重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关的多个方法之间的关系。
31.静态变量和非静态变量(成员变量)的区别
概念上,所属不同:
非静态变量属于对象
静态变量属于类
内存空间不同,存储位置不同
非静态变量属于对象,存储在堆空间内存中;
静态变量属于类,存储在静态区
存活时间不同,生命周期不同
非静态变量随着对象的生而生,死而死
静态变量随着类的生而生,死而死
访问方式不同
非静态只能用对象名去访问
静态可以用对象访问,也可以用类名访问
32.继承的好处与弊端
好处:提高了代码的维护性
弊端:继承类与类之间的耦合性增强,使得子类在父类变化时不得不跟着变化,削弱了子类的独立性。
33.成员变量和局部变量的区别
定义位置不同
成员变量定义在类中方法外
局部变量定义在方法中
内存位置不同
成员变量存储在堆内存中
局部变量存储在栈内存中
生命周期不同
成员变量随着类的生而生,死而死。
局部变量随着方法的生而生,死而死。
默认值不同
成员变量有默认值,不赋值也可以使用
局部变量没有默认值,不赋值不能使用
34.封装的好处
1.隐藏了事物的实现细节
2.提高了代码的复用性
3.提高了安全性
35.java语言的五个特点
1.开源性
2.面向对象性
3.编译性
4.跨平台性
5.动态性
36.基本数据类型及其大小
基本数据类型四类八种
Byte 1个字节
short 2个字节
int 4个字节
long 8个字节
char 2个字节
float 4个字节
double 8个字节
boolean 不知道
37.Collection和Collections的区别
Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法