基础知识
总结一下JAVA面试中常被问到的一些基础问题,有的希望读者重点关注,并熟读源码。
另外对于加的知识点,怕误导大家,暂时没有详细总结。希望大家熟读源码自己理解总结。谢谢!
String,StringBuffer,StringBuilder
StringBuffer 线程安全,速度较慢
StringBuilder 线程不安全,速度快
String final类,不可以继承
Static字符串常量的特点
1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
2. 用于全局变量,主要作用是限制此全局变量被其他的文件调用. 3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象
Static 的作用
从属于类 不属于对象
1. static变量 全局共享 对象之间共享 方便访问
2. static方法
3. static代码块
Final 关键字
1. 当用final修饰一个类时,表明这个类不能被继承
2. 如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
3. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
Object有哪些基本方法
getClass()
toString()
equals()
hashCode()
wait()
notify()
notifyAll()
finalize()
clone()
equals 和 hashcode
首先equals与hashcode间的关系是这样的:
1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2. 如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
线程池:
1. Executor
线程池顶级接口
常用方法:execute(Runnable)
作用是:启动线程任务
2. ExecutorService
Executor接口的子接口
常见方法:execute(Runnable)submit(Callable) submit(Runnable)
线程池状态:Running ShuttingDown Terminated
3. Executors
为Executor 提供工具方法,可快速提供若干种线程池。
线程池是一个进程的重量级资源。默认生命周期和JVM一致,当开启线程池后,直到JVM关闭为止,如果调用shutdown方法,那么线程池执行所有任务后,自动关闭
FixedThreadPool
CachedThreadPool (Integer.MAX_VALUE 空闲时长默认60s自动销毁)
ScheduledThreadPool
SingleThreadPool
4. ThreadPoolExecutor
核心线程
最大线程
任务队列 都是阻塞队列泛型必须是Runnable
如何实现控制5个线程并发
1. 利用Doug lee 封装的Semaphore类 acquire 和 release
2. 线程池: ThreadPoolExecutor
对象的可及性:
强引用:永远不会被GC回收
弱引用:当GC发现这个对象就被回收
软引用:当系统内存不足的时候,可以被GC回收
虚引用:检测对象是否被GC回收
Java内存模型:
方法区:静态 常量
堆 对象的实例
Java栈 对象的引用
本地方法栈
PC寄存器
分为两个部分:主内存 存放java实例对象和变量;工作内存:本地变量
操作:
Lock
Unlock
Read
Load
Use
Assign
Store
Write
特征:
原子性,有序性,可见性
类加载器:将类的二进制文件读取到内存当中,并放到运行时的数据区在堆去创建class对象
生命周期:加载-> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
常见的类加载器
启动类加载器 C语言实现 核心的lib目录下面的库
扩展类加载器 Java实现 ext目录的库
应用程序加载器
双亲委托模型
Java内存溢出:申请内存超出了可用内存
1. JVM栈溢出 存放 基本数据类型和基本引用
本地方法栈溢出:存放JNI(native的关键字)
方法区溢出:存放静态 和 类的信息 常量池
堆溢出:存放对象的实例
运行时常量池溢出 string
直接内存溢出
Java回收机制
1. 为什么有垃圾回收
方便管理内存
2. 回收哪些内存
可达性分析算法:没有被GC root引用的 会被回收
根对象:
A) 虚拟机引用的对象
B) 方法区的类静态属性引用的对象
C) 方法区中常量引用的对象
D)本地方法栈中JNI引用的对象
引用计数法
3. 垃圾回收算法
标记清除法
标记整理法 没有内存碎片
分代
年轻代: Minor GC 新生代 频率高
Eden
老年代 Major GC 老年代 频率低
常见的垃圾回收器
Serial 单线程GC
Parallel 多线程GC
GMS GC
G1 GC:jdk7引入多线程 高并发 低暂停 取代GMS GC
String 常量池的理解
New String(“xx”).intern() 可以转换到字符串常量池的引用
Java 单例
1. 懒汉式
2. 饿汉式
3. 双重校验
4. 枚举
5. 静态内部类
Build的作用 减少构造器
Volatile 保证变量的可见性
栈和堆的区别
存储:存储内不同 栈存储变量和引用 堆存储实例对象
速度:栈 速度快 堆 存取速度慢 因为运行时动态分配内存
线程:每个线程都有一个栈 所有线程共享一个堆
垃圾回收:栈 比较频繁
Equals 和 == 区别
== 引用地址比较
Eques值比较
JDK、JRE与JVM的区别
JDK java开发工具包
JRE java运行时的环境 包含java虚拟机,java基础类库
JVM java虚拟机
泛型:指定类型
注意事项:
静态方法方法中不能使用泛型
不能在catch语句中使用泛型
从泛型类派生的子类,泛型类需具体化
Java多态
编译时多态:表现形式重载
运行时多态:表现方法重写 与继承相关
集合
HasMap(熟读源码),HashTable之间的区别。
HashMap:首先它是线程不安全,底层是数组+链表结构(1.8之后是从尾部插入链表,链表大于8之后会转变为红黑树),负载因子是0.75
HashTable:线程安全的。
多线程
线程同步的几种方式,以及线程间通信