一、compareTo
- 当两个比较的字符串相等时
1.1 两个字符相等,则返回0
String a = "abc";
String b = "abc";
System.out.println(a.compareTo(b)); // 0
- 当两个比较的字符串是英文且长度不等时
2.1 长度短的与长度长的前面的字符一样,则返回的结果是两个长度相减的值
String a = "abc";
String b = "ab";
System.out.println(a.compareTo(b)); // 1
String c = "h";
String d = "hello";
System.out.println(c.compareTo(d)); // -4
2.2 长度不一样且前几个字符也不一样,从第一位开始找,当找到不一样的字符时,则返回的值是这两个字符比较的值
String a = "acsdf";
String b = "add";
System.out.println(a.compareTo(b)); // -1
- 当两个比较的字符串是英文且长度相等时
3.1 一个字符,则返回的值是这两个字符比较的值
String a = "a"; // 97
String b = "b"; // 98
System.out.println(a.compareTo(b)); // -1
3.2 多个字符,第一个字符相同则直接比较第二个字符,以此类推
String a = "abc"; // a = 97
String b = "ebc"; // b = 101
System.out.println(a.compareTo(b)); // -4
String c = "bce"; // b = 101
String d = "bca"; // a = 97
System.out.println(c.compareTo(d)); // 4
二、concat
源码
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
分析
- value为String内部维护的一个字符数组,用来存储String的值
- 首先判断需要拼接的字符串是否长度为0,若为0则返回预原字符串
String a = "i am ";
String result = a.concat("");
System.out.println(result); // i am
- 使用Arrays.copyOf方法将value复制到buf,且buf长度扩充为原字符串和新字符串长度之和
- 使用String的getChars方法将str的字符全部复制到buf索引len(即原字符串之后),完成拼接
- 返回新的字符串
String a = "i am ";
String result = a.concat("zach");
System.out.println(result); // i am zach
三、equals
equals 方法既然是基类 Object 的方法,我们创建的所有的对象都拥有这个方法,并有权利去重写这个方法。该方法返回一个 boolean 值,代表比较的两个对象是否相同,这里的相同的条件由重写 equals 方法的类来解决。
String str1 = "abc";
String str2 = "abc";
str1.equals(str2);//true
显然 String 类一定重写了 equals 方法否则两个 String 对象内存地址肯定不同。
public boolean equals(Object anObject) {
//首先判断两个对象的内存地址是否相同
if (this == anObject) {
return true;
}
// 判断连个对象是否属于同一类型。
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//长度相同的情况下逐一比较 char 数组中的每个元素是否相同
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;}
四、join
在Java 8中,我们在Java字符串类中有一个新的方法join()
。Java String.join()
方法连接给定的字符串并返回连接后的字符串。
public static String join(分隔符, 字符序列... elements)
返回分隔符和字符序列元素连接在一起的字符串。
例:
String message = String.join("-", "This", "is", "a", "String");
System.out.println(message); // "This-is-a-String"
// 注意,如果元素为空,则添加“”。
String message2 = String.join("", "a", "b", "c", "d");
System.out.println(message2); // abcd
例:join()方法通过分隔符连接列表的元素。
List<String> list = new ArrayList<String>();
list.add("s1");
list.add("s3");
list.add("s5");
list.add("s7");
System.out.println(String.join("-", list)); // s1-s3-s5-s7
五、其他
split
- split(String regex):它根据分隔正则表达式将输入字符串拆分后返回字符串数组。
- split(String regex, int limit):当我们想要限制子字符串时,使用这个Java字符串分割方法。这个方法和上面的方法的唯一区别是它限制了分割后返回的字符串的数量。例如split("any delimiter", 3)将返回只有3个字符串的数组,即使分隔符在字符串中出现超过3次。
- 如果限制是负的,那么返回的数组将有尽可能多的子字符串,但是当限制是零,那么返回的数组将有所有的子字符串,不包括尾部的空字符串。
- 如果指定的正则表达式的语法无效,则抛出PatternSyntaxException异常。
public static void main(String args[]){
String str = new String("28/12/2013");
System.out.println("split(String regex):");
String array1[]= str.split("/");
for (String temp: array1){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=2:");
String array2[]= str.split("/", 2);
for (String temp: array2){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=0:");
String array3[]= str.split("/", 0);
for (String temp: array3){
System.out.println(temp);
}
System.out.println("-----------------------------------------------------");
System.out.println("split(String regex, int limit) with limit=-5:");
String array4[]= str.split("/", -5);
for (String temp: array4){
System.out.println(temp);
}
}
输出结果:
split(String regex):
28
12
2013
split(String regex, int limit) with limit=2:
28
12/2013
split(String regex, int limit) with limit=0:
28
12
2013
split(String regex, int limit) with limit=-5:
28
12
2013
- 在java字符串分割方法中0和负限制之间的差异:
在上面的例子中,split(" / ",0)和split(" / ",-5)返回相同的值,但是在某些情况下结果会不同。让我们通过一个例子来看看这两者的区别:
String s="bbaaccaa";
String arr1[]= s.split("a", -1);
String arr2[]= s.split("a", 0);
输出结果:
{"bb","","cc","",""}
{"bb","","cc"}
- 用多个分隔符(特殊字符)分隔Java字符串:
让我们看看在使用split()方法时如何传递多个分隔符。在本例中,我们将根据多个特殊字符分割输入字符串。
public static void main(String args[]){
String s = " ,ab;gh,bc;pq#kk$bb";
String[] str = s.split("[,;#$]");
//Total how many substrings? The array length
System.out.println("Number of substrings: "+str.length);
for (int i=0; i < str.length; i++) {
System.out.println("Str["+i+"]:"+str[i]);
}
}
输出结果:
Number of substrings: 7
Str[0]:
Str[1]:ab
Str[2]:gh
Str[3]:bc
Str[4]:pq
Str[5]:kk
Str[6]:bb
trim
它从输入字符串中删除前导和尾空格后返回一个字符串。如。" Hello "trim()
将返回字符串"Hello"
。
public class JavaExample{
public static void main(String args[]){
String str = new String(" How are you?? ");
System.out.println("String before trim: "+str);
System.out.println("String after trim: "+str.trim());
}
}
输出结果:
String before trim: (空格) (空格)(空格)(空格) How are you??(空格)(空格)(空格)(空格)
String after trim: How are you??
isEmpty
方法的作用是:检查字符串是否为空。如果给定字符串为空,此方法返回true,否则返回false。换句话说,如果字符串的长度为0,你可以说这个方法返回true。
public class Example{
public static void main(String args[]){
//empty string
String str1="";
//non-empty string
String str2="hello";
//prints true
System.out.println(str1.isEmpty());
//prints false
System.out.println(str2.isEmpty());
}
}
正如我们在上面的示例中看到的,isEmpty()方法只检查字符串是否为空。如果您希望检查字符串是null还是都为空,那么可以按照下面的示例进行检查。
public class Example{
public static void main(String args[]){
String str1 = null;
String str2 = "beginnersbook";
if(str1 == null || str1.isEmpty()){
System.out.println("String str1 is empty or null");
}
else{
System.out.println(str1);
}
if(str2 == null || str2.isEmpty()){
System.out.println("String str2 is empty or null");
}
else{
System.out.println(str2);
}
}
}
输出结果:
String str1 is empty or null
beginnersbook