本文目录一览:
- java stringbuilder和stringbuffer的区别
- 请问JAVA中的BufferedReader是什么意思?
- JAVA中StringBuffer与StringBuilder、String的区别是什么?
- stringbuilder和stringbuffer的区别
- Java SE使用StringBuffer和StringBuilder的时机有什么不一样?到底哪个更适合多线程的环境?
- Java中有很多输入输出类,为啥还要有个Buffer的输入输出类呢?有没有Buffer的有啥差别?
java stringbuilder和stringbuffer的区别
是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity
、append
、insert
、indexOf
等公共方法。
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
类型的流作为前端流,并可以指明缓冲区的大小。
扩展资料:
输入输出原理:
BufferedReader
和BufferedWriter
类各拥有8192个字符的缓冲区。当BufferedReader
在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()
方法,会先从缓冲区中进行读取。
如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter
时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
BufferedReader
字符流以字符为单位传输数据的流,输入流程序可以从中读取数据的流。
参考资料来源:百度百科-缓存流
参考资料来源:百度百科-java.io
JAVA中StringBuffer与StringBuilder、String的区别是什么?
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串操作类。
1. 可变与不可变
String
类中使用字符数组保存字符串,如下就是,因为有final
修饰符,所以可以知道String
对象是不可变的。private final char value[];
StringBuilder
与StringBuffer
都继承自AbstractStringBuilder
类,在AbstractStringBuilder
中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。char[] value;
2. 是否多线程安全
String
中的对象是不可变的,也就可以理解为常量,显然线程安全。AbstractStringBuilder
是StringBuilder
与StringBuffer
的公共父类,定义了一些字符串的基本操作,如expandCapacity
、append
、insert
、indexOf
等公共方法。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共同点
StringBuilder
与StringBuffer
有公共父类AbstractStringBuilder
(抽象类)。- 抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder
、StringBuffer
的方法都会调用AbstractStringBuilder
中的公共方法,如super.append(...)
。只是StringBuffer
会在方法上加synchronized
关键字,进行同步。- 最后,如果程序不是多线程的,那么使用
StringBuilder
效率高于StringBuffer
。
stringbuilder和stringbuffer的区别
- 在执行速度方面的比较:
StringBuilder
>StringBuffer
StringBuffer
与StringBuilder
,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String
一样创建一些对象进行操作,所以速度就快了。StringBuilder
:线程非安全的
StringBuffer
:线程安全的 当我们在字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder
的操作是安全的,虽然它的速度最快,但是可以保证StringBuffer
是可以正确操作的。当然大多数情况下我们是在单线程下进行的操作,所以大多数情况下建议用StringBuilder
不用StringBuffer
,就是速度的原因。
对于三者使用的总结:
- 如果要操作少量的数据用 =
String
- 单线程操作字符串缓冲区下操作大量数据 =
StringBuilder
- 多线程操作字符串缓冲区下操作大量数据 =
StringBuffer
Java SE使用StringBuffer和StringBuilder的时机有什么不一样?到底哪个更适合多线程的环境?
StringBuilder
和 StringBuffer
没有硬性规定哪个用于多线程环境。
他们都继承 AbstractStringBuilder
抽象类,只是 StringBuffer
内部方法比 StringBuilder
的内部方法有同步处理。
当多个线程操作一个 StringBuffer
对象时有同步操作保证数据的安全。
比如在一些方法内的字符串拼接,一般都用 StringBuilder
提高性能。
没有涉及到多线程访问的地方都可以用 StringBuilder
。
这需要你对多线程同步/Lock方面的知识多多了解。
想知道这两个类有什么区别,在JDK安装里的 src.zip
源码里可以找到答案。
Java中有很多输入输出类,为啥还要有个Buffer的输入输出类呢?有没有Buffer的有啥差别?
Buffer的输入输出类是对流的一种封装,封装后可以提供一些高级方法使用更方便。就相当于一个工具,有工具能更省事更省力,不用当然没问题。
没有Buffer也是可以的,但是没有Buffer处理起来就会麻烦一些。比如需要读取一行,你当然可以读取流的每个字符直到换行符,不过用Buffer的话一句readLine
就行了。