射频片上螺旋电感建模:从等效网络到Momentum仿真的工程实践
2026/10/29 3:31:05
这个标题一看就是冲着面试 + 深入理解去的,那我就按
“源码结构 → 设计思想 → 关键方法 → 易错点 → 面试总结”
帮你把Java String 源码一篇讲透 👇
说明:以下基于JDK 8(JDK 9+ 有压缩字符串差异,我后面会单独点)
publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequencefinal:不可被继承
实现接口:
Serializable(可序列化)Comparable(可比较)CharSequence(字符序列)👉 设计目标:
安全、不可变、可复用、线程安全
privatefinalchar[]value;char数组char占 2 字节(UTF-16)privatefinalbyte[]value;privatefinalbytecoder;LATIN1(1 字节)UTF16(2 字节)源码核心:
privatefinalchar[]value;value是finalStrings="abc";s=s.concat("d");// 新对象✅ 线程安全
✅ 可缓存 hashCode
✅ 适合做 Map 的 key
✅ 字符串常量池可复用
Strings="abc";Strings=newString("abc");"abc"👉一共两个对象
publicbooleanequals(ObjectanObject){if(this==anObject)returntrue;if(anObjectinstanceofString){StringaString=(String)anObject;if(value.length==aString.value.length){for(inti=0;i<value.length;i++){if(value[i]!=aString.value[i]){returnfalse;}}returntrue;}}returnfalse;}👉逐字符比较内容
privateinthash;// 默认 0publicinthashCode(){inth=hash;if(h==0&&value.length>0){for(charc:value){h=31*h+c;}hash=h;}returnh;}Strings="a"+"b";⬇ 编译后
Strings="ab";Strings=a+b;⬇ 实际是
newStringBuilder().append(a).append(b).toString();👉循环拼接字符串要用 StringBuilder
Strings=newString("abc");s.intern();JDK 7+:
如果池中没有:
如果有:
| 类 | 可变 | 线程安全 | 性能 |
|---|---|---|---|
| String | ❌ | ✅ | 低 |
| StringBuilder | ✅ | ❌ | 高 |
| StringBuffer | ✅ | ✅ | 中 |
String 是一个不可变的、基于字符数组实现的类,通过常量池实现复用,hashCode 缓存提升性能,字符串拼接底层依赖 StringBuilder。
如果你愿意,我可以继续给你:
你是准备 Java 面试,还是深入看 JDK 源码?