1.字符串的内存分配
-
String类型是字符串类型,是一个类,是一个引用数据类型
-
字符串的值是常量,存储在常量池中
-
常量是无法修改的
-
-
字符串的两种赋值方式会造成不同的内存分配
-
String str = "小明";
-
在常量池中先找有没有”小明“这个常量,如果有,就将其地址存在栈中名为str的空间处;如果没有,就先创建这个常量,然后再将其地址存在栈中名为str的空间处。
-
String str = new String("小明");
-
在常量池中先找有没有”小明“这个常量,如果没有,就先创建,如果有就将其在常量池中的地址存储在堆中new出来的空间处,然后栈中名为str的空间里存储堆中新开辟的这个空间地址
-
-
所以使用equals而不是==比较字符串相等
-
String str = "小明";//创建了一个对象 String str2 = "小明";//没有创建对象 String s1 = new String("小红");//创建了两个对象 String s2 = new String("小红");//创建了一个对象
2.字符串的应用
-
length()返回字符串的长度
-
参数 无 返回值 字符串长度 类型int
-
public static void main(String[] args) { //使用length() 获取字符串长度,注意和数组长度做区分 Scanner input = new Scanner(System.in); System.out.println("请输入账号"); String username = input.next(); //判断账号长度是否>=6 if (username.length() >= 6){ System.out.println("该账号可以使用"); System.out.println(username.length());//6 } else { System.out.println("账号长度不能小于6位!"); } }
-
-
equals()比较字符串是否相等
-
equalsIgnoreCase()
-
参数:要比较的目标字符串
-
返回值:是否相等 boolean
-
String s1 = "java"; String s2 = "Java"; System.out.println(s1.equalsIgnoreCase(s2));//true
-
-
toUpperCase() toLowerCase()转换大小写
-
参数:目标字符串
-
返回值:转换大小写后的字符串String
-
String s1 = "我爱学java"; s1 = s1.toUpperCase(); System.out.println(s1);//我爱学JAVA
-
-
indexOf() (从左往右)查找某个字符或字符串在指定字符串中首次出现的位置
-
参数:目标字符串
-
返回值:目标字符串第一次出现的位置
-
public static void main(String[] args) { //A.indexOf(B) (从左到右)查找字符串A中字符串B第一次出现的位置, //如果A中不包含字符串B,则返回-1 //字符的位置也是从0开始 String email = "123@123@4"; //打印@符在email中的位置 System.out.println(email.lastIndexOf("@"));//3 System.out.println(email.indexOf("@"));//7 if (email.lastIndexOf("@") == -1) { System.out.println("非法的邮箱"); } else { System.out.println("合法的邮箱"); } }
-
lastIndexOf()(从右往左)
-
String email = "123@123@4"; //打印@符在email中的位置 System.out.println(email.lastIndexOf("@")); System.out.println(email.indexOf("@"));//7 只是查找的方向变了,下标还是从左往右
-
-
substring() 截取字符串
-
参数:截取范围的下标 int,int
-
返回值:截取出的字符串 String
-
-
//A.substring(begin, end); 截取字符串A下标begin到end范围内的字符串 //begin开始下标 end结束下标 //[ ) 包含头,不包含尾 String name = "张三丰"; String firstName = name.substring(0,1); //如果想从某个位置一直截取到字符串末尾,可以省略end String lastName = name.substring(1); //String lastName = name.substring(1,3); System.out.println(firstName); System.out.println(lastName); }
-
substring和indexOf搭配使用
-
85 //可以使用indexOf()先找到要截取的位置 String email = "123434@qq.com"; String qq = email.substring(0,email.indexOf("@")); System.out.println(qq);
-
-
concat() 连接字符串,作用和”+“相同
-
参数:要连接的目标字符串
-
返回值:连接后的字符串 String
-
//A.concat(B) 把字符串A和B连接起来 String s1 = "Hello"; String s2 = "World"; System.out.println(s1 + s2); System.out.println(s1.concat(s2));
-
-
split() 字符串拆分
-
参数:拆分依据 String
-
返回值:拆分后的字符串数组,String[]
-
//A.split(B) 将字符串A按照字符串B拆分成字符串数组 String s1 = "白日依山尽,黄河入海流,欲穷千里目,更上一层楼"; String [] strs = s1.split(","); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); }
-
拆分后B消失
-
3.StringBuffer类
-
为什么使用StringBuffer
-
因为字符串频繁修改时,会因为它在内存中存储方式的特点,会造成资源的浪费,可以使用StringBuffer代替String
-
-
StringBuffer是一个类,可以创建对象,其对象可以调用方法
-
常用方法
-
append() 追加
-
参数:连接的目标字符串
-
返回值: StringBuffer类型
-
虽然有返回值,但是可以不用,返回值是这个对象拼接后的自己
-
-
//A.append(B) 把B追加到A后面 StringBuffer strBuffer = new StringBuffer("hello"); //StringBuffer 的连接不能使用+ ,可以使用append进行连接 strBuffer.append("world"); String s1 = "hello"; String s2 = s1 + "world"; System.out.println(strBuffer);
-
StringBuffer和String的方法不是共通的,可能有很多同名方法,也有很多独属于自己的方法。
-
insert(index,ch)将指定字符或字符串插入到StringBuffer的指定位置
-
StringBuffer strBuffer = new StringBuffer("hello"); strBuffer.insert(0,"!"); System.out.println(strBuffer);
-
-
String 和 StringBuffer的互相转换
-
StringBuffer strBuffer = new StringBuffer("hello"); //转换为String String s1 = strBuffer.toString(); //转换为StringBuffer,将字符串放入new StringBuffer()小括号中做参数 StringBuffer stringBuffer = new StringBuffer(s1);
-
-
StringBuffer相对于String的优点
-
String是不可变的对象,每次对String类型进行改变时都等同于生成了一个新的对象,然后将变量指向这个新的String对象
-
StringBuffer则不同,每次对StringBuffer做拼接时,都是在对StringBuffer本身进行操作,而不是生成新的对象
-