理解:字符串

001.String创建方式

//创建一个字符串对象hi,名为s1
String s1 = "hi";
//创建一个空字符串对象,名为s2
String s2 = new String();
//创建一个字符串对象hi,名为s3
String s3 = new String("hi");

复制代码

002.String常用方法

equals()             比较内容是否相同
length()             获取长度
charAt(int index)    获取指定字符
subString()          截取
getBytes()           字符串转byte数组
toCharArray()        字符串转char数组
indexOf()            字串第一次出现的下标索引
lastIndexOf()        子串最后一次出现的下标索引
replace(old,new)     替换
trim()               前后除空格
toLowerCase()        转小写
toUpperCase()        转大写
复制代码

003.字符串与byte数组间相互转换

//字符串转byte数组
String str = "Java 学习";
byte[] arr = str.getBytes();
for(int i=0;i<arr.length;i++){
	System.out.print(arr[i]+" ");
}
System.out.println();
//byte数组转字符串
String str1= new String(arr);
System.out.println(str1);
复制代码

004.==和equals方法区别

  • ==
    • 基本类型时,比较是值
    • 引用类型时,比较是地址
  • equals
    • 比较是两个对象的内容

String str1="java";
String str2="java";
String str3 = new String("java");
System.out.println("str1和str2的内容相同?"+str1.equals(str2)); //true
System.out.println("str1和str3的内容相同?"+str1.equals(str3)); //true

System.out.println("str1和str2的地址相同?"+(str1==str2));  //true
System.out.println("str1和str3的地址相同?"+(str1==str3));  //false
复制代码

005.字符串的不可变性

String str1 = "java";
str1 = "hello "+str1;
//str1不再指向"java"所在的内存空间,而是指向了"hello java"
System.out.println(str1);       //hello java
复制代码

006.String和StringBuffer、StringBuilder区别

  • 可变性(本质区别)
    • 不可变字符串 String (内容改变,对象也会改变)
    • 可变字符串StringBuffer和 StringBuilder(内容改变,对象不会改变)
  • 线程安全
    • String是线程安全
    • StringBuffer是线程安全,内部使用了synchronized修饰
    • StringBuilder不是线程安全

007.StringBuilder和StringBuffer

0071.常用方法

//以StringBuilder举例

//append() 追加内容到末尾
StringBuilder str = new StringBuilder("你好");
str.append(",java");
str.append(",").append("一起学习");
System.out.println(str); //你好,java,一起学习

//length() 长度
System.out.println(str.length()); //12

//delete() 删除
System.out.println(str.delete(7,12)); //你好,java

//replace() 替换
System.out.println(str.replace(7, 12, ",好好好")); //你好,java,好好好

//substring() 截取
System.out.println(str.substring(9,11)); //好好

//insert() 将内容插入到指定位置
System.out.println(str.insert(5, "第五位置")); //你好,ja第五位置va,好好好

//reverse() 反转
System.out.println(str.reverse()); //好好好,av置位五第aj,好你
复制代码

0072.StringBuilder和StringBuffer区别

  • 线程安全(本质区别):
    • StringBuffer是线程安全(方法有synchronized修饰),效率低;
    • StringBuilder是线程不安全,效率高;
  • 执行速度
    • StringBuilder>StringBuffer

008.一些题

String a="a";
String b="b";
String c = a+b;         //在堆上创建的新的对象
String d = new String("ab");
String e = "a"+"b";     //常量池中的对象
String h = "ab"; 
System.out.println(e==h);   //true
System.out.println((a+b).equals(c)); //true
System.out.println(e==c);          //false
System.out.println(c==d);            //false
System.out.println(c.equals(d));     //true
复制代码

009.总结

  • 操作少量的数据,适用String;
  • 单线程操作字符串缓冲区下操作大量数据,适用StringBuilder;
  • 多线程操作字符串缓冲区下操作大量数据,适用StringBuffer;

猜你喜欢

转载自juejin.im/post/5dda93e651882572fe6edf55