Java String详解

802 阅读5分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

字符串的声明

字符串是内存中连续排列的0个或多个字符。不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找、比较、拼接等操作时,既不能输入新字符,又不能改变字符串的长度。

Java程序中的字符串分为常量和变量两种,其中,字符串常量使用双引号括起来的一串字符,系统为程序中出现的字符串常量自动创建一个String对象。例如:

System.out.println("hello world!");

这句话将创建一个String对象,值为“hello world!”。

对于字符串变量,在使用之前要显式声明,并进行初始化。

字符串的声明方式有三种:

  • 直接创建: String str1 = "Hello";

字符串是对象,虽然我们在这里没有用new创建对象,其实是编译器给我们做了这些操作。这种创建的字符串对象有一个特点,如果同样的对象如果存在了,就不会创建一个新的对象,而是指向了同样的对象。例如String str2 = "Hello";,则str1和str2是指向了字符串池中同样的内存地址,即 str1 == str2。

  • 使用字符串连接创建: String str = "Hello" + "World";

这种形式其实可以看做是第一种的形式的特殊形式。 "Hello" + "World"在编译期会被自动折叠为常量“HelloWorld”,所以,最后只会创建一个对象:String str = "HelloWorld";

JDK1.7开始,javac会进行常量折叠,全字面量字符串相加是可以折叠为一个字面常量,而且是进入常量池的。这个问题涉及到了字符串常量池和字符串拼接。
String a="a"+"b"+"c";
通过编译器优化后,得到的效果是:
String a="abc";

  • new创建字符串: String str1 = new String("Hello");

用new关键字创建的字符串每次都会创建一个新的对象。即使这时创建一个字符串

String str2 = new String("Hello");

str1与str2是两个对象,str1 != str2。

企业微信截图_163024602222.png

注意点:String str = new String("Hello"); 会产生几个对象? 如果字符串池里面没有“Hello”对象,会在字符串池里面生成一个对象,然后再生成一个字符串对象,str指向这个对象;如果字符串池里面已经有了“Hello”对象,则只会生成一个对象,str指向这个对象。

字符串的操作

字符串创建以后,可以使用字符串类中的方法对它进行操作。日常开发中常用的操作字符串的方法有:

  • String当中与获取相关的常用方法

public int length():获取字符串当中含有的字符个数,拿到字符串长度。

public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。

public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。)

public int indexOf(String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。 在java中存在两个这样的方法在java1.6的API中这样写道:

  • 第一种
public String substring(int beginIndex){
}

解释:返回一个新的字符串,该字符串是原来字符串的子集。该字符串从beginIndx处开始,一直到最后结束。

 "unhappy".substring(2) returns "happy"
 "Harbison".substring(3) returns "bison"
 "emptiness".substring(9) returns "" (an empty string)

第二种:

public String substring(int beginIndex,
                        int endIndex){
}

解释:该字符串返回的的字符是从beginIndex的位置到endIndex的位置。

 "hamburger".substring(4, 8) returns "urge"
 "smiles".substring(1, 5) returns "mile"

Java有一组可以用于字符串的内置方法。Java 字符串(String)操作常用操作,如字符串的替换、删除、截取、赋值、连接、比较、查找、分割等。本文主要介绍Java String substring() 方法。

Java 字符串方法

例如:

public class Test {
    public static void main(String args[]) {
        String Str = new String("www.cjavapy.com");
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4) );
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4, 11) );
    }
}

1、定义和用法

返回一个新的字符串,它是当前字符串的一个子字符串。

2、调用语法

String substring(int beginIndex)
String substring(int beginIndex, int endIndex)

3、参数说明

参数描述
beginIndex起始索引(包括), 索引从 0 开始。
endIndex结束索引(不包括)

4、返回值

返回一个新的字符序列,它是此序列的一个子序列。

5、String、StringBuffer和StringBuilder的关系

String类的对象实例是不可变的,一旦创建就确定下来,对字符串施加操作后并不改变字符串本身,而是有生成了一个实例。对于那些需要改变内容并有许多操作的字符串,可以使用StringBuffer类或者StringBuilder类。它们之间的区别如下:

  • String是字符串常量,一旦创建就不能修改。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。String类是final修饰的,不能被继承。覆盖了equals方法和hashCode()方法。
  • StringBuffer是字符串可变对象,可以对字符串进行操作,修改字符串原有值时不会新建一个对象。执行效率较慢,但是线程安全。StringBuffer没有覆盖equals方法和hashCode()方法。可以动态的拼接字符换,使用 append() 方法。
  • StringBuilder也是字符串可变对象,同StringBuffer一样,可以对字符串进行操作,也不会新建对象。执行效率高效,但是线程不安全。