java中的buffer抽象类,Java中buffer

发布时间:2022-11-17

本文目录一览:

  1. java stringbuilder和stringbuffer的区别
  2. 请问JAVA中的BufferedReader是什么意思?
  3. JAVA中StringBuffer与StringBuilder、String的区别是什么?
  4. stringbuilder和stringbuffer的区别
  5. Java SE使用StringBuffer和StringBuilder的时机有什么不一样?到底哪个更适合多线程的环境?
  6. Java中有很多输入输出类,为啥还要有个Buffer的输入输出类呢?有没有Buffer的有啥差别?

java stringbuilder和stringbuffer的区别

是否多线程安全 String中的对象是不可变的,也就可以理解为常量,显然线程安全。 AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacityappendinsertindexOf等公共方法。 StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:

public synchronized StringBuffer reverse() {
    super.reverse();
    return this;
}
public int indexOf(String str) {
    return indexOf(str, 0); // 存在 public synchronized int indexOf(String str, int fromIndex) 方法
}

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。 StringBuilder与StringBuffer共同点 StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。 抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。 StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。 最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

请问JAVA中的BufferedReader是什么意思?

BufferedReader是缓存流的一个类。 缓存流是计算机领域中输入输出流的一种常见形式。包括BufferedInputStream/BufferedOutputStream 类和BufferedReader/BufferedWriter类。 BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。缓存流是过滤流,在创建具体流时需要给出一个InputStream / OutputStream 类型的流作为前端流,并可以指明缓冲区的大小。

扩展资料:

输入输出原理:

BufferedReaderBufferedWriter类各拥有8192个字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。 如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。 BufferedReader字符流以字符为单位传输数据的流,输入流程序可以从中读取数据的流。 参考资料来源:百度百科-缓存流
参考资料来源:百度百科-java.io

JAVA中StringBuffer与StringBuilder、String的区别是什么?

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串操作类。

1. 可变与不可变

  • String类中使用字符数组保存字符串,如下就是,因为有final修饰符,所以可以知道String对象是不可变的。
    private final char value[];
    
  • StringBuilderStringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
    char[] value;
    

2. 是否多线程安全

  • String中的对象是不可变的,也就可以理解为常量,显然线程安全。
  • AbstractStringBuilderStringBuilderStringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacityappendinsertindexOf等公共方法。
  • StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
    public synchronized StringBuffer reverse() {
        super.reverse();
        return this;
    }
    public int indexOf(String str) {
        return indexOf(str, 0); // 存在 public synchronized int indexOf(String str, int fromIndex) 方法
    }
    
  • StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

3. StringBuilder与StringBuffer共同点

  • StringBuilderStringBuffer有公共父类AbstractStringBuilder(抽象类)。
  • 抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
  • StringBuilderStringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
  • 最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer

stringbuilder和stringbuffer的区别

  1. 在执行速度方面的比较:StringBuilder > StringBuffer
  2. StringBufferStringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
  3. StringBuilder:线程非安全的
    StringBuffer:线程安全的 当我们在字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然它的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下我们是在单线程下进行的操作,所以大多数情况下建议用StringBuilder 不用StringBuffer,就是速度的原因。

对于三者使用的总结:

  1. 如果要操作少量的数据用 = String
  2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer

Java SE使用StringBuffer和StringBuilder的时机有什么不一样?到底哪个更适合多线程的环境?

StringBuilderStringBuffer 没有硬性规定哪个用于多线程环境。 他们都继承 AbstractStringBuilder 抽象类,只是 StringBuffer 内部方法比 StringBuilder 的内部方法有同步处理。 当多个线程操作一个 StringBuffer 对象时有同步操作保证数据的安全。 比如在一些方法内的字符串拼接,一般都用 StringBuilder 提高性能。 没有涉及到多线程访问的地方都可以用 StringBuilder。 这需要你对多线程同步/Lock方面的知识多多了解。 想知道这两个类有什么区别,在JDK安装里的 src.zip 源码里可以找到答案。

Java中有很多输入输出类,为啥还要有个Buffer的输入输出类呢?有没有Buffer的有啥差别?

Buffer的输入输出类是对流的一种封装,封装后可以提供一些高级方法使用更方便。就相当于一个工具,有工具能更省事更省力,不用当然没问题。 没有Buffer也是可以的,但是没有Buffer处理起来就会麻烦一些。比如需要读取一行,你当然可以读取流的每个字符直到换行符,不过用Buffer的话一句readLine就行了。