48-常用类-String类,StringBuffer类,StringBuilder类

48-常用类-String类,StringBuffer类,StringBuilder类 在编程中我们经常需要处理字符串。字符串在许多应用中都非常常见如用户输入、文本处理、文件操作等。Java 提供了String类来处理这些字符串数据。无论是存储文本、进行字符串的拼接、查找、替换还是对字符串进行格式化和比较String类都提供了非常强大的功能。在很多编程语言中字符串都是作为一个基础数据类型存在的。然而在 Java 中字符串是一个对象它是String类的实例。1.什么是String类String类是 Java 中用于表示字符串的类它是 Java 核心库的一部分。String是一个不可变immutable类这意味着一旦创建一个String对象其内容不能被修改。如果对字符串内容进行修改实际上会创建一个新的String对象。主要特点不可变性一旦创建String对象的内容不能修改。任何对String的修改操作都会创建一个新的String对象。内存优化由于String是不可变的JVM 会对字符串常量池进行优化共享相同的字符串常量节省内存。高效的字符串操作String类提供了许多操作方法使得字符串的操作更加简洁、直接和高效。补充1.String 对象用于保存字符串也就是一组字符序列2.jack”字符串常量双引号括起的字符序列3.字符串的字符使用Unicode字符编码一个字符(不区分字母还是汉字)占两个字节4.String 类有很多构造器构造器的重载常用的有 String s1new String();//String s2new string(string original);Strings3 new String(char[ ] a);Strings4 new String(char[ ] a,int startIndex,int count);String s5 new string(byte[ ] b);5.String 类实现了接口 SerializableString 可以串行化:可以在网络传输实现了接口 ComparableString 对象可以比较大小6.String 是final 类不能被其他的类继承2.创建String类的两种方式方式一直接赋值 String s hsp先从常量池查看是否有 hsp 数据空间如果有直接指向如果没有则重新创建然后指向。s最终指向的是常量池的空间地址。方式二调用构造器 String s new String(hsp”);先在堆中创建空间里面维护了value属性value属性指向常量池的hsp空间。如果常量池没有hsp”重新创建如果有直接通过value指向。s指向的是堆中的空间地址也就是value属性value属性指向常量池的hsp地址多了一个中间商。3.String对象特性public class StringExercise08{ public static void main(string[] args){ String ahello;//创建 a对象 String babc://创建 b对象 //老韩解读 //1.先创建一个 stringBuilder sb stringBuilder() //2.执行sb.append(hello); //3.执行sb.append(abc); //4.string c sb.tostring() //最后其实是c指向堆中的对象(String)value[]-指向池中helloabc String c a b; } }重要规则string c1 abcd。常量相加看的是池。 String c1 a b变量相加是在堆中。4.String常用方法String类的常见方法一览[了解即可]equals // 区分大小写判断内容是否相等equalslgnoreCase // 忽略大小写的判断内容是否相等length // 获取字符的个数字符串的长度indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1lastlndexOf //获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,返回-1substring //截取指定范围的子串substring(0,5)表示从索引0开始截取截取到索引 5-1 位置截取5个字符trim //去前后空格charAt获取某索引处的字符注意不能使用Str[index] 数组这种方式获取字符egString str hello” ;//str[0] 不对//str.charAt(0) htoUpperCase // 把字符转换成大写toLowerCase //把字符转换成小写concat // 拼接字符串replace // 替换字符串中的字符public class test { public static void main(String[] args) { s1 宝玉 and 林黛玉 林黛玉 林黛玉”; //在s1中将所有的林黛玉替换成薛宝钗 s2 s1.replace(林黛玉薛宝钗); System.out.println(s2);//宝玉 and 薛宝钗 薛宝钗 薛宝钗 //解读s1.replace()方法执行后返回的结果才是替换过的。注意对 s1 没有任何影响因为是s2接收的如果是s1接收的s1才变化了 } }split //分割字符串toCharArray // 转换成字符数组s happy; char[] chs s.tocharArray(); for(int i0;i chs.length; i){ System.out.println(chs[i]) }compareTo //比较两个字符串的大小ascll码值如果前者大,则返回正数后者大则返回负数如果相等返回0。format 格式化字符串5.Stringbuffer类在 Java 中String是一个不可变类也就是说每次对字符串进行修改操作例如拼接时都会创建一个新的String对象。这就导致了一个问题如果我们在循环中或频繁地进行字符串拼接操作程序会产生大量的临时对象从而浪费内存并影响性能。为了更高效地进行字符串拼接和修改Java 提供了StringBuffer类它是一个可变的字符序列能够在不创建新对象的情况下对字符串进行修改和操作。特点StringBuffer 继承 AbstractstringBuilder 类StringBuffer 实现了Serializable即StringBuffer的对象可以串行化可以网络传输 或 保存在文件中在父类中 AbstractStringBuilder 有属性 char[ ]value该属性不是final 该value 数组存放字符串内容位置存放在堆中的。StringBuffer是一个final类不能被继承因为StringBuffer字符内容是存在char[ ]value所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象)所以效率高于String构造器的使用1.父类会创建一个 大小为16的 char[ ] 用于存放字符内容StringBuffer stringBuffer new StringBuffer();2.通过构造器指定 char[ ]大小StringBuffer stringBuffer new StringBuffer(100);3.通过 给一个String 创建StringBufferchar[ ]大小就是 str.length() 16StringBuffer hello new StringBuffer(hello);1.String和StringBuffer相互转换1String —— StringBuffer方式1 使用构造器注意返回的才是StringBuffer对象对str本身没有影响String str hello tom; StringBuffer stringBuffer new StringBuffer(str);方式2 使用append方法StringBuffer stringBuffer1 new stringBuffer(); stringBuffer1 stringBuffer1.append(str);2 StringBuffer —— String方式1 使用StringBuffer提供的 toString方法StringBuffer stringBuffer3 new StringBuffer(韩顺平教育) String s stringBuffer3.tostring();方式2 使用构造器String s1 new String(stringBuffer3);2.StringBuffer类常用方法创建StringBuffer对象StringBuffer sb1 new StringBuffer(); // 创建空的 StringBuffer StringBuffer sb2 new StringBuffer(Hello); // 创建并初始化为 Hello StringBuffer sb3 new StringBuffer(50); // 创建指定初始容量的 StringBuffer追加字符串append()方法用于将指定的字符串追加到StringBuffer的末尾。StringBuffer sb new StringBuffer(Hello); sb.append( World); // 追加 World 后sb 的内容变为 Hello World插入字符串insert()方法可以将字符串插入到指定的位置。StringBuffer sb new StringBuffer(Hello World); sb.insert(6, Java ); // 在索引 6 处插入 Java sb 的内容变为 Hello Java World删除字符串delete()方法可以删除指定范围内的字符。StringBuffer sb new StringBuffer(Hello World); sb.delete(5, 11); // 删除从索引 5 到 10 的字符sb 的内容变为 Hello[5,11左闭右开替换字符串replace()方法可以替换指定范围内的字符。StringBuffer sb new StringBuffer(Hello World); sb.replace(6, 11, Java); // 将索引 6 到 10 的部分替换为 Javasb 的内容变为 Hello Java[6,11左闭右开反转字符串reverse()方法可以将StringBuffer中的字符顺序反转。StringBuffer sb new StringBuffer(Hello); sb.reverse(); // sb 的内容变为 olleH获取字符长度length()方法返回StringBuffer中当前字符的长度。StringBuffer sb new StringBuffer(Hello); int length sb.length(); // 返回 56.StringBuilder类在 Java 中String类是不可变的每次对字符串进行修改操作例如拼接、插入、替换等时都会创建一个新的String对象。这种特性在某些情况下可能导致性能问题尤其是当我们需要进行频繁的字符串拼接操作时。每次修改都会创建新的对象不仅浪费内存也会降低效率。为了解决这个问题Java 提供了StringBuilder类它是一个可变的字符序列专门用于高效地进行字符串拼接、插入、删除等操作。StringBuilder类是StringBuffer类的简易替换StringBuilder也能够避免每次修改时都创建新的对象但与StringBuffer不同的是StringBuilder不是线程安全的因此在单线程环境下性能更好单线程情况可优先使用。特点StringBuilder 继承 AbstractStringBuilder类实现了 Serializable说明StringBuilder对象是可以串行化(对象可以网络传输可以保存到文件)StringBuilder 是final类不能被继承StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[ ]value因此字符序列是存在堆中StringBuilder 的方法没有做互斥的处理即没有 synchronized 关键字因此在单线程的情况下推荐使用StringBuilder7.String类StringBuffer类StringBuilder类三类比较StringBuilder 和 StringBuffer 非常类似均代表可变的字符序列而且方法也一样String不可变字符序列效率低但是复用率高。StringBuffer可变字符序列、效率较高(增删)、线程安全StringBuilder可变字符序列、效率最高、线程不安全String使用注意说明string s a//创建了一个字符串s b//实际上原来的a字符串对象已经丢弃了现在又产生了一个字符串sb(也就是ab)。如果多次执行这些改变串内容的操作会导致大量副本字符串对象存留在内存中降低效率。如果这样的操作放到循环中会极大影响程序的性能 。小结如果我们需要对 String 做大量修改不要使用String总结使用的原则如果字符串存在大量的修改操作一般使用 StringBuffer 或StringBuilder如果字符串存在大量的修改操作并在单线程的情况使用 StringBuilder如果字符串存在大量的修改操作并在多线程的情况使用 StringBuffer如果字符串很少修改被多个对象引用使用String比如配置信息等