关于 Java String

来源:互联网 发布:java获取时间戳 编辑:程序博客网 时间:2024/05/29 12:30

 

Java 关于String 有这样一段描述“字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

这段描述中有几个关键词:

1.常量:也就是说一个字符串创建后就不能被修改,所有的添加,删除操作都会生成新的对象。既:

String s="abc";//创建s引用和值为"abc"的对象,s指向该对象

s+="d";//创建值为"abcd"的对象,此时s指向新的对象

2.字符串缓冲池:

缓冲池为String类私有维护,既如果你字面(隐式)声明一个String对象,该对象并不是存在应用程序堆中,而是在字符串缓冲池中,对象引用是指向String Pool中的对象。同样刚才的例子:

String s="abc";//s指向的是String Pool中的对象

而如果显示声明对象,则会有不同的结果,它会先查询String pool 中是否存在值为"abc"的对象,如果不存在,则会在String Pool中创建,然后再在堆中新建一个值为"abc"的对象,引用S指向堆中的对象:

String s=new String("abc");//s指向Heap 中的对象

3.共享

因为String对象不可变,既可以共享。

当再声明一个s1对象,值为"abc",这是Java查询缓冲池,发现已经存在了值为"abc" 的对象,此时该语句不生成对象,返回String pool中值为"abc" 的引用。

String s="abc";//s指向的是String Pool中的对象

String s1="abc";//该语句不生成对象,只是返回String pool中对象的引用

4.假如我已声明一个String对象,这是我想再添加内容,我用‘+’操作符连接两个字符串。

例如:

String s1="abc";

String s2=s1+"def";//使用+连接两个字符串

此时Java又是怎么做的呢?

查看API文档,有这样一段描述:

Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。

也就是说使用+操作符时,会生成一个StringBuilder中间对象,然后通过toString()方法返回结果。通过单步调试,我们发现Java采用反射机制构建StringBuilder对象。这样知道我们经常使用的字符串连接操作符+添加字符串内容是一件相当”昂贵“的操作。建议直接使用StringBuilder。

那么上述中s2指向何处呢?答案是堆中的对象,StringBuilder生成在堆上,返回的既是堆上的String

5.那么直接使用字符串连接会不会产生新的对象呢?

我们来看一个测试:

String s2="abcdef";

String s3="abc"+"def";

System.out.println(s2==s3);

结果是什么呢?True

对于两个(字面)字符串的连接,Java会直接将两个字符串连接成一个字符串,然后与String pool中的对象比较。

6.intern()方法

关于String 类还有一些有趣的东西。

Java 对于intern()的方法描述是:

返回字符串对象的规范化表示形式。

一个初始为空的字符串池,它由类 String 私有地维护。 

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

什么意思呢?就是如果该对象是堆上的对象,则返回池中相对应的对象。如果池中没有对应的对象,则添加一个String对象进去,并返回此对象的引用。

这是我们的测试结果:

String s1="abc";

String s2="ab";

String s3=s2+"c";

System.out.println(s1==s3);//false

System.out.println(s1==s3.intern());//true

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被列入维稳对象怎么办? 资金涉及诈骗案冻结了怎么办 小米浏览器浏览记录找不到了怎么办 米聊账号封了怎么办 管家婆创业版管理员忘记密码怎么办 手机不记得密码了怎么办 手机不记得开锁密码怎么办 oppo手机不记得密码怎么办 电脑密码不记得了怎么办 vivo手机不记得密码了怎么办 运管把车扣了怎么办 大学通选课挂科怎么办 通识必修课挂了怎么办 我想开3d艺术馆怎么办 档案回原籍报到证怎么办 服刑的人孩子上学怎么办 长沙终身教育网用户名忘记了怎么办 乡下卖服装没生意怎么办 没能力没学历该怎么办 没有学历的我该怎么办 补过的牙掉了怎么办 法院判完被告不给钱怎么办 b证到期未继续教育怎么办 宝宝上幼儿园中午要用尿不湿怎么办 嫁到北京农村怎么办居住证 2020年没脱贫的农民怎么办 2020年农民的土地怎么办 车停在停车场被划怎么办 专升本差两分怎么办 入职需要学士学位证怎么办 不喜欢写科研项目又没编制怎么办 易学堂密码忘了怎么办 易班手机号换了怎么办 易班登录不上怎么办 易到手机号换了怎么办 海外留学没有教育部认证怎么办 七过月宝宝便秘怎么办 6个月孩子便秘怎么办 6个月婴儿便秘怎么办 一个多月宝宝两天没拉大便怎么办 7个月宝宝便秘怎么办