文章目录
3。设计模式
4。垃圾回收
5。抽象类与接口的区别
6.什么情况下会触发类的初始化
7.谈谈你对解析与分派的认识
8 如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下需要⼀个⾃定义的类加载器吗?
9.关于集合中一些常考的重点知识点总结
1.Java里面有哪几种基础数据类型,2.Char为何是两个字节,3.Object有哪些方法,4.final修饰变量,函数,类的作用,5.ArrayList的父类有哪些,6.为什么覆盖equal的时候必须覆盖hashcode,7.反射应用场景,优缺点,8.自定义线程池的参数以及意义,9.当线程池不断接受新任务,活跃线程数怎么变化,10.线程池的四种拒绝策略,11.同步与异步,阻塞与非阻塞,12.BIO,NIO,AIO的区别,13.加入要处理100个连接,用BIO和NIO分别需要多少个线程,13.synchronized的原理,偏向锁,轻量级锁,重量级锁,sleep和wait的区别,线程状态有哪些,线程之间通信,14.ReentrantLock的原理,和synchronized的区别,15.AtomicInteger的原理,16.volatile能不能保证线程安全,17.线程安全的单例模式,18.HashMap,HashTable,ConcurrentHashMap的区别,19.jdk1.8对HashMap做了哪些改动,20.JVM内存模型,GC算法,CMS有几次stop the world,21.新生代gc几次存活之后才能进去老年代,22.频繁GC的可能原因,23.线上OOM,日志十几个G,怎么快速定位,24.事务的原理,事务的特性,事务的传播行为,事务的隔离级别,25.分布式事务,二阶段提交,三阶段提交,tcc能不能保证100%一致性,26.CAP,BASE理论,最终一致性的概念,27.A和B用户在不同的节点,用最终一致性设计转账功能,28.判断集群保证了CAP里面的哪些要素,MySql主备集群,MySql范围分区集群,HBase,Redis-Cluster,Redis哨兵集群,Zookeeper集群,Kafka集群,29.一致性哈希节点分布不均匀怎么办,30.MySql分库分表策论:范围分库,取模,一致性哈希的优缺点,31.MyCat和Sharding-JDBC的区别,优缺点,32.索引原理,索引失效的原因,ABC联合索引实际建了几个索引,MYASIAM和INNODB的区别,33.什么情况下锁行,什么情况下锁表,MySql乐观锁,排它锁,间隙锁,34.Select for update分别在主键,唯一索引,分索引列
transient 关键字作用
final 关键字作用
封装的作用
·隐藏实现细节,提供公共的访问方式
·提高安全性,防止数据被乱改
HashMap,HashTable,ConcurrentHashMap
1.HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。
2.哈希值的处理和映射方式不同。
Hashtable做法如下:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap做法如下:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。HashMap默认的初始化大小为16,之后每次扩充为原来的2倍。
3.HashMap不是线程安全的,Hashtable是线程安全的。
Hashtable的做法是:公开的方法比如get都使用了synchronized描述符。而遍历视图比如keySet都使用了Collections.synchronizedXXX进行了同步包装。
Hashtable 本身比较低效,因为它的实现基本就是将 put、get、size 等各种方法加上“synchronized”。
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
║ Property ║ HashMap ║ Hashtable ║ ConcurrentHashMap ║
╠═══════════════╬═══════════════════╬═══════════════════╩═════════════════════╣
║ Null ║ allowed ║ not allowed ║
║ values/keys ║ ║ ║
╠═══════════════╬═══════════════════╬═════════════════════════════════════════╣
║Is thread-safe ║ no ║ yes ║
╠═══════════════╬═══════════════════╬═══════════════════╦═════════════════════╣
║ Lock ║ not ║ locks the whole ║ locks the portion ║
║ mechanism ║ applicable ║ map ║ ║
╠═══════════════╬═══════════════════╩═══════════════════╬═════════════════════╣
║ Iterator ║ fail-fast ║ weakly consistent ║
╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝
参考:
HashMap不是线程安全的示例
多线程的同时put可能导致元素的丢失
HashMap常见面试题
HashMap的底层数据结构?
HashMap的存取原理?
Java7和Java8的区别?
为啥会线程不安全?
有什么线程安全的类代替么?
默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?
HashMap的扩容方式?负载因子是多少?为什是这么多?
HashMap的主要参数都有哪些?
HashMap是怎么处理hash碰撞的?
hash的计算规则?
String intern函数
intern函数的意义:如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回。
根据注释:s.intern() == t.intern()的结果为true当且仅当s.equals(t)的结果为true。
有几个注意事项:
1.所有的字符串常量的字符串都在字符串常量池中。
2.intern函数的意义是如果你new String,那么对象会被放在堆中,并且是新的对象。如果你知道会相同的字符串会用到多次,那么可以使用intern函数,使其进入字符串常量池,减少空间的开销。
3.字符串常量池在java 7后就存在堆中。在JDK 7中,不再将永久字符串分配给Java堆的永久代,而是分配给Java堆的主要部分(称为年轻代和旧代) 。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。
4.字符串如何加入字符串常量池,在Java 7 以后,new的对象加入的都是引用。
public static void main(String[] args) {
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2 == str1); //true
String s4 = new String("1");
s4.intern();
String s5 = "1";
System.out.println(s4 == s5); //false
String s = new StringBuilder("aa").append("bb").toString();
String s2 = new StringBuilder("cc").toString();
System.out.println(s.intern() == s); //true
System.out.println(s2.intern() == s2); //false
}
参考:
- What is Java String interning? - Stack Overflow
- Java String intern function result problem - Stack Overflow
- 深入理解String.intern - 后端 - 掘金
- 深入解析String#intern - 美团技术博客
StringBuffer 与StringBuilder 的区别
StringBuffer 是线程安全的, StringBuilder 不是.
java - Difference between StringBuilder and StringBuffer
StringBuffer 的线程安全是靠在每个函数前加上synchronized关键字实现。
StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。
2.HashMap是线程不安全的、用HashMap来做缓存的话可能导致内存泄露
5。抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象方法),因为存在抽象方法,所以该类必须是抽象类。但是接口要求只能包含抽象方法。实现 抽象类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。抽象方法可以有public、protected和default这些修饰符 。接口方法默认修饰符是public。你不可以使用其它修饰符。
6.(1)、遇到 new, getstatic, putstatic, invokestatic 这4条字节码指令。
(2)、使用 java.lang.reflect 包的方法对类进行反射调用。
(3)、初始化一个类的时候,如果发现其父类还没有进行过初始化,则先初始化其父类(注意:
如果是接口的话,则不要求初始化父类)。
(4)、当虚拟机启动时,用户需要指定一个要执行的主类(包含 main()方法的那个类),虚拟机会先初始化这个主类。
(5)、当使用JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getstatic, REF_putstatic, REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则先触发其初始化。
外加几种不会初始化的例子:
(1)、同类子类引用父类的静态字段,不会导致子类初始化。至于是否会触发子类的加载和验证,则取决于虚拟机的具体实现。
(2)、通过数组定义来引用类,也不会触发类的初始化。例如下面这个语句:
1Animal[] a = new Animao[10];
并不会触发 Animal 类的初始化。
(3)、引用一个类的常量也不会触发初始化。
7.1.方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可变的,即“编译时可知,运行不可以变”,这类目标的方法的调用称之为解析。
Java 语言中符合“编译器可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类。
2.解析调用一定是个静态的过程,在编译期就完全确定,在类加载的解析阶段就将涉及的符号引用全部转变为可以确定的直接引用,不会延迟到运行期再去完成。而分派(Dispatch)调用则可能是静态的也可能是动态的。于是分派方式就有静态分派和动态分派。
8 可以把自己自定义的类加载器继承 ClassLoader,然后重写 findClass() 方法,把自己的类加载逻辑写到 findClass() 方法中去。
使用类加载器的场景:
加载特定路径的 class 文件
热部署加载 class 文件
从网络中加载一个加密的 class 文件
9.参考文章:关于集合中一些常考的重点知识点总结
参考文章:

本文详细探讨了Java中的关键概念,包括transient和final关键字的作用、封装的重要性、HashMap与其他映射类的区别及其实现细节、String intern函数的功能、StringBuffer与StringBuilder的不同之处等。此外,还讨论了设计模式、垃圾回收机制、抽象类与接口的区别等多个主题。
1万+

被折叠的 条评论
为什么被折叠?



