1、Java 虚拟机中的内存模型**
Java虚拟机有哪几块内存空间
- 栈内存:方法运行时所进入的内存,里面还可以存储程序的局部变量。 栈内存的特点:先进后出
- 堆内存:new 出来的对象 堆内存中的数据都会有默认的初始化值
- 方法区:字节码加载时所进入的内存 静态区和非静态区 .class 文件加载时进入的内存
- 本地方法区:主要调用操作系统相关资源 (native 修饰的方法)
- 寄存器:交CPU进行使用
2、Java中异常处理机制的简单原理和应用
- 什么是异常?
- 异常指的就是程序不正常,简单的就是程序所发生的的错误.
- 异常的结构体系&分类:
- 分类:
- 编译时异常:编译期间,编译器检测到某段代码可能会发生某些问题需要程序员提前给代码做出错误的解决方案,否则编译是不能通过的
- 运行时异常:编译通过,运行时出现的错误
- 分类:
体系结构:
Throwable
error:严重性错误
Exception: !RuntimeException 和 RuntimeException
- 异常产生的原理:
- Java对异常默认处理方式是将问题抛出给上一级,如果出现问题,异常类会创建一个对象,将对象抛出给上一级,method->main>jvm>将异常出现的位置和错误的原因打印在控制台
异常产生的原理:
异常处理的方式:
问题可以自己处理掉:try /catch
问题自己处理不掉的:throws 自己不能解决 用throw,将异常抛给调用者,使用throw 必须使用throws 进行声明 告知调用者此方法存在异常
细节: 如果抛出的是RuntimeException ,则方法上无需throws声明
3、创建线程的四种方式
启动线程的唯一方法Thread的start方法
1、继承Thread类:优点:代码简单 缺点:该类无法继承其他类
2、实现Runnable接口: 优点:可以继承其他类 缺点:代码复杂
3、实现Callable接口: 和Runnable接口相似 Callable 中的call()方法有返回值 Runnable 中的run()方法没有返回值。
4、线程池方式:实现自动化装配、易于管理、循环利用资源
5、Lock 接口比synchronized 块的优势是什么
1、能够显示的获取和释放锁,锁的运用更灵活。
2、可以方便的实现公平锁
4、Java的垃圾回收机制
1、什么样的对象会被当做垃圾回收?
当一个对象的引用(地址)没有变量去记录的时候,该对象就会成为垃圾对象,并在垃圾回收器空闲的时候进行清扫。
2、如何校验对象是否被回收?
可以重写Object 类中的finalize方法,此方法是在垃圾回收器执行的时候,被回收器自动调用
3、怎样通知垃圾回收器回收对象?
可以调用System 的静态方法 gc()方法。
问题扩展
1、如何判断那些对象需要回收?
1、引用计数算法(Java中不是使用此方法)
2、跟搜索方法
5、HashCode() 和 equals()的区别
1、HashCode() 和equals()都是Objec类中的方法
没重写方法:
HasCode(): 属于本地方法,返回的是对象的地址值
equals(): 比较的是两个对象的地址值是否相同
重写此方法:
HashCode(): 返回的是根据对象的成员变量计算出一个整数
equals(): 比较的是两个对成员信息是否相同
2、类中重写HashCode() equals() 比较两个对象是否相等
1、两个对象是通过equals() 比较是相等,那么HashCode()肯定相等,也就是equals()绝对可靠
2、两个对象通过HashCode()比较相等,但是equals()作比较也不一定相等,HashCode()并不绝对可靠。
3、在HashSet 集合中,通过hashCode() 和 equals(),保证元素的唯一性
HashSet 保证元素的唯一的原理?
首先先比较对象的哈希值是否相同,如果哈希值不同就直接添加,如果相同,继续执行equals()进行比较,如果返回的是true, 说明元素重复,不添加,返回的是false,说明元素不重复,就添加。
6、String StringBuilder,StringBUffer 的区别
1、String 和StringBuilder 的本质区别是?
String是一个不可改变的字符序列
StringBuilder是一个可以改变的字符序列
2、常见字符拼接推荐使用StringBuilder 来拼接字符串,因为拼接的效率高
3、String 拼接效率低的原因是什么?
因为字符串在拼接的时候,每一次都会产生一个新的字符串
4、StringBuffer 和StringBuilder 的区别是什么?
StringBuilder 和 StringBuffer 的功能是完全(同步)一样的
不同点:StringBuffer 是线程安全的 ,StringBuilder 是线程不安全(不同步)的
StringBuilder 的效率比StringBuffer 的效率高
7、Collection和 Collections 的区别是什么?
Collection是集合接口,它包含了操作集合的基本接口
Collections 是工具类 包含很多静态方法,不能被实例化
8、List、Set、Map 之间的区别是什么?
三者的区别可以分为两个方面 是否有序,是否允许元素重复:
List 元素有序 允许重复
Set HashSet 元素无序 不允许有重复 TreeSet(用二叉树排序) 元素有序 不允许有重复
Map HashMap 元素无序 Key值必须唯一 value 可以有重复
TreeMap(用二叉树排序) 元素有序 key 值必须唯一 value 可以有重复
9、HashMap 和HashTable 的区别
1、存储方面: HashMap 允许value的值为null 而HashTable 不允许
2、线程安全 : HashMap 线程不安全 HashTable 线程不安全
3、推荐使用: HashTable 不建议使用 单线程用HashMap 多线程使用ConcurrentHashMap
2、线程安全: HashMap 线程不安全 HashTable
10、普通类和抽象类的区别
1、普通类不能有抽象方法,抽象类可以有抽象方法方法
2、抽象类不能直接实例化,普通类可以直接实例化
11、抽象类和接口的区别
1、实现方式: 抽象类用 extend来继承 , 接口使用 implement 来实现、
2、构造函数: 抽象类可以有构造函数 接口不能有构造函数
3、实现数量:一个类实现多个接口 但是只能继承一个抽象类
4、访问修饰符: 接口中方法默认使用public 抽象类中可以使用任意的修饰符
12、 ArrayList 和LinkedList 的区别
1、数据结构:ArrayList 使用的是动态数组实现 LinkedList 底层使用双向链表实现的
2、 随机访问效率: 在随机查询的时候LinkedList 的效率比ArrayList 高
3、增加和删除元素: 除了首尾添加元素 LinkedList 的效率高 删除元素也是一样的
13、线程的状态?
1、New 尚未启动、
2、 runnable 正在运行中、
3、 blocked 阻塞的的状态
4、waiting 永久的等待状态
5、timed_waiting 等待指定时间被唤醒的状态
6、terminated 执行完成
14、实现动态代理的方式?
JDK原生动态代理 和Cglib 动态代理 JDK 代理是实现接口实现的 cglib 基于当前的子类实现的