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
北京
上海
广州
成都
武汉
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();
*/
注意,由于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类。