java中的String类
String类:
创建和操作字符串。【创建以后不能改变】, 每一次拼接都会产生新的字符串。
1.构建:可以赋空值
String name="下饭";
String[] arr=new String[20];
通过集合的方式构建:
ArrayList<String> strArray=new ArrayList<String>();
2.常用方法:
char=对象名.charAt(int index);//通过下标获取字符串中对应的值
"字符串A".equals("字符串B");//比较两个字符串是否相等 通过内容比较
String a1="susu";
String a2="susu";
System.out.println(a1.equals(a2));//true
String a3= new String("susu");
System.out.println(a1.equals(a3));//true
indexOf("");//查找参数字符串 在当前字符串中出现的位置 从前往后
lastIndexOf("");
3.正则表达式 (详细见正则表达式详解)
字符串.matches("规则");
如果字符串满足定义的规则 那么返回true
4.replace(old,new);//拿新的字符串换旧的字符串
5.分割字符串split
String name="n,am,e,sdf";
String[] split = name.split(",");
for(String id:split) {
System.out.println(id);
}
注意:分隔| , + , * , ^ , $ , / , | , [ , ] , ( , ) , - , . 等字符,都要前面加上"\\"
6.subString(beginIndex,endIndex);//返回字符串为该字符串的子字符串
7.StringBuffer
使用缓冲区解决每次拼接都产生新字符串的问题
StringBuffer的对象能够被多次修改,并且不产生新的字符串(线程安全)
String StringBuffer StringBuilder区别
1)String 不可变(编译器可以将字符串设为共享的) StringBuffer StringBuilder可变
(StringBuffer StringBuilder内部维护的是字符数组 每次操作都是改变字符数组的状态,避免创建大量的对象)
2)StringBuffer线程安全,有缓冲区;String是final修饰的类,也是线程安全
3)性能上:一般StringBuilder > StringBuffer > String
String str = "hello"+ "world"的效率就比 StringBuilder st = new StringBuilder().append("hello").append("world")要高。
4)是否重写了equals 和hashCode
String重写了equals()方法和hashCode()方法,new String("java").equals(new String("java"))的结果为true;
而StringBuffer没有实现equals()方法和hashCode()方法,因此,new StringBuffer("java").equals(new StringBuffer("java"))的结果为false,将StringBuffer对象存储进Java集合类中会出现问题。
补充:
==和equals的区别:
== 对于基本数据类型 比较的是数值 对于引用类型的变量,比较的是所指向的对象的地址
equals不能比较基本数据类型 ,比较的是否是同一个对象, 如果像String、Date类有重写,比较的是所指向的对象的内容。(包装器类型一般有重写)
8.
String name=" sdf";
name=name+"df";
System.out.println(name);//sdfdf
问题:既然String类型字符串不可更改,为什么又能打印出上述结果?
实际上原来的“sdf”字符串已经被丢弃了。
String a="susu"; String a1="susu"; System.out.println(a==a1);//true 同一个对象 String a2=new String("susu"); System.out.println(a2==a1);//false 不同对象地址不同 System.out.println(a2.equals(a));//true String b="susu123"; String b1=a+"123"; String b2= a.concat("123"); System.out.println(b==b1);//false 产生了新对象 利用了StringBuilder.append()方法 System.out.println(b==b2);//false 产生了新对象 字符串数组的复制数组方法 Arrays.copyOf()方法 System.out.println(b=="susu"+"123");//true 系统编译期自动优化 自动拼接字符串 指向常量池中的对象 System.out.println(b.equals(b2));//true
concat 方法和 + 拼接:
相同点:都可以进行字符串拼接 都会产生新对象
区别:+可以将非string类型转成string
+ 利用的是stringbuffer的append方法产生了更多对象