java学习-关于字符串String
有必要总结记录一下java的学习,否则,永远只是记忆碎片化和always google(费时)
刚好,小伙伴给了一份自己做的review,在学习的过程中,update一下自己的见解和学习内容;
关于String:
1 package string_keywords; 2 /** 3 * 参考url: http://developer.51cto.com/art/201106/266454.htm 4 * 5 * 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 6 * 7 * 当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量; 8 * 多个常量连接;如果是像代码里s7的方式,字符串保存在堆? 9 * 10 * 当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用; 11 * 12 * http://www.importnew.com/10756.html 13 * 14 * */ 15 public class Demo1 { 16 public static void main(String[] args) { 17 String s1 = "abc"; 18 String s2 = "bcd"; 19 String s3 = s1; //引用赋值,相当于s3 也指向了“abc”这个地址 20 String s4 = "abc"; 21 String s5 = new String("abc"); 22 String s6 = "ab"+"c"; 23 String s7 = new String("ab")+"c"; 24 String s10 = "c"; 25 String s11 = "ab"+s10; 26 s1 += s2;//字符串的连接时,实际上是新开辟了一个字符串 27 System.out.println(s1); 28 System.out.println(s3); 29 System.out.println(s1 == s3); 30 System.out.println("s4==s3:"+(s4==s3)); //字符串常量池,s4 = "abc"实际上是指向了已有的abc的地址,因此用==判断时,指向一致,所以返回true 31 System.out.println("s5==s3:"+ (s5==s3)); // new String 的方式不同于直接赋值(常量池),而是新开辟了一个空间,因此判断字符串是否相等一般采用equals方法 32 System.out.println("s6==s3:"+(s6==s3)); //常量连接常量,还在常量池 33 System.out.println("s7==s3:"+(s7==s3)); //new的方式,不再是常量 34 String s8 = s4.intern(); 35 String s9 = s5.intern(); 36 System.out.println("s8==s3:"+(s8==s3)); 37 System.out.println("s8==s4:"+(s8==s4));//s4本来就是指向常量池的,返回的intern地址当然也就是本身了 38 System.out.println("s9==s3:"+(s9==s3));// intern方法会去常量池查找是否存在该字符串常量,有则返回其地址,没有就加入常量池并返回地址 39 System.out.println("s11==s3:"+(s11==s3)); //在运行时通过连接计算出的字符串是新创建的 40 /* 41 * 疑问: String s = "a" +"bc"; 42 * 我们知道a和bc是常量,abc存在于常量池,那么a和bc是否也存在于常量池? 43 * 如何验证呢? 44 * 45 * 内存跟常量池是什么关系? 46 * 为什么上述方式一般不推荐,而推荐使用StringBuffer,是因为扩大了常量池么? 47 * 48 * */ 49 } 50 }
intern()补充:
String s8 = s4.intern(); String s9 = s5.intern(); System.out.println("s8==s3:"+(s8==s3));//true System.out.println("s9==s3:"+(s9==s3));//true
目前存在的疑问是:
1. 内存跟常量池的更深入理解
2. intern()方法是否对常量池做的是一种动态的update?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律