【知了堂学习笔记】String的创建过程—第一章
2017-09-02 17:58
330 查看
第一章
我们知道字符有两种初始化方式:
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。这就是字符串的基本存储过程。
接下来我们看看字符串的一个重要特性:字符串是常量,它们的值在创建之后不能更改。
如下面一段代码
根据上面的分析我们可以知道 s 最开始是指向"abc",后面 s+="def"做个一个字符串拼接,而在内存中并没有直接把"def”拼接在“abc”上,而是先开辟了空间存储“def”,最后把abcdef拼接在一起,开辟了第三块空间。通过这个例子我们可以知道不能变的是字符串的值,即“abc”不能改变,而引用是可以改变的。所以最后 s打印出来的值变了,并不是“abc”发生了变化,而是s指向了新的对象“abcdef”。
接下来我们可以通过1个例子看看
首先我们要知道==和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 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")有什么区别?
答案详情请见下一篇随笔
相关文章推荐
- 学习笔记之 equals() vs. == 和String对象的2种创建过程
- 学习笔记之 equals() vs. == 和String对象的2种创建过程
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- [知了堂学习笔记]_Java多线程(1)-- 基本概念并开始创建多线程程序
- JNI学习笔记4——本地代码创建Java对象(包括javaString)
- cocos2d-x学习笔记——cocos2d-x-3.3beat0工程创建过程
- 【知了堂学习笔记】分页查询—第一章
- SQL Server 2005存储过程学习笔记——创建、修改存储过程
- cocos2d学习笔记第一章 基础场景创建及基本配置
- 【JAVA学习】EffectiveJava的学习笔记--第一章 创建和销毁对象
- SQL Server 2005存储过程学习笔记——创建、修改存储过程
- 【Linux内核学习笔记】进程的创建过程
- grails学习笔记-7、Domain创建过程中注意的问题
- C#开发学习笔记:C#通过存储过程创建数据表
- halcon例程学习笔记(5)----halcon中如何自己创建子过程
- cocos2d-x 3.1.1 学习笔记[21]cocos2d-x 创建过程
- SAP BW创建信息立方体创建的基本过程——视频学习笔记
- python-MySQL学习笔记-第一章链接到并创建数据库
- 【知了堂学习笔记】jfreechart创建简单的柱状图和饼图