【知了堂学习笔记】String的创建过程—第一章
来源:互联网 发布:vue数据绑定原理 编辑:程序博客网 时间:2024/05/21 17:12
第一章
我们知道字符有两种初始化方式:
String s1 = “abc”;
String s2 = new String("def");
这两种有什么区别呢?这时就需要我们看看String的在内存中是怎么存储的了。我们先看下面的图了解其在内存在是怎么存储的:
首先是 String s1 = “abc”;它首先会去常量池去检查是否存在“abc“,如果存在就返回,否则就创建。“abc”的地址给了s1,s1指向了它。而String s2 = new String("def");它会去堆内存中去创建一个new String()对象,然后去常量池检查是否存在"def" 如果存在就返回,否则创建。“def”的地址给了new String(),而new String()自给有一个地址给了s2。这就是字符串的基本存储过程。
接下来我们看看字符串的一个重要特性:字符串是常量,它们的值在创建之后不能更改。
如下面一段代码
public class TestString { public static void main(String[] args) { String s = "abc"; s+="def"; System.out.println(s); }}
根据上面的分析我们可以知道 s 最开始是指向"abc",后面 s+="def"做个一个字符串拼接,而在内存中并没有直接把"def”拼接在“abc”上,而是先开辟了空间存储“def”,最后把abcdef拼接在一起,开辟了第三块空间。通过这个例子我们可以知道不能变的是字符串的值,即“abc”不能改变,而引用是可以改变的。所以最后 s打印出来的值变了,并不是“abc”发生了变化,而是s指向了新的对象“abcdef”。
接下来我们可以通过1个例子看看
public class TestString { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc" String s3 = new String("abc"); System.out.println(s1==s2) System.out.println(s1==s3); System.out.println(s1.equals(s3)); }}
首先我们要知道==和equals的区别,==比较的是地址,而equals默认比较也是地址,而String重写了equals()方法,比较的是值是否相同。根据上面的理解我们画出内存图
根据上图我们知道了 String s1 = "abc";首先会在常量池中创建“abc”,s1指向此对象,而 String s2 = "abc"首先会在常量池中检查发现存在“abc”,所以s2并不会再创建而是直接指向“abc”,而 String s3 = new String("abc");首先会在堆内存new 一个String对象,然后指向常量池中已经存在的“abc” (不会再创建“abc”),但是new String()给s3是自己的地址,并不是“abc”的地址。所以输出结果为true false true
现在抛出一个问题 String s = “abc”和 String s = new String("abc")有什么区别?
答案详情请见下一篇随笔
- 【知了堂学习笔记】String的创建过程—第一章
- 【知了堂学习笔记】分页查询—第一章
- [知了堂学习笔记]_break的用法
- [知了堂学习笔记]_JS的数据类型
- [知了堂学习笔记] jQuery的事件
- [知了堂学习笔记]_jQuery的事件
- 【知了堂学习笔记】jfreechart创建简单的柱状图和饼图
- 【知了堂学习笔记】JFreeChart
- [知了堂学习笔记]_JavaScript
- [知了堂学习笔记]_Java中session的学习
- 【知了堂学习笔记】_Java中cookie的学习
- 【知了堂学习笔记】_Java中ServletContext的学习
- 【知了堂学习笔记】CSS3令人眼前一亮的网页文字效果
- [知了堂学习笔记]_记一次BootStrap的使用
- [知了堂学习笔记]_记一次BootStrap的使用
- 【知了堂学习笔记】JfreeChart制作一些简单的报表
- 【知了堂学习笔记】JSTL的简单介绍
- [知了堂学习笔记]_记一次BootStrap的使用
- 计算机网络/网络协议
- 使用memcache和redis实现队列
- java设计模式(一):从HelloWorld开启
- 韩信点兵
- linux指令识记(2)
- 【知了堂学习笔记】String的创建过程—第一章
- solr控制台详解
- 欢迎使用CSDN-markdown编辑器
- MySQL性能优化方案总结
- Ncut算法(Normalized cuts and image segmentation)
- MAC下MySQL密码忘记不要慌!
- SAP Contract合同类型的使用
- <转载改编>windows下使用log4j将Tomcat console中的日志存储到文件中
- 【web前端】js json转数组,数组转json,字符串转数字