1. Java的特征
1.1 封装
封装隐藏了一些内部实现的机制,保护数据隐私;在不影响对外的接口情况下,可以对内部的逻辑进行随便调整;
属性的封装,外界只能通过事先制定的方法访问数据,可以方便增加逻辑控制,限制对属性的不合理操作;
方法的封装:使用者只需调用方法,无需关注实现逻辑,便于使用和修改,增强代码的可维护性。 |
| —- |
|
1.2 继承
是指从已有的类中派生出新的类,在吸收已有的数据的属性和行为后,还可扩展新的能力;
子类继承父类是 is-a 的关系,即子类是一种特殊的父类;使用extends 来继承
向上提取,即提取众多子类的属性和方法形成父类的属性和方法。 父类的private属性和方法不可继承和修改。
|
|
1.3 多态
类之间是继承关系,存在方法的重写,故而可以在父类引用时指向子类对象。 People p = new Student();
多态的三要素: 继承、重写、父类引用指向子类对象。 |
| 这些特征的好处:
1. 封装: 增加了代码的复用性
1. 继承:增加了代码的复用性
1. 多态:增加代码的健壮性、可移植性
|
2. arraylist 和linkedlist的区别
arraylist和linkedlist都实现了list接口,但有不同点: |
---|
2.1 arraylist
Arraylist是基于索引的数据接口,底层是数组。可以以O(1) 时间复杂度进行随机访问。
|
| —- |
|
2.2 linkedlist
linkedlist是以元素列表的形式存储它的数据,时间复杂度是O(n), 插入删除数据速度很快; |
3. 高并发中的集合中有哪些问题?
难点:集合+高并发 |
---|
第一代线程安全的集合类: Vector\hashtable——-》使用synchronized修饰方法 缺点: 效率低 |
第二代线程非安全集合类: arraylist、hashmap—-> 线程不安全,但是性能好,用来替换vector\hashtable 使用arraylist/ hashmap,需要线程安全该怎么办呢? 使用Collections.synchronizedList(list); Collections.synchronizedMap(m) 底层还是使用了synchronized代码块锁,有了稍微的提升。虽然对锁进行了升级,如轻量级锁和重量级锁,但是和第三代集合类相比仍然不够灵活; |
第三代线程安全集合类: 在大量并发情况下如何提高集合的效率和安全? java.util.concurrent.* ConcurrentHashMap copyOnWriteArrayList copyOnWriteArraySet; (注意不是copyOnWriteHashSet*) 底层大都采用Lock锁(1.8的concurrenthashmap不适用lock锁),保证安全的同时,性能也很高。 |
4. JDK1.8新特性有哪些
4.1 接口默认方法
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22435741/1653388935873-e511ebd3-7b58-4aa6-9d51-33a6eb491d08.png#clientId=uc2974d12-94c3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=447&id=u2689c4e8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=447&originWidth=704&originalType=binary&ratio=1&rotation=0&showTitle=false&size=249111&status=done&style=none&taskId=ude6c3967-1554-43c7-af73-d620639033e&title=&width=704) |
4.2 Lambda表达式
4.3 函数式接口
|
5. Java接口和抽象类有哪些区别
5.1 定义
5.2 语法上的区别
5.3 什么时候用接口什么时候用抽象类(语义上)
抽象类: 抽象的概念, 比如动物、植物、事物,在脑子中有具体的概念;
接口: 某些共同事物之间具有的共同特征,eg: flyable 形容词 |
6. 对象在内存中的存储布局
围绕着 Object o = new Object() 的七连问: |
---|
6.1 请解释下,对象的创建过程?(半初始化)
6.2 DCL要不要加volatile问题?(指令重排)—-多线程同步
6.3 对象在内存中的存储布局?(对象与数据的存储不同)
6.4 对象头具体包括些什么?(markword, classpointer)
T t = new T();
System.out.println(ClassLayout.parseInstance(T).toPrintable());
markword包含的内容:
1)锁信息;使用: synchronized(t){} ;
2) hashcode;第二次调用的时候,不是重计算,而是直接在头信息中取出来。 使用: t.hashcode(); 3) GC信息—->可以查看该对象在GC算法中的颜色判断其存储地址。“三色标记” |
|
6.5 对象怎么定位?(直接 间接)
6.6 对象怎么分配?(栈上-线程本地-Eden-Old)
6.7 Object o = new Object() 在内存中占用多少字节?
6.8 为什么hotspot不使用c++对象来代表Java对象?
6.9 Class对象是在堆上还是在方法区?
|