概述:数据类型比较时用“==”内容比较用equals
-
String 字符串类型,可以自定义字符串变量指向字符串对象
-
String 是不可变字符串的原因是:
1. String 变量每次修改都是产生并指向了新的字符串对象 2. 原来的字符串对象是没有改变的,所以称不可变字符串
创建字符串对象的2钟方式:
1. 直接使用 “” 定义
String name = "字符串"
2. 通过String类的构造器创建对象
// public String(); 创建一个空白字符串对象,不含任何内容 (几乎不用)
String s1 = new String();
// public String(String original); 根据传入的字符来创建字符串对象 (几乎不用)
String s2 = new String("字符串");
// public String(char[] chs); 根据字符数组的内容来创建字符串对象
char[] chars = {'a', 'b', '你', '他'};
String s3 = new String(chars);
System.out.println(s3);
// public String(byte[] chs); 根据字节数组的内容来创建字符串对象
byte[] bytes = {97, 98, 99, 65, 66, 67}; // 字节范围 -128 ~ 127
String s4 = new String(bytes);
System.out.println(s4); // abcABC
3. 注意:使用构造器和直接使用 “” 不一样
String s1 = "abc"; // 直接存储的是地址 指向相同 指向常量池(栈内存)
String s2 = "abc";
System.out.println(s1 == s2); // true
char[] chars = {'a', 'b', 'c'};
String s3 = new String(chars); // 构造器方法 存储的是构造器地址,指向不同 指向堆内存
String s4 = new String(chars);
System.out.println(s3 == s4); // false
System.out.println(s1 == s3); // false
常用API
1. 比较 equals && equalsIgnoreCase (与JS不同 字符串比较不能用 ==)
- == 比较的是两边对应的地址 而不是内容
- equals 比较内容
- equalsIgnoreCase 忽略大小写比较内容 常用于 验证码
// 正确的登录名和密码
String okName = "itheima"; // 地址指向常量池
String okPassword = "123456";
// 输入登录名和密码
Scanner sc = new Scanner(System.in);
System.out.println("登录名称:");
String inName = sc.next(); // 地址指向堆内存
System.out.println("登陆密码:");
String inPassword = sc.next();
System.out.println(okName == inName); // false
System.out.println(okPassword == inPassword); // false
// 字符串比较要使用 equals 不能用 ==
boolean bolName = okName.equals(inName); // true
boolean bolPassword = okPassword.equals(inPassword); // true
System.out.println(bolName);
System.out.println(bolPassword);
// equalsIgnoreCase 忽略大小写进行比较
String str1 = "23AfGH";
String str2 = "23afgh";
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
2. public int length() 返回此字符串的长度
String name = "hello world";
int length = name.length();
System.out.println(length);
3. public char charAt(int index) 获取某个索引位置处的字符
String name = "hello world";
char chart = name.charAt(1);
System.out.println(chart);
4. public char[] toCharArray() 将当前字符串转换为字符数组返回
String name = "hello world";
char[] chars = name.toCharArray();
for (char i:chars) {
System.out.println(i);
}
5. public String substring(int beginIndex, [int endIndex]) 根据开始和结束索引进行截取,得到新的字符串
String name = "hello world";
String str = name.substring(1, name.length() - 1); // 第二个参数默认是 name.length() 就像下面那个
System.out.println(str);
String name = "hello world";
String str = name.substring(1);
System.out.println(str);
6. public boolean contains(CharSequence s) 判断是否包含某个关键字
String name = "hello world";
System.out.println(name.contains("E")); // false
System.out.println(name.contains("e")); // true
7. public String replace(CharSequence target, CharSequence replacement) 使用新值,将字符串中的旧值替换,得到新的字符串
String name = "hello world";
String str = name.replace("e", "哈");
System.out.println(str);
8. public boolean startsWith(String prefix) 判断是否以 传入内容 开始
String name = "hello world";
System.out.println(name.startsWith("helo")); // false
System.out.println(name.startsWith("hel")); // true
9. public String[] split(String regex) 根据传入的规则切割字符串,得到字符串数组返回
// 与JS类似 字符串分割
String name = "hello world";
String[] array = name.split("o");
for (String i:array) {
System.out.println(i);
}
// hell w rld (注意没有 o)