← 返回首页
JavaSE系列教程(二十一)
发表时间:2019-12-28 17:33:00
讲解Java String类常用api.

1.常用API

Java常用的api方法如下表所示:

方法名字 说明
length() 获取字符串的长度(单位是字符)
equals(String s) 判断两个字符串内容是否相同
equalsIgnoreCase(String s) 忽略大小写判断两个字符串内容是否相同
charAt(int index) 返回字符串第index位置的字符
indexOf(String s) 返回子串第一次出现的位置,没出现则返回-1
lastIndexOf(String s) 返回子串最后一次出现的位置,没出现则返回-1
startsWith(String prefix) 判断字符串是否以prefix前缀开头
endsWith(String suffix) 判断两字符串是否以suffix后缀结尾
toLowerCase() 返回字符串的小写形式
toUpperCase 返回字符串的大写形式
substring(String start,String end) 返回从start到end结尾的子串
contains(String s) 判断字符串是否包含子串s
concat(String s) 字符串拼接,等同于+
replaceAll(String oldStr,String newStr) 替换字符串中的子串为目标子串
split(String split) 以指定字符串分割后返回字符串数组
getBytes() 返回字符串的字节数组
toCharArray() 返回字符串的字符数组
trim() 返回消除字符串两边的空格后的字符串
compareTo 比较两个字符串的大小

通过一个实例,理解以上方法,代码如下:

public class Test {
    public static void main(String[] args) {
        String s1 = " hello is a java 程序! ";
        String s2 = " Hello is a java 程序! ";
        String fileName = "TestUsersService.java";
        String citys = "北京 上海 广州 成都 武汉";

        System.out.println(s1.length());//返回字符串的长度
        System.out.println(s1.equals(s2));//判断字符串内容是否相同
        System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写判断内容是否相同
        System.out.println(s1.charAt(7));//返回字符串第index位置的字符
        System.out.println(s1.indexOf("a"));//返回子串第一次出现的位置,没出现则返回-1
        System.out.println(s1.lastIndexOf("a"));//返回子串最后一次出现的位置,没出现则返回-1
        System.out.println(fileName.startsWith("Test"));//判断字符串是否以Test前缀开头
        System.out.println(fileName.endsWith("java"));//判断两字符串是否以java后缀结尾
        System.out.println(s2.toLowerCase());//返回字符串的小写形式
        System.out.println(s2.toUpperCase());//返回字符串的大写形式
        System.out.println(s1.substring(12, 16));//返回从start到end结尾的子串
        System.out.println(s1.contains("java"));//判断字符串是否包含子串java
        System.out.println(s1.concat(s2));//字符串拼接,等同于+
        System.out.println(s1.replaceAll("java", "javascript"));//替换字符串中的子串java为目标子串javascript

        System.out.println(s1.getBytes());//返回字符串的字节数组
        System.out.println(s1.toCharArray());//返回字符串的字符数组

        System.out.println(s2.trim());//返回消除字符串两边的空格后的字符串

        System.out.println(s1.compareTo(s2));//比较两个字符串的大小,默认按照字符的Unicode值比较

        String[] arr = citys.split(" ");//以指定字符串分割后返回字符串数组
        for(String s: arr){
            System.out.println(s);

        }
    }
}

运行结果:
21
false
true
i
10
15
true
true
 hello is a java 程序! 
 HELLO IS A JAVA 程序! 
java
true
 hello is a java 程序!  Hello is a java 程序! 
 hello is a javascript 程序! 
[B@1b6d3586
 hello is a java 程序! 
Hello is a java 程序!
32
北京
上海
广州
成都
武汉

2.intern方法

String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,intern方法的作用是如果字符串常量池已经包含一个等于(通过equals方法比较)此String对象的字符串,则返回字符串常量池中这个字符串的引用, 否则将当前String对象的引用地址(堆中对象的引用地址)添加(或者叫复制)到字符串常量池中并返回,这么做是为了节约堆空间,毕竟都在堆中。

 public static void main(String[] args) {

        String str1 = new String("hello").intern();
        String str2 = "hello";
        String str3 = new String("hello").intern();
        String str4 = new String("hello");

        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str2 == str4);
        System.out.println(str1 == str4);

        System.out.println("\n------------------------");

        String s1 = new StringBuilder().append("String").append("Test").toString();
        System.out.println(s1.intern() == s1);

        //JDK默认常量池中一开始就已经存在 "java" 字符串
        String s2 = new StringBuilder().append("j").append("ava").toString();
        System.out.println(s2.intern() == s2);
    }

运行结果:
true
true
false
false

------------------------
true
false

注意:字符串拼接的时候只要其中有一个是变量(非final修饰),拼接出来的对象就在堆中,相当于在堆空间中new String("XXX")(不是在字符串常量池中)。变量拼接的原理是StringBuilder调用append方法然后再调用toString方法。

例如:

String s = new String("a")+new String("b"); //一共创建了几个对象呢?

/*
  1. new StringBuilder();
  2. new String("a"); //堆内存中
  3. "a"    //常量池中
  4. new String("b");  //堆内存中
  5. "b"    //常量池中
  6. new String("ab");  //调用StringBuilder对象的toString();
*/

3.java字符串与C语言字符串的区别

注意,由于java字符串是对象。所以java的字符串没有字符串结束符号'\0',而C语言的字符串是包含字符串结束符号'0'.

通过以下代码可以验证:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){

    char str[] = "hello";
    printf("%s\n",str);
    printf("%d\n",strlen(str)); //获取字符个数
    printf("%d\n",sizeof(str)); //获取字节个数
    getch();
    return 0;
}

运行结果:
hello
5
6  //说明字节数组结尾包含 '\0'
public class Test {

    public static void main(String[] args) {
        String str = "hello";
        System.out.println(str);
        System.out.println(str.length());
        System.out.println(str.getBytes().length);
    }
}

运行结果:
hello
5
5

小结:

Java String类有很多常用的api方法,通过观察这些方法的名字大概也能猜出它们的作用。这些方法在我们平时编程中使用频率很高,希望大家能熟练掌握,并且这些方法的使用方式与其它编程语言都是相似的,比如:javascript,C#等等,掌握了Java的String类就等于迅速掌握其它语言的String类。