浅谈java的String字符串
一提到java的String首先想到的应该就是它的不可变性,其原因是因为String类的内部是使用一个private final char value[]的字符数组来存储数据,本身没有相应的set方法,同时String类又是final的,所以该内部数组就与外界隔绝了,唯一的方法就是通过反射破除private的限制,虽然value[]也是final的,我们不可以修改其内部的数据,但是可以修改其引用的指向从而改变String的值。
至于为什么要把String设计成不可变的,首先,究其原因还是因为字符串是我们编程过程中最经常使用的对象,所以有必要在其使用内存时做一些优化,其中一个优化就是字符串常量池,在这个池中不存在两个相同值的字符串。对于字符串,其对象的引用都是存储在栈中的,对于对象本身,如果是编译期就确定其值的话(比如直接使用双引号创建)就会存储在常量池中,如果是运行期才能确定其值的话(比如使用new创建)就会存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中可以有多份。
对于语句String str = new String("abc")执行时,会先去常量池中查找是否存在字符串“abc”对象,如果没有则先在常量池中创建“abc”对象,再将该对象拷贝到堆中。如果已经存在的话则将其直接拷贝到堆中。如果我们想直接获取一个存储在常量池的字符串对象,可以使用intern()方法,例如String s1 = new String("abc");s2 = s1.intern();注意,此时s1.equals(s2)是true,但是s1==s2是false,因为s1是指向堆中的“abc”对象,s2是指向常量池中的“abc”对象。
虽然常量池的使用节省了内存,但是多个引用同时指向常量池中的一个字符串对象时,如果其中一个引用更改了字符串的值,其他几个便会受到影响,而字符串的不可变性则完全避免了这种问题的出现。
其次,因为String对象的内部值不可改变,所以其自身的hashCode值也不会改变,所以每一个字符串的hashCode都会被提前计算好缓存在自身对象中,所以我们经常使用String作为HashMap的键,这样在查询时便节省了计算hashCode的步骤,同时因为String的不可变性,也不会出现因为某个键改变后与其他键冲突的情况。
最后,因为String对象是不可变的所以它肯定是线程安全的,至于字符串拼接返回新对象的问题,本文就不在此赘述。
浅谈java的String字符串的更多相关文章
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 【转】浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈Java的反射机制和作用
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
随机推荐
- 7.广播和多播,IGMP协议
1.单播,多播,广播的介绍 1.1.单播(unicast) 单播是说,对特定的主机进行数据传送.例如给某一个主机发送IP数据包.这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说 ...
- iOS 之 二维码生成与扫描(LBXScan)
参考:https://github.com/MxABC/LBXScan 步骤如下: 1. 下载 通过参考网址进行下载. 2. 导入 导入整个LBXScan文件夹 3. 配置 在pch中加入 #impo ...
- php sprintf函数
定义和用法 sprintf() 函数把格式化的字符串写写入一个变量中.sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需.规定插 ...
- Selenium2(java)selenium常用API 六
selenium处理HTML5 处理Vedio WebDriver driver = new FirefoxDriver(); driver.get("http://videojs.com/ ...
- 详解JavaScript中的事件处理
在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后 ...
- JS 继承(类式 与 原型式)
1. /* -- 类式继承 -- *///先声明一个超类 function Person(name) { this.name = name;}//给这个超类的原型对象上添加方法 getName Per ...
- java解析XML,并生成文档
一.Java中XML的四种方法 Java学习者须知:Java中XML的四种方法 java xml学习总结(4中方法的例子介绍) JDOM解析XML Dom4j解析XML
- PHP那些最好的轮子
PHP那些最好的轮子 Databse 数据库ORM Doctrine 2 License : MIT Source Code Allo点评:Doctrine是功能最全最完善的PHP ORM,社区一直很 ...
- Bootstrap入门(十九)组件13:页头与缩略图
Bootstrap入门(十九)组件13:页头与缩略 1.页头 2.默认的缩略图 3.自定义缩略图 页头组件能够为 h1 标签增加适当的空间,并且与页面的其他部分形成一定的分隔.它支持 h1 标签内内嵌 ...
- HDU5058
So easy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...