1,StringBuffer类
String的内容一旦声明则不可改变,如果改变,则改变的肯定是String的引用地址,如果现在要一个字符串经常改变,此时就必须使用StringBuffer类。
String:https://shao12138.blog.csdn.net/article/details/110419283#t9
1.1,String&StringBuffer&StringBuilder
String 字符串常量、StringBuffer 字符串变量(线程安全)、StringBuilder 字符串变量(非线程安全)
- String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变 的,直至这个对象被销毁。
- StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过 StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字 符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法 将其转换为一个String对象。
- java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。StringBuffer、StringBuilder都代表可变的字符串对象,它们有共同的父类 AbstractStringBuilder ,并且两个类的构造方法和成员方法也基本相同。不同的是,StringBuffer 是线程安全的,而StringBuilder是非线程安全的,所以StringBuilder性能略高。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同(是否添加了synchronize)。
在 Java 中,final 修饰的变量表示该变量的值不能被修改,但是如果 final 修饰的是对象引用,那么该对象的内容是可以被修改的。
1.2,StringBuffer基本方法
方法定义 | 类型 | 描述 |
public StringBuffer() | 构造 | StringBuffer的构造方法 |
public StringBuffer append(char c) | 方法 | 在StringBuffer中提供了大量的追加操作(类似于String中的+操作)可以向StringBuffer中追加内容,此方法可以添加任何数据类型。 |
public StringBuffer append(String str) | ||
public StringBuffer append(StringBuffer sb) | ||
public int indexOf(String str) | 方法 | 查找指定字符串是否存在 |
public int indexOf(String str,int fromIndex) | 方法 | 在指定位置处加上指定字符类型。 |
public StringBuffer insert(int offset,String str) | 方法 | 在指定位置处加上指定字符类型。 |
public StringBuffer reverse() | 方法 | 将内容反转保存 |
public StringBuffer replace(int start,int end,String str) | 方法 | 指定内容替换 |
public int length() | 方法 | 求出内容长度 |
public StringBuffer delete(int start,int end) | 方法 | 删除指定范围的字符串 |
public String substring(int start) | 方法 | 字符串截取,指定开始点 |
public String subString(int start,int end) | 方法 | 截取指定范围的字符串 |
public String toString() | 方法 | Object类继承的方法,用于将内容变为String类型 |
1, 字符串连接操作
StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("1,");stringBuffer.append("2"); System.out.println(stringBuffer); ================================================ 1,2
public class HelloWord { public static void main(String[] args) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("1,");stringBuffer.append("2"); System.out.println(stringBuffer); update(stringBuffer); System.out.println(stringBuffer); } public static void update(StringBuffer stringBuffer){ stringBuffer.append("-ysy"); } } ================================================= 1,2 1,2-ysy
从程序运行结果来看,将StringBuffer对象的内容传递到了fun()方法后,对StringBuffer的内容进行修改,而且操作完毕后修改的内容将被保留下来,所以与String比较StringBuffer的内容是可以修改的。
2,在任意位置处为StringBuffer添加内容
public class HelloWord { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("JAVA"); buffer.insert(0,"Hello "); System.out.println(buffer); } } ================================== Hello JAVA
3,字符串反转操作
public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("JAVA"); buffer.reverse().toString(); System.out.println(buffer); } ========================================= AVAJ
4,替换指定范围的内容
public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("Hello ");buffer.append("World!!"); buffer.replace(6,11,"JAVA"); System.out.println(buffer); } ================================ Hello JAVA!!
5,字符串截取
public class HelloWord { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("Hello ");buffer.append("World!!"); String str=buffer.substring(6,11); System.out.println(str); } } ============================================= World
6,删除指定范围的字符串
public class HelloWord { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("Hello ");buffer.append("World!!"); buffer.delete(6,14); System.out.println(buffer); } } ========================================== Hello
7,查找内容是否存在
public class HelloWord { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); buffer.append("Hello ");buffer.append("World!!"); if(buffer.indexOf("Hello")==-1){ System.out.println("没有找到指定的内容!"); }else{ System.out.println("可以查找到指定的内容!"); } } } ================================== 可以查找到指定的内容!
1.3,字符串拼接
拼接字符串有很多种方式,其中最常用的有4种:
- + 运算符:如果拼接的都是字符串直接量,则适合使用 “+” 运算符实现拼接;
如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。(案例:https://shao12138.blog.csdn.net/article/details/110419283#t11) 如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建 StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str) ,所以此时效率很低。
- StringBuilder:如果拼接的字符串中包含变量,并不要求线程安全,则适合使用StringBuilder;
- StringBuffer:如果拼接的字符串中包含变量,并且要求线程安全,则适合使用StringBuffer;
StringBuilder/StringBuffer都有字符串缓冲区,缓冲区的容量在创建对象时确定,并且默认为 16。当拼接的字符串超过缓冲区的容量时,会触发缓冲区的扩容机制,即缓冲区加倍。缓冲区频繁的扩容会降低拼接的性能,所以如果能提前预估最终字符串的长度,则建议在创建可变 字符串对象时,放弃使用默认的容量,可以指定缓冲区的容量为预估的字符串的长度。
- String类的concat方法:如果只是对两个字符串进行拼接,并且包含变量,则适合使用concat方法;
concat方法的拼接逻辑是,先创建一个足以容纳待拼接的两个字符串的字节数组,然后先后将两 个字符串拼到这个数组里,最后将此数组转换为字符串。 在拼接大量字符串的时候,concat方法的效率低于StringBuilder。但是只拼接2个字符串时, concat方法的效率要优于StringBuilder。并且这种拼接方式代码简洁,所以只拼2个字符串时建议 优先选择concat方法。
2,Runtime类
2.1,认识Runtimel类
在Java中Runtime类表示运行时操作类,是一个封装了JVM进程的类,每一个JVM都对应着一个Runtime类的实例,此实例由JVM运行时为其实例化。所以在JDK文档中读者不会发现任何有关Runtime类中的构造方法的定义,这是因为Runtime类本身的构造方法是私有化的&#x