java字符串
从概念上讲,java字符串就是Unicode字符序列。比如“java\u2122”就是“java?”。
java没有内置的字符串类型,而是由java的标准类库提供了String类。每一个用双引号括起来的字符串都是String类的一个实例。
在API文档中,String类java.lang包下,java.lang包是提供java编程所需的基础类。
在java中,字符串有一个特性就是不可改变,只要字符串一旦有了值之后就不能够更改了,而且String类也并没有提供修改字符串的方法。下面以最简单的字符串常量说起,如:
String str=”hello”; (1-1)
我们对(1-1)语句进行解析,这条语句可分为两部分,分别是等号左右两边,我们先从右边说起,前面已经说了,在java中,每一个由双引号括起来的字符串都是String类的实例,所以”hello”是一个String类的对象,且”hello”会在java编译阶段存储在字符串池中;左边的是一个String类型的变量,名字是str,到这我们有一个专业的名称称呼:引用或者句柄。引用变量和句柄相当于C语言中的指针变量,存储在栈内存中,所以(1-1)的内存图类似于如下图:
引用str变量存储对象“hello”的地址。
上面的内容中有几个专业的词汇,它们是:栈内存、编译阶段、字符串池、句柄、引用。当然这些词大家都见过好多,不过我们主要是能够理解它们,这才是我们的目的。
1. 字符串池
在java中,所谓的字符串池,也就是一块用来专门存储字符串常量的内存区域,主要由String类来管理。字符串池是在编译阶段就已经存在的常量池,它是字符串常量共享特性的一个存在原因。
什么是字符串常量共享?比如:
String s1=”hello”;
String s2=”hello”;
S1和s2的关系是这样的:
也就是当在有“hello”字符串常量时就不会再开辟内存了,这样做节省空间。
2. 引用
引用类型变量和普通的变量一样,它主要存储地址值,比如s1和s2,都存储的是200:100这个地址值。
要是不是(1-1)呢?比如:
String str=new String(“hello”); (1-2)
这一语句是在运行阶段才创建的字符串对象,在运行创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址给str;如果池中没有,则在堆中创建一份,然后返回堆中的地址给str。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。