1. 创建字符串
常见的构造 String 的方式
// 方式一
String str = "Hello Bit";
// 方式二
String str2 = new String("Hello Bit");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
官方文档 https://docs.oracle.com/javase/8/docs/api/index.html
2. 字符串比较相等
如果现在有两个int型变量,判断其相等可以使用 == 完成。
str1 = "world";
System.out.println(str2);
// 执行结果
Hello
int x = 10 ;
int y = 10 ;
System.out.println(x == y);
// 执行结果
true
如果说现在在String类对象上使用 == 会怎么样?
代码1:
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true
貌似看起来没啥问题, 再换个代码试试, 发现情况不太妙。
代码2:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
分析:代码1的创建方式是String直接创建,创建出来的字符串“Hello”会存储在常量池中,str1 和 str2 是指向同一个对象的. 此时如 “Hello” 这样的字符串常量是在字符串常量池中。
关于字符串常量池
如 “Hello” 这样的字符串字面值常量, 也是需要一定的内存空间来存储的.,这样的常量具有一个特点, 就是不需要修改, 所以如果代码中有多个地方引用都需要使用 “Hello” 的话, 就直接引用到常量池的这个位置就行了, 而没必要把 “Hello” 在内存中存储两次。
代码2则是通过 String str1 = new String(“Hello”); 这样的方式创建的 String 对象相当于再堆上另外开辟了空间来存储"Hello" 的内容, 也就是内存中存在两份 “Hello”。此时再使用“==”来比较就错误了。
Java 中要想比较字符串的内容, 必须采用String类提供的equals方法
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true
equals 使用注意事项
现在需要比较 str 和 “Hello” 两个字符串是否相等, 我们该如何来写呢?
String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));
推荐使用方式二,一旦str=null 方式一会报空指针异常
String str = null;
// 方式一
System.out.println(str.equals("Hello")); // 执行结果抛出 java.lang.NullPointerException异常
// 方式二
System.out.println("Hello".equals(str); //执行结果false
3. 字符, 字节与字符串
3.1 字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换。
String str = "hello" ;
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h
System.out.println(str.charAt(10));
// 执行结果
产生 StringIndexOutOfBoundsException 异常
代码示例: 字符串与字符数组的转换
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
3.2 字节与字符串
代码示例: 实现字符串与字节数组的转换处理
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data));
4.字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len 变量等于5:
public class StringDemo {
public static void main(String args[]) {
String site = "Hello";
int len = site.length();
System.out.println(len);
}
}
//运行结果
5
5.连接字符串
String 类提供了连接两个字符串的方法:
str1.concat(str2);
返回 string2 连接 string1 的新字符串。也可以对字符串常量使用 concat() 方法,如:
"我爱".concat("中国!");
更常用的是使用’+'操作符来连接字符串,如:
"我爱" + "中国" + "!"
下面是 String 类支持的方法,更多详细,请查看官方API文档https://www.runoob.com/manual/jdk1.6/java/lang/String.html