在JAVA编程中,String类是一种常用的数据类型,用于存储和操作字符串。它是不可变的,即一旦创建就不能被修改。
String类的特点
不可变性:String对象一旦创建,其值就不能被改变。这意味着对String对象进行任何修改操作都会创建一个新的String对象。
String str1 = "Hello";
System.out.println("原始字符串: " + str1);
String str2 = str1.concat(" World");
System.out.println("连接后的字符串: " + str2);
System.out.println("原始字符串未改变: " + str1);
输出结果:
原始字符串: Hello
连接后的字符串: Hello World
原始字符串未改变: Hello
上面的代码中,我们创建了一个名为str1的字符串对象,并输出它的值为"Hello"。然后,我们使用concat()方法连接字符串" World"到str1上,得到一个新的字符串str2。最后,我们再次我们再次输出str1的值,可以看到它的值仍然为"Hello",没有改变。
字符串池:为了提高性能,JAVA中的字符串字面量会被存储在字符串池中。当创建多个相同值的字符串时,它们会指向同一个字符串池中的对象,从而节省了内存空间。
String a1 = "你好";
String a2 = "你好";
System.out.println(a1==a2);
String b1 = new String("你好");
String b2 = new String("你好");
System.out.println(b1==b2);
输出结果:
true
false
在上面代码中,我们使用字符串字面量方式创建了两个相同值的字符串对象a1和a2,然后使用==运算符比较它们的引用地址,结果为true。这是因为它们指向了字符串常量池中的同一个对象。
接着,我们使用new关键字创建了两个相同值的字符串对象b1和b2,然后再次使用==运算符比较它们的引用地址,结果为false。这是因为new关键字会创建一个新的字符串对象,不会使用字符串常量池中的对象。
字符串连接:String类提供了丰富的字符串连接方法,如使用"+"操作符或concat()方法。然而,频繁的字符串连接操作会导致性能下降,因为每次连接都会创建一个新的String对象。此时,可以使用StringBuilder或StringBuffer类来提高效率。
常用方法
length():返回字符串的长度。
String str = "Hello World";
int length = str.length();
System.out.println(length); // 输出 11
charAt(int index):返回指定位置的字符。(这里的位置是下标)
String str = "Hello World";
char ch = str.charAt(6);
System.out.println(ch); // 输出 'W'
substring(int beginIndex, int endIndex):返回指定范围内的子字符串。
String str = "Hello World";
String subStr = str.substring(6);
System.out.println(subStr); // 输出 "World"
equals(Object anObject):比较字符串的内容是否相等。
String str1 = "Hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); // 输出 false
isEmpty():判断字符串是否为空。
String str1 = "";
boolean isEmpty1 = str1.isEmpty();
System.out.println(isEmpty1); // 输出 true
String str2 = "Hello";
boolean isEmpty2 = str2.isEmpty();
System.out.println(isEmpty2); // 输出 false
toLowerCase()和toUpperCase():将字符串转换为小写或大写。
String str = "Hello World";
String upperCase = str.toUpperCase();
System.out.println(upperCase); // 输出 "HELLO WORLD"
String lowerCase = str.toLowerCase();
System.out.println(lowerCase); // 输出 "hello world"
split(String regex):根据指定的分隔符将字符串拆分为字符串数组。
String str = "Hello,World,Java";
String[] splitArray = str.split(",");
for (String s : splitArray) {
System.out.println(s);
}
输出内容:
Hello
World
Java
replace(CharSequence target, CharSequence replacement):将字符串中的指定字符或字符串替换为新的字符或字符串。(可以单个或多个修改)
String str = "Hello World";
String replacedStr = str.replace("o", "e").replace("l", "L");
System.out.println(replacedStr); // 输出 "HeLLe WorLd"
使用技巧
避免频繁的字符串连接操作,尽量使用StringBuilder或StringBuffer来处理大量字符串连接的情况。
使用equals()方法比较字符串的内容,而不是使用"=="操作符来比较对象的引用。
使用trim()方法去除字符串两端的空格。
String str = " Hello World ";
String trimmed = str.trim();
System.out.println(trimmed); // 输出 "Hello World"
使用String.format()或StringBuilder.append()来构建复杂的字符串。
String name = "小明";
int age = 25;
String country = "中国";
String message = String.format("我的名字是%s,我%d岁,我来自%s。", name, age, country);
System.out.println(message); // 输出 "我的名字是小明,我25岁,我来自中国。"
在上面代码中,我们使用String.format()方法来构建一个包含变量的字符串。在格式化字符串中,我们使用%s表示字符串占位符,%d表示整数占位符。然后,使用变量name、age和country作为参数传递给String.format()方法,生成最终的字符串message。(这里和C语言的字符串创建很相似)
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String message = sb.toString();
System.out.println(message); // 输出 "Hello World"
在上面代码中,我们使用StringBuilder类创建一个可变的字符串对象。然后,使用append()方法将多个字符串逐个添加到StringBuilder对象中。最后,使用toString()方法将StringBuilder对象转换为不可变的字符串。
总结
String类是JAVA中常用的字符串类型,具有不可变性和字符串池的特点。熟练掌握String类的常用方法和使用技巧,可以提高字符串处理的效率和准确性。在实际开发中,合理使用String类的相关方法,可以更好地处理和操作字符串数据。