美文网首页
Java中的String类

Java中的String类

作者: 凡人多烦事_71de | 来源:发表于2020-06-13 09:00 被阅读0次

Java中的String类

String类表示字符串。Java程序中的所有字符串文字(例如"abc")都实现为此类的实例。

字符串是不变的;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为String对象是不可变的,所以可以共享它们。

这里的共享是指什么呢?

我们来看下面这段代码:

String s1 ="abc";

String bs2="abc";

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

我们知道对于引用数类型 == 比较的是内存的地址。

两个两量a、b正常来讲内存地址应该是不同的

但是结果为true,说明两者的地址内存是相同的。

为什么会有这样的结果呢?

这里就要涉及到一个概念:字符串常量池

在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。

8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:

直接使用双引号声明出来的String对象会直接存储在常量池中。

字符串常量池存储在永久代了

永久代的方法只执行一次,是一直复用的。(JDK1.8后,永久代改名为元空间)

如上面的代码:

String s1 ="abc";

String bs2="abc";

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

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在"abc"这个对象,如果不存在,则在字符串常量池中创建"abc"这个对象,然后将池中"abc"这个对象的引用地址返回给"abc"对象的引用s1,这样s1会指向字符串常量池中"abc"这个字符串对象;如果存在,则不创建任何对象,直接将池中"abc"这个对象的地址返回,赋给引用s2。因为s1、s2都是指向同一个字符串池中的"abc"对象,所以结果为true。

String s3 = new String("xyz");

String s4 = new String("xyz");

System.out.println(s3==s4);

结果是 false

采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"xyz"这个字符串对象,如果有,则不在池中再去创建"xyz"这个对象了,直接在堆中创建一个"xyz"字符串对象,然后将堆中的这个"xyz"对象的地址返回赋给引用s3,这样,s3就指向了堆中创建的这个"xyz"字符串对象;如果没有,则首先在字符串池中创建一个"xyz"字符串对象,然后再在堆中创建一个"xyz"字符串对象,然后将堆中这个"xyz"字符串对象的地址返回赋给s3引用,这样,s3指向了堆中创建的这个"xyz"字符串对象。s4则指向了堆中创建的另一个"xyz"字符串对象。s3 、s4是两个指向不同对象的引用,结果当然是false。

从这个角度讲,字符串常量池不会存储两个内容一样的字符串。

下面来简单介绍下关于String的一些方法

字符串的截取

这里用String类的substring方式

String a ="123456";

System.out.println(a.substring(1,4));

运行结果为:

234

按照索引取值,包含开始但不包含结尾。

判断字符串是否包含指定char值序列

boolean contains​(CharSequences)

当且仅当此字符串包含指定的char值序列时,才返回true。

判断是否以指定字符串开始

String a ="123456";

System.out.println(a.startsWith("1"));//true

System.out.println(a.startsWith("2"));//false

System.out.println(a.startsWith("123"));//true

关于String类的方法还有很多,这里就不一一列举了

相关文章

网友评论

      本文标题:Java中的String类

      本文链接:https://www.haomeiwen.com/subject/eqcztktx.html