java

位置:IT落伍者 >> java >> 浏览文章

深入了解Java的String


发布日期:2018年08月08日
 
深入了解Java的String

从根本上认识javalangString类和String池

首先我建议先看看String类的源码实现这是从本质上认识String类的根本出发点从中可以看到

String类是final的不可被继承public final class String

String类是的本质是字符数组char[] 并且其值不可改变private final char value[];

然后打开String类的API文档可以发现

String类对象有个特殊的创建的方式就是直接指定比如String x = abcabc就表示一个字符串对象而x是abc对象的地址也叫做abc对象的引用

String对象可以通过+串联串联后会生成新的字符串也可以通过concat()来串联这个后面会讲述

创建字符串的方式很多归纳起来有三类

其一使用new关键字创建字符串比如String s = new String(abc);

其二直接指定比如String s = abc;

其三使用串联生成新的字符串比如String s = ab + c;

Java运行时会维护一个String Pool(String池)JavaDoc翻译很模糊字符串缓沖区String池用来存放运行时中产生的各种字符串并且池中的字符串的内容不重复而一般对象不存在这个缓沖池并且创建的对象仅仅存在于方法的堆栈区下面是个系统内存示意图

String对象的创建

String对象的创建也很讲究关键是要明白其原理

原理当使用任何方式来创建一个字符串对象s时Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象如果不存在则在池中创建一个字符串s否则不在池中添加

原理Java中只要使用new关键字来创建对象则一定会(在堆区或栈区)创建一个新的对象

原理使用直接指定或者使用纯字符串串联来创建String对象则仅仅会检查维护String池中的字符串池中没有就在池中创建一个有则罢了!但绝不会在堆栈区再去创建该String对象

原理使用包含变量的表达式来创建String对象则不仅会检查维护String池而且还会在堆栈区创建一个String对象

另外String的intern()方法是一个本地方法定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上当调用 intern 方法时如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定)则返回池中的字符串否则将此 String 对象添加到池中并且返回此 String 对象的引用

最后有几点问题请大家注意String a; 与String a=null在作为类变量时候是等价的在局部变量则不同null表示一个空引用String a=null意思是在栈中声明了a但是这个a没有指向任何地址此时我们注意到String a 在栈中声明了a但是也没有指向任何地址但是java的语法检查如果在局部变量中String a;是不能直接使用的String a=null中的这个a可以直接使用

               

上一篇:Struts自定义标签的过程

下一篇:hibernate中获取关联属性为null的方式