Java的字符串操作(二)(代码示例)
1. 字符串的定义
// 直接赋值方式定义字符串
String str1 = "Hello World";
// 使用new关键字定义字符串
String str2 = new String("Hello World");
// 可以通过打印对象的哈希码来查看是否是同一个对象(在一定程度上反映引用情况)
System.out.println("str1的哈希码: " + System.identityHashCode(str1));
System.out.println("str2的哈希码: " + System.identityHashCode(str2));
在上述代码中,通过直接赋值和使用new
关键字两种方式定义了相同内容的字符串,并打印出它们的哈希码,可以看到一般情况下直接赋值得到的字符串引用是相同的(哈希码相同),而使用new
关键字创建的字符串是不同的引用(哈希码不同)。
2. 字符串的不可变性
String str = "Hello";
System.out.println("原始字符串 str: " + str);
// 看似修改字符串,实际是创建新对象
str = str + " World";
System.out.println("修改后的字符串 str: " + str);
// 可以通过查看内存地址(哈希码)来进一步确认
System.out.println("原始字符串的哈希码: " + System.identityHashCode(str));
String newStr = "Hello World";
System.out.println("新创建相同内容字符串的哈希码: " + System.identityHashCode(newStr));
这里展示了对字符串进行拼接操作后,实际上是创建了新的字符串对象,并且通过打印哈希码可以发现原始字符串和拼接后看似相同内容的新字符串(通过直接赋值创建)是不同的对象引用。
3. 字符串的常用方法
获取字符串长度
String str = "Java";
int len = str.length();
System.out.println("字符串 \"" + str + "\" 的长度为: " + len);
获取指定位置的字符
String str = "Python";
char c = str.charAt(2);
System.out.println("字符串 \"" + str + "\" 索引为2的字符是: " + c);
字符串连接
// 使用 + 运算符连接字符串
String str1 = "Hello";
String str2 = " World";
String result1 = str1 + str2;
System.out.println("使用 + 运算符连接的结果: " + result1);
// 使用concat方法连接字符串
String str3 = "Good";
String str4 = " morning";
String result2 = str3.concat(str4);
System.out.println("使用concat方法连接的结果: " + result2);
字符串比较
// equals方法比较字符串内容
String str1 = "Java";
String str2 = "Java";
boolean isEqual = str1.equals(str2);
System.out.println("str1和str2内容是否相等(使用equals): " + isEqual);
// == 运算符比较字符串引用
String str3 = "Java";
String str4 = new String("Java");
boolean refEqual = str3 == str4;
System.out.println("str3和str4引用是否相等(使用==): " + refEqual);
// compareTo方法比较字符串顺序
String str5 = "apple";
String str6 = "banana";
int compareResult = str5.compareTo(str6);
System.out.println("str5和str6的比较结果(使用compareTo): " + compareResult);
字符串查找
String str = "Hello World";
// 查找字符第一次出现的位置
int index = str.indexOf('o');
System.out.println("字符 'o' 在字符串 \"" + str + "\" 中第一次出现的位置: " + index);
// 查找子字符串第一次出现的位置
int subIndex = str.indexOf("World");
System.out.println("子字符串 \"World\" 在字符串 \"" + str + "\" 中第一次出现的位置: " + subIndex);
// 查找子字符串最后一次出现的位置
int lastIndex = str.lastIndexOf("Hello");
System.out.println("子字符串 \"Hello\" 在字符串 \"" + str + "\" 中最后一次出现的位置: " + lastIndex);
字符串截取
// 从指定索引截取到末尾
String str = "Java is fun";
String subStr1 = str.substring(5);
System.out.println("从索引5开始截取的结果: " + subStr1);
// 从指定索引开始到指定索引结束截取(不包括结束索引)
String str2 = "Python";
String subStr2 = str2.substring(1, 4);
System.out.println("从索引1到索引4(不包括4)截取的结果: " + subStr2);
4. 字符串与字符数组的转换
字符串转字符数组
String str = "Hello";
char[] charArray = str.toCharArray();
System.out.print("字符串 \"" + str + "\" 转换后的字符数组为: ");
for (char c : charArray) {
System.out.print(c + " ");
}
System.out.println();
字符数组转字符串
char[] charArray = {'J', 'a', 'v', 'a'};
// 使用构造函数创建字符串
String str1 = new String(charArray);
System.out.println("使用构造函数创建的字符串: " + str1);
// 使用valueOf方法创建字符串
String str2 = String.valueOf(charArray);
System.out.println("使用valueOf方法创建的字符串: " + str2);
5. 字符串格式化
int num = 10;
String str = String.format("The number is %d", num);
System.out.println(str);
double floatNum = 3.14159;
str = String.format("The floating number is %.2f", floatNum);
System.out.println(str);
String name = "John";
str = String.format("My name is %s and the number is %d", name, num);
System.out.println(str);
这里展示了不同类型数据的字符串格式化,包括整数、浮点数以及多个参数的格式化情况。
6. 字符串常量池
String str1 = "Hello";
String str2 = "Hello";
System.out.println("str1和str2是否引用同一个对象: " + (str1 == str2));
String str3 = new String("Hello");
System.out.println("str1和str3是否引用同一个对象: " + (str1 == str3));
// 通过intern方法可以将堆中的字符串放入常量池并返回常量池中的引用
String str4 = new String("Hello").intern();
System.out.println("str1和str4是否引用同一个对象: " + (str1 == str4));
在上述代码中,通过==
运算符比较不同方式创建的字符串是否引用同一个对象,同时展示了通过intern
方法将堆中的字符串放入常量池并进行引用比较的情况。