什么是字符串
把多个字符串连一起啊
字符串本质
在JDK9.0之前
其实是一个 char[] 数组
private final char value[];
根据 UTF-16,JAVA 的内部编码格式,编译成了 Class 文件,然后送给 JVM 执行,一个 UTF-16 字符占2个字节,不管是什么样的 char 都是 2 个字节
存在的问题
JDK8 的字符串存储在 char 类型的数组里面,在大多数情况下,char 类型只需要一个字节就能表示出来了,比如各种字母什么的,两个字节存储势必会浪费空间,JDK9 的一个优化就在这,内存的优化
JDK9.0
private final byte[] value;
JDK9 是由 byte 类型的数组来进行存储的
在 JDK9 的 String 类中,维护了这样的一个属性 coder,它是一个编码格式的标识,使用 LATIN1 还是 UTF-16
String
String创建
- 直接赋值 String str = “xhh”;
- 通过构造器来创建 String str1 = new String(“xhh”);
字符串的比较
- == 比较两个内存地址是否相等
- 使用 equals 它是在 object 和 == 相同
字符串对象值为空
- 表示引用为空: String str = null;还没有初始化,没有分配内存空间
- 表示空字符串:String str = “”;已经创建了对象,已经分配了内存,内容为空
字符串常用方法
//把一个char数组可以转换成字符串 char[] cs = new char[] {'A','B','C'}; String str = new String(cs); System.out.println(str); //返过来也是可以的(把一个字符串转成char类型的数组) char[] cs2 = str.toCharArray(); //获取字符串当中的信息 String str2 = "myxq"; //返回字符串长度 System.out.println(str2.length()); //获取字符串当中的某一个字符 System.out.println(str2.charAt(2)); //返回一个子字符串在字符串当中 的第一次出的一个位置 String str3 = "ABCDEFCDGCD"; String str4 = "CD";
字符串分类
不可变字符串String
定义好之后,就不能再去改变了 (内存地址不可变)
可变的字符
定义好之后,还可以进行修改,改变时,不会创建新的内存地址
StringBuilder
StringBuffer
可变字符串
StringBuilder
是没有 synchronized
效率高一些
StringBuffer
方法前面多了一个 synchronized 加锁,更安全,效率低了一些
效率测试
String
static void testString() { long begin = System.currentTimeMillis(); String str = ""; for (int i = 0; i <= 10000; i++) { str += i; } long last = System.currentTimeMillis(); long res = last - begin; System.out.println(res); }
StringBuilder
static void testBuilder() { long begin = System.currentTimeMillis(); StringBuilder str = new StringBuilder(); for(int i = 0; i <= 10000000; i++) { //str += i; str.append(i); } long last = System.currentTimeMillis(); long res = last -begin; System.out.println(res); }
StringBuffer
static void testBuffer() { long begin = System.currentTimeMillis(); StringBuffer str = new StringBuffer(); for (int i = 0; i <= 10000000; i++) { //str += i; str.append(i); } long last = System.currentTimeMillis(); long res = last - begin; System.out.println(res); }
//StringBuilder 创建方法的使用 //创建的可变字符串,初始容量为16 //如果超过的话,它会自动扩容 //可变字符串,本质 还是一个char类的数组 StringBuilder sb = new StringBuilder("myxq"); //StringBuilder sb2 = new StringBuilder(16); System.out.println(sb.capacity()); //链式编程 sb.append("abcdefg"); sb.append("123"); System.out.println(sb); //删除指定位置 的字符 sb.deleteCharAt(1); System.out.println(sb); //可变字符转成不可变 String s = sb.toString(); //字符串的反转 System.out.println(sb.reverse());