?
API | 解释 |
---|
public int length() | 返回字符串的长度。 | public char charAt(int index) | 根据下标获取字符。 | public boolean contains(String str) | 判断当前字符串中是否包含str。public char[] toCharArray() :将字符串转换成数组。 | public int indexOf(String str) | 查找str首次出现的下标,存在,则返回该下标:不存在,则返回-1。 | public int lastIndexOf(String str) | 查找字符串在当前字符串中最后一次出现的下标索引。 | public String trim() | 去掉字符串前后的空格。 | public String toUpperCase() | 将小写转成大写。 | public boolean endWith(String str) | 判断字符串是否以str结尾。 | public String replace(char oldChar, char newChar) | 将旧字符串替换成新字符串 | public String[] split(String str) | 根据str做拆分。 |
?
String 方式一:直接赋值String s = “hsp”; 方式二:调用构造器 String s2 = new String(“hsp”);
- 方式一:先从常量池查看是否有"hsp”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址。
- 方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
String对象特性
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的
String str = “abc” String str = new String(“abc”) 更改str的值,就是更改str指向的value/常量池的地址 一个value只能指向一个常量池中的字符串,value还在堆中,value指向的字符串还保存在常量池中
?
字符串相加 字符串变量 = 常量相加;字符串的地址在池中 字符串变量 = 变量相加;字符串的地址在堆中 String a = “hello”; //创建a对象 String b = “abc”; //创建b对象
String c = a + b;
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c.hashCode());
c = c + "1";
System.out.println(c.hashCode());
? 可变字符串
- String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低(String 底层维护的是private final char value[] 是一个final属性,因此不能改变值)
- StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上是更新内容,不用更新地址,效率较高(StringBuffer底层维护的是char[] value 每次更新都是将新数据复制到value中,不用改变地址)
StringBuffer
- StringBuffer的直接父类是 AbstractstringBuilder
- StringBuffer实现了Serializable,即StringBuffer的对象可以串行化
- 在父类中 AbstractStringBuilder有属性 char[] value,不是final 该value 数组存放字符串内容,存放在堆中的
- StringBuffer是一个 final类,不能被继承
- 因为StringBuffer字符内容是存放在char[] value,所有的变化(增加/删除)都是对数组操作
不用每次都更换地址(即不是每次创建新对象),所以效率高于String ?
String与StringBuffer相互转换
String s = "hello";
StringBuffer b1 = new StringBuffer(s);
StringBuffer b2 = new StringBuffer();
b2.append(s);
String s2 = b1.toString();
方式2:
String s3 = new String(b1);
? StringBuilder
- 一个可变的字符序列。此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
- 在 StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
? String、StringBuffer、StringBuilder的比较
- StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
- String:不可变字符序列,效率低,但是复用率高。
- StringBuffer:可变字符序列、效率较高(增删)、线程安全
- StringBuilder:可变字符序列、效率最高、线程不安全)
?
String使用注意说明: string s=“a”; //创建了一个字符串 s +=“b”;//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String做大量修改,不要使用String
? ?
String类
String结构剖析
String创建剖析
演示字符串另一种创建方式
String对象特性
字符串变量 = 常量相加;字符串的地址在池中 字符串变量 = 变量相加;字符串的地址在堆中
题2 ex.str指向堆中Text1空间的str,str指向常量池中的“java” ex.ch指向堆中Text1空间的ch 调用ex.change(ex.str,ex.ch)方法 相当于 String str = ex.str; char ch[] = ex.ch; str 指向堆中Text1空间的str ch 指向堆中Text1空间的ch
str = “java” str 指向常量池中的java对象 ch[0] = ‘h’
当方法执行完,这个栈空间就销毁了 因此,最后输出 hsp and hava
String常用方法
判断字符串长度 返回字符串在指定位置的字符 判断字符串是否包含指定字符串 字符串转换为对应的数组
返回字符串首次出现的位置
返回字符串最后一次出现的位置 去掉字符串前后的空格 将字符串中的小写字母转换为大写字母
将字符串中的大写字母转换为大写字母 判断指定的字符串是否是字符串的结尾 判断指定的字符串是否是字符串的开头
用新的字符或字符串替换旧的字符或字符串
分割字符串
判断两个字符串是否相等 判断字符串大小 如果字符串都一样,那就对比大小 String案例演示
可变字符串
StringBuffer
String与StringBuffer相互转换
1、添加
2、插入 3、替换 4、删除 5、清空 查找
比较String和StringBuff的效率
StringBuilder
总结
|