1. 面向对象的三大特征:封装、继承、多态。
2. java基本数据类型:byte、short、int、long、float、double、boolean、char。
字节数:1 2 4 8 4 8 1 2
3. jdk:java核心,包含java运行环境jre、java工具、java基本类库。
jre:环境集合,包含虚拟机、核心类库。
jvm:实现跨平台运行的核心。
4. 重载和重写
重载:同一类中,名字相同,参数类型、个数、顺序不同(单个不同就行)
重写:子类继承父类,名字、参数 相同,返回值和抛出异常类小于等于父类,访问修饰符大于父类。
5. == 和 equals 区别
在java中,对于基本数据类型 == 比较的是值,对于引用数据类型 == 比较的是地址
qeuals 在默认情况比较的是地址,但是String、Integer、Date等重写了equals方法,比较的是值。
字符串属于引用数据类型。
6. String、StringBuffer、StringBuilder的区别
String使用final关键字修饰属于字符串常量,是线程安全的。
StringBuffer、StringBuilder继承AbstractStringBuilder有很多方法 apend、insert、indexof等
StringBuffer对方法上锁,所以是线程安全的,StringBuilder是线程不安全的。
7. 接口和抽象类的区别:
抽象类 使用 extends继承,可以有构造函数、main方法,只能继承一个抽象类,接口implements实现,可以实现多个。
8. string 常用的方法:
indexOf、charAt、replace、trim、split、length、getBytes、equals...
9. 单例模式:
一个类在多线程的环境下,只被创建一次,有 饿汉式(线程安全,直接初始化)、懒汉式(线程不安全,延迟初始化)、双检锁(线程安全、延迟初始化)
10. 反射:
在程序运行时,可以动态获取到:类的所有信息、调用对象的任意方法。
获取class对象的三种方法:getClass() 、 .class、 forName("类的全路径")
11. jdk1.8 新特性
lambda表达式允许把函数作为一个方法的参数
允许直接引用已有java类或者对象的方法或构造方法
有且有一个类的抽象方法叫做函数式接口
接口允许定义默认方法和静态方法
Stream流
日期、时间类的改进
optional类 : null容器对象
内置 base64 解码和编码
12. java异常
throwable 为顶级父类,下面有 Error:jvm无法预期的错误和Exception:可捕获的异常
Exception又分为:RuntimeException:NullPointerException、IndexOutOfBoundsException等不捕获或者抛出可以通过编译阶段 和非运行时异常 IOException、SQLException 不处理无法通过编译。
13. BIO、NIO、AIO
BIO为同步阻塞式IO,传统IO,简单,并发低。NIO为同步非阻塞IO,通过Channel实现多路复用。AIO为异步非阻塞IO,基于事件和回调机制。
14. Theadlocal的原理
Theadlocal为共享变量创建一个副本,每个线程访问自己内部的变量,保证了线程的安全,实际上TheadLocal无法存储值,他借助静态内部类TheadLocalMap进行存储,theadlocal本身为key,共享变量为value。是弱引用,在gc时可能被回收,造成内存泄露,所以要调用remove方法。
15. 同步锁、死锁、乐观锁、悲观锁
同步锁:同一时间只允许一个线程访问共享变量。 synchronized 可以获取一个对象的同步锁
死锁:多个线程阻塞,需要某个阻塞内释放的资源
乐观锁:很乐观,认为别人不会改自己要修改的数据,但是在自己修改后会使用版本号机制和cas算法进行判断,如果被修改则返回异常信息。
悲观锁:认为别人总会修改,所以拿数据会上一把锁不让别人修改。
16. synchronized 底层实现原理
保证同一时刻内只有一个方法可以进入临界区。
java中每个对象都可以作为锁
17. synchronized 和 volatile 的区别
volatile使用在变量级别,只能保证可见性不能保证原子性,不会造成线程阻塞、不会被编译器优化。
synchronized 使用在 变量、方法、类,保证可见性、原子性,会造成阻塞,可能被优化。
18. synchronized和lock区别
synchronized 是java 的关键字,无法判断获取锁的状态,会自动释放锁,可重入,不可中断、非公平
lock是java类,可以判断是否获取到锁,需要unlock手动释放锁,可重入、可判断、公平锁。
19. 二分查找: 前提有序 , 中间开始
20. 排序:
冒泡: 比较相邻的两个元素,大的放后面,重复运行(while、或者 双重for)
选择排序:先把最小的放前面,再把最小的放第二.....
插入排序:比前面大,不动,比前面小,交换位置,继续比较,直到不动。
快速排序:选最右基准点,大的放右边,小的放左边,排完将基准点放中间,然后两边重新开始,直到无法进行(l = h)。
21. hashMap 1.7为数组+链表 1.8:数组+链表(转化红黑树)
链表转化红黑树的条件为 链表长度>8,数组容量≥64,因为链表过长会影响性能。
一开始不转化的原因是:短链表性能并不低且占内存少,如果hash值足够均匀,链表很难>8,数化是为了防止dos攻击。
退化:扩容拆分,树元素<=6,和 remove前,跟 的 左、右、 左左 节点不在。
put: 1.7 头插,扩容需要大于阈值且根节点没有空位, 1.8 尾插。
索引计算:二次哈希。
多线程操作问题: 1.7 扩容死连、数据错乱, 1.8数据错乱。
key可以为null,但是必须实现hashcode和equals方法
22. 集合长度可变,存储对象的类型可以不一致。数组长度固定,只能存储一种类型。
23. list和set是存储单列数据的集合,map是存储双列数据的集合
list有序,值可以重复,set 无序,不可重复,map无序,键不可以重复,值可以。
24. hashmap 和 hashtable 和 concurrentHashMap的区别
hashMap 非线程安全,key可以为null , 另外两个线程安全,不可以为null
hashtable Synchronized 保证安全,ConcurrentHashMap 1.8 之前 segment分段锁,1.8之后 cas+cynchronized
.....