目录
一、String类简介
二、关于字符串拼接的+号
三、StringJoiner类——通过连接符拼接字符串
四、String类常用方法详解
五、instanceof关键字
一、String类简介
String是被final修饰的类,不能被继承,因此不能使用匿名内部类。String是一个常量,不可变,所以可以被共享。原因是String在内存中存放在方法区中的字符串常量池中,底层是一个byte数组,数组有地址,String的地址是不可变的,而不是说String本身不可变,原有的值不变,所以叫常量。
注意:JDK8中是char[] value JDK11中是byte[] value
二、关于字符串拼接的+号
public static void main(String[] args) {
String s1 = "ab";
// s2是字面量,在编译期间已经变成了"ab"
String s2 = "a" + "b";
// 在编译到这一行时,知道s3是"a"
String s3 = "a";
// 在编译这一行时候,只知道s3是String类型,不能确定其值
/*
字符串使用 +号 相当于使用 StringBuilder
StringBuilder stringBuilder = new StringBuilder("a");
// 拼接字符串
stringBuilder.append("b");
stringBuilder转为String:
String s = stringBuilder.toString();
System.out.println(s);
*/
s3 += "b";
System.out.println(s1); // ab
System.out.println(s2); // ab
System.out.println(s3); // ab
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
}
因此,使用+号的时候 String s3 = "a"; s3+="b";创建了5个对象:
"a"、"b"、"ab"、StringBuilder、toString中也会创建String对象。
方法传参:基本数据类型和String传参,值不变
- 少量的字符串拼接可以使用+号,大量拼接字符串效率低;
- 大量的字符串拼接使用StringBuilder,但是线程不安全;
- 大量的字符串拼接也可以使用StringBuffer,线程安全;
三、StringJoiner类——通过连接符拼接字符串
// 设置连接符
String[] names = {"A", "B", "C", "D", "E"};
StringJoiner stringJoiner = new StringJoiner("-");
for (String name : names) {
stringJoiner.add(name);
}
System.out.println(stringJoiner); // A-B-C-D-E
// 设置开头结尾
String[] names1 = {"U", "V", "W", "X", "Y"};
StringJoiner stringJoiner1 = new StringJoiner("-", "[", "]");
for (String name : names1) {
stringJoiner1.add(name);
}
System.out.println(stringJoiner1); // [U-V-W-X-Y]
四、String类常用方法详解
public class TestDemo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "abcd";
// 根据索引获取对应的字符
char c = str.charAt(2);
System.out.println(c); // c
// 获取字符串的长度
System.out.println(str.length()); // 4
// 把字符串转换成字符数组
char[] chars = str.toCharArray();
System.out.println(chars); // abcd
// 把字符数组转换成字符串
char[] chs = {'h', 'e', 'l', 'l', 'o'};
String s = new String(chs);
System.out.println(s); // hello
// 把字符数组的一部分转换成字符串
// offset:表示截取字符数组的起始索引
// count:截取的长度
String s1 = new String(chs, 0, 3);
System.out.println(s1); // hel
String str2 = "中国人";
String str3 = "ABCD";
String str4 = "abcfadshadcabc.java";
// ctrl + alt + 左右
// 字符串是以字节数组形式存储
// 在比较两个字符数组的时候,是进行逐位比较
// 如果对应字符不相等返回的是字符之差
// 如果字符相同,返回的是长度之差
// 如果返回的是一个正数,对象 > 参数
// 如果返回的是一个负数,参数 > 对象
System.out.println(str2.compareTo(str3)); // 19948
// 忽略大小写比较
System.out.println(str2.compareToIgnoreCase(str3)); // 19916
// 把字符串转换成大写
System.out.println(str4.toUpperCase()); // ABCFADSHADCABC.JAVA
// 把字符串转换成小写
System.out.println(str3.toLowerCase()); // abcd
// 字符串的拼接 本质上是将两个字节数组合并成一个字节数组再转换成字符串返回
// concat效率低,不推荐
System.out.println(str2.concat("abc")); // 中国人abc
// 拼接字符串
System.out.println(String.join("-", "A", "B", "C", "D"));
// A-B-C-D
// 判断是否包含某一个字符串
System.out.println(str4.contains("ad")); // true
// 判断是否以...结束
System.out.println(str4.endsWith(".java")); // true
// 判断是否以...开始
System.out.println(str4.startsWith("https://")); // false
// 比较字符串是否相等
System.out.println("ABCD".equals(str3)); // true
// 忽略大小写比较字符串
System.out.println("abcd".equalsIgnoreCase(str3)); // true
// 把字符串转换成字节数组
// utf-8一个汉字占3个字节
byte[] bytes = str2.getBytes();
System.out.println(str2.length()); // 3
System.out.println(bytes.length); // 9
// 指定编码来将字符串转换成数组
// gbk 一个汉字占两个字节
byte[] gbks = str2.getBytes("gbk");
System.out.println(gbks.length); // 6
// 将字节数组转换成字符串
String s2 = new String(bytes, "utf-8");
System.out.println(s2); // 中国人
// 指定编码转换
String gbk = new String(gbks, "GBK");
System.out.println(gbk); // 中国人
String str5 = new String(gbks, 0, 4, "gbk");
System.out.println(str5); // 中国
// 同一个字符串的哈希码值是固定不变的
System.out.println("abc".hashCode()); // 96354
/**
* hashCode底层源码:
* public int hashCode() {
* int h = hash;
* if (h == 0 && value.length > 0) {
* hash = h = isLatin1() ? StringLatin1.hashCode(value)
* : StringUTF16.hashCode(value);
* }
* return h;
* }
*/
String str6 = "D:\\img\\hongkonga\\hello.png";
// 获取指定元素首次出现的索引,如果找不到返回-1
System.out.println(str6.indexOf('a', 1)); // 15
System.out.println(str6.indexOf("ka")); // -1
String str7 = new String("abc");
String str8 = "abc";
// 获取字符串的字面量
System.out.println(str8 == str7.intern()); // true
String str9 = "";
// 判断字符串是否是空 判断底层数组长度是否是0
System.out.println(str9.isEmpty()); // true
String str10 = " ";
// 判断字符串是否是空字符串或者全是空格
System.out.println(str10.isBlank()); // true
String str11 = "cksaocnao";
// 寻找对应字符最后一次出现的索引
int index = str11.lastIndexOf("a");
System.out.println(index); // 7
// 从fromIndex开始依次向前找
int index1 = str11.lastIndexOf("a", 7);
System.out.println(index1); // 7
String repeat = str11.repeat(3);
System.out.println(repeat); // cksaocnaocksaocnaocksaocnao
System.out.println(str11.replace('a', 'A'));
// cksAocnAo
System.out.println("=======================");
String str12 = "csabj46NDSJkcbja";
// 截取字符串 从beginIndex截取到最后
String substring = str12.substring(3);
System.out.println(substring); // bj46NDSJkcbja
// 截取一部分,包头不包尾
String substring1 = str12.substring(3, 6);
System.out.println(substring1); // bj4
String str13 = "D:\\img\\Macaoa\\world.png";
System.out.println(str13.substring(str13.lastIndexOf("\\") + 1));
// world.png
// 生成验证码
String uuid = UUID.randomUUID().toString();
System.out.println(uuid); // 8d8f0fff-b1f8-4491-b601-37a62b047464
String code = uuid.substring(0, 6);
System.out.println(code); // 8d8f0f
// 去除字符串两端空格
String str14 = " hello 我是 ";
System.out.println(str14.trim()); // hello 我是
System.out.println(new Object()); // java.lang.Object@4590c9c3
// 将对应的类型转换成字符串
String s3 = String.valueOf(10);
System.out.println(s3 + 1); // 101
String s4 = String.valueOf(new Object());
System.out.println(s4); // java.lang.Object@9629756
}
}
五、instanceof关键字
关键字:instanceof 用于判断类/接口和对象的关系
格式:对象 instanceof 类/接口
只要这个对象的实际类型是后面类或者其子类,或者接口的实现类,那么就返回true。
interface A{}
class B implements A{}
class C extends B{}
class D extends C{}
C c = new D();
c instanceOf A -- true
c instanceOf B -- true
c instanceOf C -- true
c instanceOf D -- true