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

1653385950(1).png
Arraylist是基于索引的数据接口,底层是数组。可以以O(1) 时间复杂度进行随机访问。
| | —- | |

2.2 linkedlist

1653385712(1).png
linkedlist是以元素列表的形式存储它的数据,时间复杂度是O(n), 插入删除数据速度很快; |

3. 高并发中的集合中有哪些问题?

难点:集合+高并发
image.png
image.png
第一代线程安全的集合类:
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 接口默认方法

  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表达式

image.png | |

4.3 函数式接口

image.png |

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());



1653391647(1).png
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对象是在堆上还是在方法区?

|