String详解(一):如何理解String
来源:互联网 发布:ios更新系统 数据丢失 编辑:程序博客网 时间:2024/04/20 10:37
转载请注明出处:http://blog.csdn.net/jeffleo/article/details/52194050
引入问题:
(一)String和基本数据类型的区别:
首先要理解String是一个对象,而不是基本数据类型。String是存放在char[]中的,char[]跟所有的对象一样存放在堆,而基本数据类型存放于堆栈中。
(二)理解String不可变:
String q = "hello";println(q);String qq = upcase(q);println(q);println(qq);//上述代码的输出结果hellohelloHELLO
把q传递到upcase中,传递的是什么?值还是引用?
如果是值,upcase调用后会改变q的值,就是说此时qq和q的值都为HELLO,因此传递的必然是q的一份复制的引用。从另一个想法考虑,这说明了String是不可变的,把String对象作为传递参数时,实际原来的对象依然指向原来的物理位置,无论如何都不能改变此引用的值。
(三)再理解String不可变
String ss1 = "how " + "old " + "are " + "you";println(ss1);StringBuilder builder = new StringBuilder();builder.append("how ").append("old ").append("are ").append("you");println(builder.toString);//结果how old are youhow old are you两种都能实现同样的结果,有什么不同?
第一种方式实际在内部就是使用StringBuilder的append来完成的!那我们对于这种需求的时候应该使用哪种方式来完成(例如在http中写url的get方式的参数时需要不断在后面追加参数)?
显然是第二种!因为String不可变,因此不断得使用+操作,会不断得创建新的String对象,产生许多我们不需要的中间对象,而我们需要的只是最后一个String对象(最致命的是,String很耗内存)。而StringBuilder不同,它在append的时候不会产生新的对象,而**在最后的toString才会创建一个String对象。
(四)两种创建String的方式
String a = "a"和String a = new String("a")有什么不同?
从对象个数来看
第一个显然只有一个对象,第二个却有两个对象"a"和new String("a")
那应该使用哪一种呢?先看看这个问题:
String a = "a"
明显只有一个对象
String ab = "cd";String ac = "cd";
这里还是一个对象!
为什么?因为jvm中存在一个String池,存放着String对象,用于共享使用,提高效率。当执行ab的语句时,会调用equal去跟String池中比较看存不存在“cd”这个值得对象,如果存在,则返回这个对象给ab,如果不存在,则把这个值得对象加入String池。当执行完ab,再执行ac时,由于String池已经存在值为"cd"的ab对象,因此会把该对象的引用赋给ac。这么看,String池的存在很合理。但是String池只能添加使用引号包含文本的方式产生的对象,而不能添加使用new操作产生的对象。
- String详解(一):如何理解String
- 深入理解String(一)
- 详解java String类型(一)
- Redis数据结构详解(一) string
- String理解
- 深入理解string和如何高效使用string
- 深入理解string和如何高效地使用string
- List<? extends Map<String, ?>> 如何理解呢?
- String 类型不可变 如何理解?
- 如何理解new String(bytes, offset, length)
- String 详解
- String详解
- String详解
- String 详解
- String详解
- string详解
- String详解
- string 详解
- 欢迎使用CSDN-markdown编辑器
- Apache OFBiz 学习笔记 之 服务引擎 二
- javascript中的||操作符与&&操作符
- 彻底解决数据库去中心化问题
- “睡城”通州的逆袭:房价大涨40% 限制人口落户
- String详解(一):如何理解String
- php 将中文字符串转成汉语拼音
- C语言pthread_cond_wait与pthread_cond_signal的使用
- kubernetes实战-基于redis和docker的留言簿案例
- 一致性Hash
- C++ 内存分配(new,operator new)
- C++ 神秘的随机数
- nginx 工作原理
- 玫瑰花数