题目

String、StringBuilder、StringBuffer有什么异同?

解答

相同点:String、StringBuilder、StringBuffer都可以用来存储字符串。

不同点:

1、String与StringBuilder、StringBuffer的不同点主要在于,String对象创建之后,是不可改变的,平时我们对同一个String变量赋值,实际上是创建了个新的对象。而后两者是可变的,这意思就是说,他们可以在同一内存地址上更改它的值,而无需创建新的对象。

2、StringBuilder与StringBuffer的不同点在于,StringBuffer是线性安全的,但是它比StringBuilder要慢。

参考代码

StringBufferThreadSafeTest

package me.huangzijian;

public class StringBufferThreadSafeTest {

    public static void main(String[] args) {

        //测试StringBuffer线程安全部分
String s = "123456789";
StringBuffer stringBuffer = new StringBuffer(s);
StringBuilder stringBuilder = new StringBuilder(s); SbfReverseThread sbfRT1 = new SbfReverseThread(stringBuffer);
SbfReverseThread sbfRT2 = new SbfReverseThread(stringBuffer);
SbdReverseThread sbdRT1 = new SbdReverseThread(stringBuilder);
SbdReverseThread sbdRT2 = new SbdReverseThread(stringBuilder); new Thread(sbfRT1).start();
new Thread(sbfRT2).start();
new Thread(sbdRT1).start();
new Thread(sbdRT2).start(); //测试StringBuffer比StringBuilder慢部分,注意不要同时运行两个循环,一次运行一个,这样才精确
long startTime2 = System.currentTimeMillis();
for (int i = 0; i <= 10000000; i++) {
stringBuffer.reverse();
}
long endTime2 = System.currentTimeMillis();
System.out.println("StringBuffer循环1000次所需时间:" + (endTime2 - startTime2) + "ms"); long startTime1 = System.currentTimeMillis();
for (int i = 0; i <= 10000000; i++) {
stringBuilder.reverse();
}
long endTime1 = System.currentTimeMillis();
System.out.println("StringBuilder循环1000次所需时间:" + (endTime1 - startTime1) + "ms");
}
}

SbfReverseThread

package me.huangzijian;

public class SbfReverseThread implements Runnable {

    StringBuffer stringBuffer;

    public SbfReverseThread(StringBuffer stringBuffer) {
this.stringBuffer = stringBuffer;
} @Override
public void run() {
for (int i = 0; i <= 1000; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
stringBuffer.reverse();
System.out.println("StringBuffer:" + stringBuffer);
}
}
}

SbdReverseThread

package me.huangzijian;

public class SbdReverseThread implements Runnable {

    StringBuilder stringBuilder;

    public SbdReverseThread(StringBuilder stringBuilder) {
this.stringBuilder = stringBuilder;
} @Override
public void run() {
for (int i = 0; i <= 1000; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
stringBuilder.reverse();
System.out.println("StringBuilder:" + stringBuilder);
}
}
}

从结果可以看出:

1.StringBuilder对于字符串123456789,两个线程运行到一段时间,就开始混乱,不再是123456789或者987654321了,而StringBuffer无论重复多少次,依然是123456789或者987654321。

2.我机器上,StringBuffer字符串反转运行10000000,用时370ms足有,而StringBuilder字符串反转运行10000000,只需要150ms左右,可见StringBuilder比StringBuffer快。

每天一道Java题[5]的更多相关文章

  1. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  2. 每天一道Java题[11]

    题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...

  3. 每天一道Java题[4]

    问题 怎么将字符串转换为int? 解答 此题看似简单,但经常出现在笔试等地方,由于大家习惯了用IDE,有什么还真未必能写出来.通常都是parseInt()方法进行转换,如下: Int n = Inte ...

  4. 每天一道Java题[6]

    题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的 ...

  5. 每天一道Java题[9]

    题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...

  6. 每天一道Java题[1]

    问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...

  7. 每天一道Java题[2]

    问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode( ...

  8. 每天一道Java题[7]

    题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则 ...

  9. 每天一道Java题[10]

    题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread ...

随机推荐

  1. 【2017-04-01】JS字符串的操作、时间日期的操作、函数、事件、动画基础

    一.字符串的操作 1.转大写: s.toLowerCase(); 2.转大写: s.toUpperCase(); 3.字符串的截取: s.substr(3,4);      -从索引3开始截取,截取4 ...

  2. Java内存泄露实例

  3. Shell括号之间的区别

    前言 初次学习Shell,对于括号的使用肯定很困惑,所以我打算将其整理成一篇文章 单括号 { } 表达变量的值,在不引起歧义的时候可以省略大括号 例子: var=1 echo ${var} # 或者e ...

  4. 关于WAMPserver配置httpd.conf无法修改根目录解决方法

    最近在学习php开发, 在慕课网上先听了安装配置WAMP server的课,可是第二步配置网站根目录的地方就出错了,按照网课上讲的将httpd.conf文件中的 [Document] 和[Direct ...

  5. Maven项目热部署到Tomcat容器下

    第一步: 配置Tomcat的登陆的用户名与密码     在 apache-tomcat-7.0.33\conf\ tomcat-users.xml,第40行添加如下: <role rolenam ...

  6. Struts2基础学习(三)—Result和数据封装

    一.Result      Action处理完用户请求后,将返回一个普通的字符串,整个普通字符串就是一个逻辑视图名,Struts2根据逻辑视图名,决定响应哪个结果,处理结果使用<result&g ...

  7. Java 9 尝鲜之JShell交互式编程环境

    JShell--Java 9 的交互式编程环境 本文要求读者有基本的 Java 知识. Tips Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容.也就是说,用 Java 9 写的代 ...

  8. java中创建对象中使用默认构造函数的注意点

    public class Test3 {   private int n;   Test3() {      System.out.println("调用默认构造器");   }  ...

  9. js解决苹果移动端300ms延迟的问题

    做移动端页面开发的可能会了解到,ios系统click事件会有卡顿的现象,这个问题的根源是苹果本身自带的safari有双击放大页面的功能,再次双击会返回到原始尺寸,所以在第一次点击的系统会延迟300ms ...

  10. Python实现二叉树的四种遍历

    对于一个没学过数据结构这门课程的编程菜鸟来说,自己能理解数据结构中的相关概念,但是自己动手通过Python,C++来实现它们却总感觉有些吃力.递归,指针,类这些知识点感觉自己应用的不够灵活,这是自己以 ...