一、StringBuffer类

对于String类:

  1. 每一个字符串的常量都属于一个String类的匿名对象,并且不可更改
  2. String由两个常量池:静态常量池和运行常量池
  3. 实例化对象建议使用直接赋值的形式完成,这样可以直接将对象保存在对象池中以方便下次重用

String类最大的弊端:内容不允许修改,未解决此问题,出现了StringBuffer类


StringBuffer不可以直接赋值来进行实例化对象,必须通过构造器
 
在String类中的“+”在编译之后都变为了StringBuffer中的append():
 


几个方法:

(1)指定位置插入元素:public StringBuffer insert(int offset, 变量类型  变量);
(2)删除此序列的子字符串中的字符:public StringBuffer delete(int start, int end)
子串开始于指定start并延伸到字符索引end – 1 ,或如果没有这样的字符存在的序列的结束。 如果start等于end ,则不作任何更改。
(3)返回指定子字符串第一次出现的字符串内的索引:public int indexOf(String str);
(4)用指定的String中的字符替换此序列的子字符串中的String :public StringBuffer replace(int start, int end, String str) ,(如果需要,此序列将被延长以容纳指定的字符串。)
(5)字符序列反转:public StringBuffer reverse(); 如果序列中包含任何替代对,则将它们视为单个字符进行反向操作。


StringBuffer还有一个兄弟,是jdk1.5出生的,StringBuilder,它的功能和StirngBuffer相同,但是比较一下源代码,StringBuilder的方法用synchronized修饰,而StringBuilder没有。最大的区别在于StringBuffer类中的方法属于线程安全的
 
StringBuilder类部分源码注释:

(1)不用synchronized修饰
(2)用于单个线程
(3)速度更快
 
 


经典话题:String类、StringBuffer、StringBuilder类的区别?

  • String类是字符串的首选类型,其最大的特点是内容不允许修改
  • StringBuffer和StringBuilder内容允许修改
  • StringBuffer在JDK1.0出生,属于线程安全操作,而StringBuilder在1.5出生,属于非线程安全操作
  • StringBuilder往往使用于单线程,速度更快

 

CharSequence接口

是一个描述字符串结构的接口,观察API,String、StringBuffer、StringBuilder都实现了这个接口
 

 

AutoCloseable接口

 
实现资源的自动关闭,在JDK1.7开始提供的
只有一个方法:

  • public void close() throws  Exception 异常关闭此资源,放弃任何潜在资源。

 

模拟手动关闭资源:

 


interface IMessage{
    void send();
}
class Message implements  IMessage{
    private String message;
    public Message(String message) {
        this.message = message;
    }
    public boolean open(){
        System.out.println("正在连接设备……");
        return true;
    }
    @Override
    public void send() {
        System.out.println("发送消息中……" + this.message);
    }
    public void close(){
        System.out.println("断开连接,节约资源……");
    }
}
public class Main {
    public static void main(String[] args) {
        Message message = new Message("www.yuhang.site");
        message.open();
        message.send();
        message.close();  // 手动关闭
    }
}

 
使用AutoCloceable接口


 

interface IMessage extends AutoCloseable{
    void send();
}
class Message implements  IMessage{
    private String message;
    public Message(String message) {
        this.message = message;
    }
    public boolean open(){
        System.out.println("正在连接设备……");
        return true;
    }
    @Override
    public void send() {
        System.out.println("发送消息中……" + this.message);
    }
    @Override
    public void close() throws Exception {
        System.out.println("断开连接,节约资源……");
    }
}
/**
 * @author Administrator
 */
public class Main {
    public static void main(String[] args) throws Exception {
        // AutoCloseable接口都要和异常挂钩
        try (Message message = new Message("www.yuhang.site")){
            message.open();
            message.send();
        }
    }
}

运行结果:

在程序中没有手动调用close()方法,但是最后也会自动关闭资源


代码编译器:IntelliJ IDEA 20.01

您必须 登录 才能发表评论