不可变的字符串:String 创建完毕之后内容不能改变,改变之后就是一个新的对象;
可变的字符串:StringBuilder \ StringBuffer,当该对象创建完毕之后,当内容发生改变时,对象保持不变
字符串的本质:一个char类型的数组;String其实就是对插入数组的封装;
String对象的创建
通过字面量: String str1 = "hello";
最多创建一个对象,最少不创建对象;
如果在常量池中存在所创建的对象,那么此时可以 直接引用 不创建String对象
否则 先在常量池创建内存空间 在引用
通过构造器: String str2 = "hello";
至少创建一个String对象 最多创建两个String对象
new关键字绝对会在堆空间创建内存空间 所以至少创建一个对象;
区分:
String对象的空值:
表示引用为空: String str1 = null; 没有初始化,没有分配内存空间
表示内容为空: String str2 = ""; 已经初始化,分配内存空间,不过没有内容
判断字符串非空:
if(str != null && str!''''.equals()(str.trim())){
System.out.println("非空");
}else{
System.out.println("空");
}
字符串的比较操作:
使用 "==": 只能比较引用的内存地址是否相同
使用equals()方法: 在Object类中和 "==" 相同,建议子类覆盖 ; 去比较内容; String中覆盖了该方法,比较的是字符串内容;
单独使用 " " 创建的字符串都是直接量 , 编译时期就已经存储在常量池中;
使用new String(" ")创建的字符串会存储在堆空间中,在运行事情才会创建;
使用包含直接量字符串连接符进行连接创建的字符串 , 也是直接量在编译时期就已经存储在常量
池中;
使用包含String直接量(无final修饰符) 的字符串表达式创建的字符串表达式,(s1 + "aa") 创建的对
象是运行时期才创建的,存储在堆中;
(通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译器优化)
String的相关操作:
char[]数组和byte[]数组 与 String字符串的相互转化;
- String str1 = new String(char[]数组);//把char数组转化为字符串
- String类型.toCharArray();//把String字符串转化为char[]数组;
- String字符串.geBytes();//把字符串转化为byte[]数组;
- String str2 = new String(byte[]数组);//把byte[]数组转化为String字符串;
获取字符串信息:
- int len1 = String.length();//获取一个字符串的长度
- char ch1 = String.charAt(index 索引值);//返回索引值所对应的char值;
- int num1 = String.indexOf(String 子字符串); // 返回子字符串在父字符串中第一次出现的索引;
- int num1 = String.lastIndexOf(String 子字符串);//返回子字符串在父字符串中最后一次出现的索引;
字符串的大小写转换:
- String.toUpperCase();//把字符串全部转换为大写
- String.toLowerCase();//把字符串全部转换为小写
- String[] 数组名 = String字符串.split(正则表达式);
- 根据给定的正则表达式拆分字符串;
startsWith(String 判定条件);// 字符串是否以判定条件为开头;
String在做字符串拼接时效率极低;因为String是不可改变的,每次连接字符串都是创建新的对象;
Stringbuffer与Stringbuilder的区别;
都表示可变的字符串,功能方法都是相同的;
区别在于:
StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全问题;性能较低;
StringBuilder都没有使用synchronized修饰,不安全,但性能较高;
建议使用StringBuilder;线程安全问题可以解决;
使用StringBuilder的默认无参数构造器,在底层默认创建了一个长度为16的char数组;
此时该数组只能存储16个字符,如果超过了,则会自动扩容;(创建更长的数组,再把之前的数组拷贝过去,效率低);
一般的,事先大概知道需要存储多少字符,应该直接传入参数;
常用操作:
StringBuilder.append(object obj);//往当前字符串追加内容
StringBuilder deleteCharAt();//删除指定位置的字符串;
StringBuilder.reverse();//字符串的反转操作;