Java语言String

Java语言String教程

Java 语言 中 String 是定义一个字符串,它以 “” 来包装起来。String 是一个类,它是 final 类型的。是一个不可以被重写和变化的类。

Java String详解

语法

String 字符串名称 = ""; //直接赋值 String 字符串名称 = new String(""); //构造方法赋值

参数

参数 描述
String String 的特殊关键字
字符串名称 对应的字符串的名称

说明

String 是特殊的关键字,表示的是字符串,它可以直接赋值和 new 对象赋值。两种赋值方式是有差别的,一个字符串就是一个 String 类的 匿名对象。它直接将该匿名对象赋值给了 String 名称。而 new String 的时候,它将字符串对象赋值给了字符串名称。

直接赋值的好处是一个字符串已经被一个名称引用,那么这个字符串再有别的名称声明时不会开辟新的空间,使用已经开辟好的空间。

对象赋值的时候,无论有没有都会开辟新的空间。

字符串存储地址

15 string.png

字符串比较

Java 运算符 里面,我们讲对象比较的时候,用到的是 ==。在 String 这边比较的时候有 equals== 这两个方法,== 表示的是比较栈这边的地址信息,equals 比较的是堆里面的内容信息。

案例

package com.haicoder.net.str; public class StringTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); String str1 = "嗨客网"; //直接赋值法赋值 String str2 = "嗨客网"; //直接赋值 String str3 = new String("嗨客网"); //使用 new 对象方法赋值。 System.out.println("str1 == str2 : " + (str1 == str2)); //用 == 进行比较,这边比较的是栈地址 System.out.println("str1.equals(str2) : " + str1.equals(str2)); // 用 equals 进行比较,这边比较的是堆里面对内容 System.out.println("str1 == str3 :" + (str1 == str3)); System.out.println("str1.equals(str3) :" + str1.equals(str3)); } }

运行结果如下:

16 String 赋值案例结果.png

在案例的代码中,我们使用了 new 对象赋值和直接赋值,我们可以看到,用 ==equals 对两个值进行了比较。

在直接赋值的时候,我们给 str1 和 str2 都用了“嗨客网” 进行赋值,这个时候 str1 和 str2 两个字符串 == 号返回的是 true,表示地址相等。而 str1 和 str3 == 的时候不相等,而 equals 的时候相等,表示的是 str1 和 str3 的地址不相等,但是内容相等。

字符串内容不能改变

String 是 final 类型的类,在 Java 语言中,被 final 修饰的类是不能够改变的,所以 String 一旦定义了某个字符串内容,就不能够改变了,如果重新赋值,那么就表明给对应的字符串名称指向的堆地址改变。

17 string 字符串不能改变.png

package com.haicoder.net.str; public class StringTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); String str1 = "嗨客网"; //直接赋值法赋值 str1 = str1 + "(www.haicoder.net)"; System.out.println("str1 = " + str1); } }

运行结果如下:

18 string字符串不能改变.png

我们看到代码中对 str1 进行了改变,然后得到的结果也是我们想要的结果,但是这时的 str1 已经和起初的 str1 不是同一个栈地址了,它已经重新指向了堆里面的地址。

总结

String 里面的字符串比较的时候,有 == 和 equals 两种方法, equals 比较的是两个字符串的内容,内存保存在堆里面,== 比较的是两个字符串的地址,存放在栈里面。

String 中,在直接赋值的时候,如果两个字符串内容一样,那么对应的字符串名称是存放在同一个栈空间上面的,而 new 对象赋值的时候,无论内容是什么,都会在堆和栈上面开辟新的空间存储。

String 里面的内容是不能够改变的,如果对一个字符串进行加字符或者改变字符的操作,那么它的存储地址会发生改变,重新指向另外一个堆地址。