Java String字符串工具的建设及打点
当前位置:以往代写 > JAVA 教程 >Java String字符串工具的建设及打点
2019-06-14

Java String字符串工具的建设及打点

Java String字符串工具的建设及打点

副标题#e#

Constant Pool常量池的观念:

在讲到String的一些非凡环境时,总会提到String Pool可能Constant Pool,可是我想许多人都不太大白Constant Pool到底是个怎么样的对象,运行的时候存储在那边,所以在这里先说一下Constant Pool的内容。

String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为String Constant Pool.仿佛没有正式的定名。

在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组构成的表,范例为cp_info constant_pool[],用来存储措施中利用的各类常量,包罗Class/String/Integer等各类根基Java数据范例。

对付Constant Pool,表的根基通用布局为:

cp_info {
     u1 tag;
     u1 info[];
}

tag是一个数字,用来暗示存储的常量的范例,譬喻8暗示String范例,5暗示Long范例,info[]按照

范例码tag的差异会产生相应变革。

对付String范例,表的布局为:

CONSTANT_String_info {
     u1 tag;
     u2 string_index;
}

tag牢靠为8,string_index是字符串内容信息,范例为:

CONSTANT_Utf8_info {
     u1 tag;
     u2 length;
     u1 bytes[length];
}

tag牢靠为1,length为字符串的长度,bytes[length]为字符串的内容。

(以下代码在jdk6中编译)

为了具体领略Constant Pool的布局,我们参看一些代码:

String s1 = "sss111";
   String s2 = "sss222";
   System.out.println(s1 + " " + s2);

由于"sss111"和"sss222"都是字符串常量,在编译期就已经建设好了存储在class文件中。

在编译后的class文件中会存在这2个常量的对应暗示:

08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111....
00 06 73 73 73 32 32 32             ; ..sss222


#p#副标题#e#

按照上面说的String常量布局,我们阐明一下:

开始的08为CONSTANT_String_info布局中的tag,而11应该是它的相对引用,01为CONSTANT_Utf8_info的tag,06为对应字符串的长度,73 73 73 31 31 31为字符串对应的编码,接着阐明,会发明后头的是对应"sss222"的存储布局。

颠末上面阐明,我们知道了11和13是两个字符串的相对引用,就可以修改class文件来修改打印的内容,把class文件中的00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D改成00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D,措施就会输出sss111 sss111,而不是和原措施一样输出sss111 sss222,因为我们把对"sss222"的相对引用12改成了对"sss111"的相对引用10。

public class Test {
   public static void main(String[] args) {
     String s1 = "sss111";
     String s2 = "sss111";
   }
}

在上面措施中存在2个沟通的常量"sss111",对付n个值沟通的String常量,在Constant Pool中只会建设一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的暗示:

000000abh: 08 00 11 01 00 06 73 73 73 31 31 31       ; ......sss111

在措施执行的时候,Constant Pool会储存在Method Area,而不是heap中。

别的,对付""内容为空的字符串常量,会建设一个长度为0,内容为空的字符串放到Constant Pool中,

并且Constant Pool在运行期是可以动态扩展的。

关于String类的说明

1.String利用private final char value[]来实现字符串的存储,也就是说String工具建设之后,就不能再修改此工具中存储的字符串内容,就是因为如此,才说String范例是不行变的(immutable)。

2.String类有一个非凡的建设要领,就是利用""双引号来建设.譬喻new String("i am")实际建设了2个String工具,一个是"i am"通过""双引号建设的,另一个是通过new建设的.只不外他们建设的时期差异, 一个是编译期,一个是运行期!

3.java对String范例重载了+操纵符,可以直接利用+对两个字符串举办毗连。

4.运行期挪用String类的intern()要领可以向String Pool中动态添加工具。

String的建设要领一般有如下几种

1.直接利用""引号建设;

2.利用new String()建设;

3.利用new String("someString")建设以及其他的一些重载结构函数建设;

4.利用重载的字符串通接操纵符+建设。

例1

String s1 = "sss111";
   //此语句同上
   String s2 = "sss111";

   System.out.println(s1 == s2); //功效为true

例2

String s1 = new String("sss111");

   String s2 = "sss111";

   System.out.println(s1 == s2); //功效为false

#p#分页标题#e#

例3String s1 = new String("sss111");

   s1 = s1.intern();

   String s2 = "sss111";

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

#p#副标题#e#

例4

String s1 = new String("111");
   String s2 = "sss111";

   String s3 = "sss" + "111";

   String s4 = "sss" + s1;

   System.out.println(s2 == s3); //true
   System.out.println(s2 == s4); //false
   System.out.println(s2 == s4.intern()); //true

例5

这个是The Java Language Specification中3.10.5节的例子,有了上面的说明,这个应该不难领略了

package testPackage;
   class Test {
       public static void main(String[] args) {
           String hello = "Hello", lo = "lo";
           System.out.print((hello == "Hello") + " ");
           System.out.print((Other.hello == hello) + " ");
           System.out.print((other.Other.hello == hello) + " ");
           System.out.print((hello == ("Hel"+"lo")) + " ");
           System.out.print((hello == ("Hel"+lo)) + " ");
           System.out.println(hello == ("Hel"+lo).intern());
       }
   }
   class Other { static String hello = "Hello"; }
   package other;
   public class Other { static String hello = "Hello"; }

输出功效为true true true true false true,请自行阐明!

功效上面阐明,总结如下:

1.单独利用""引号建设的字符串都是常量,编译期就已经确定存储到String Pool中;

2.利用new String("")建设的工具会存储到heap中,是运行期新建设的;

3.利用只包括常量的字符串通接符如"aa" + "aa"建设的也是常量,编译期就能确定,已经确定存储到String Pool中;

4.利用包括变量的字符串通接符如"aa" + s1建设的工具是运行期才建设的,存储在heap中;

5.利用"aa" + s1以及new String("aa" + s1)形式建设的工具是否插手到String Pool中我不太确定,大概是必需挪用intern()要领才会插手。

尚有几个常常考的口试题:

1.

String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面建设了几个String工具?
谜底:3个 ,编译期Constant Pool中建设1个,运行期heap中建设2个.

2.

String s1 = "s1";
String s2 = s1;
s2 = "s2";
s1指向的工具中的字符串是什么?
谜底: "s1"

    关键字:

在线提交作业