带你了解Java字符串的世界

 前言

Java 基本类型可谓是 Java 世界里使用最频繁的数据类型了。除此之外,有种数据类型你也一定会遇到,它在 Java 世界里使用也相当频繁。它就是字符串!

听到字符串,你是不是想起了字符这种类型。不过在 Java 里,字符和字符串是两种不同的类型。

字符串的定义与形式

字符类型你应该比较熟悉,通过关键词 char 来申明一个字符。

值只能是一个英文字符或者一个中文字符或者是 Unicode 编码,用单引号包住。如下:


  1. // char 用 ascii 字符赋值  
  2. char charWithAscii = '.' 
  3. char charWithZh = '牛' 
  4. char a = '\u0041';// 值为 A 

而字符串,顾名思义,就是多个字符连接而成的串。通过关键词 String  来声明一个字符串。

值可以是 null 或者空字符串或者单字符串或者多字符串,用双引号包住。如下:


  1. // null 字符串,未指定地址  
  2. String nullnullStr = null;  
  3. // 空字符串,包含 0 个字符  
  4. String  blankStr = "" 
  5. // 包含一个字符  
  6. String oneCharStr = "A" 
  7. // 包含多个字符,打印 蜗牛666 A  
  8. String multiCharStr = "蜗牛666 \u0041"

你会发现字符串的值可以是 null,因为字符串类型 String 是引用类型,值为 null,就说明值不存在,也就是这个变量不指向任何对象。这也是它和基本类型 char 的区别所在。

那作为引用类型,String 就可以通过 new 的方式声明,比如:


  1. String newnewStr = new String("蜗牛666"); 

另外,你也会发现字符串比字符存储了更丰富的数据,实际上,一个字符串可以存储 0 到任意多个字符。只要把数据内容用双引号包起来就好。

不过,如果你的数据内容本身就有双引号,会发生什么呢?

没错,连编译都过不去!编译器会提示你字符串非法行尾,因为编译器判断的时候,会把中间引号当成字符串结尾,导致第三个引号开始的字符串语法出错。

那此时就要用到转义字符了,这个 case 里可以通过反斜杠 \ 转义中间的引号。


  1. String str = "蜗牛666\""; 

这样就不会报错了。

字符串的存储方式

我们知道,程序在运行时,会针对不同类型的变量数据做运算,最终输出结果。那其实运算过程中的变量数据都是存在栈里边,根据栈先进后出的特点,完成程序的运行逻辑。而对 Java 这种面向对象编程的语言,对象的信息就没放栈里边,而存到了堆里边,栈只存对象的引用地址。

另外,有些数据要求是不可变的,Java 会分配一块常量池出来。

比如 String 的场景。


  1. String str1 = "蜗牛666" 
  2. String str2 = "蜗牛666" 
  3. String newnewStr1 = new String("蜗牛666");  
  4. String newnewStr2 = new String("蜗牛666"); 

str1 和 str2 就存储在常量池中。而常量池中的数据只有一份,因此 str1 和 str2 其实是指向同一块内存空间。

newStr1 和 newStr2 是通过 new 语法创建的对象,在创建的过程中,Java 会先去常量池中查找是否已有 蜗牛666 对象,如果没有则在常量池中创建一个 蜗牛666 对象,然后在堆中创建一个 蜗牛666 的拷贝对象。

所以 new String("xxx"); 这行代码会产生几个对象?

答案是一个或两个。如果常量池中原来没有 xxx,就是两个。如果有就是一个。

字符串的特点

字符串最大的特点就是不可变性。前边也有提过,字符串在常量池会有一份,常量这个信息就说明字符串具备不可变性了。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章