每天一道Java题[5]
题目
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]的更多相关文章
- 每天一道Java题[3]
问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...
- 每天一道Java题[11]
题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...
- 每天一道Java题[4]
问题 怎么将字符串转换为int? 解答 此题看似简单,但经常出现在笔试等地方,由于大家习惯了用IDE,有什么还真未必能写出来.通常都是parseInt()方法进行转换,如下: Int n = Inte ...
- 每天一道Java题[6]
题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的 ...
- 每天一道Java题[9]
题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...
- 每天一道Java题[1]
问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...
- 每天一道Java题[2]
问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode( ...
- 每天一道Java题[7]
题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则 ...
- 每天一道Java题[10]
题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread ...
随机推荐
- 关于VO中的Attribute的问题
对于新手来说,有些时候会遇到VO中的Attribute的各种问题; 总结如下:1,你页面上输入了值,但是点击保存之后值并不能存到数据库,这个是因为该字段在VO中不是基于EO的 2,你将一个VO中的E ...
- MySQL---事务知识,你搞明白没有?
MySQL - 事务 在学习事务这一概念前,我们需要需要构思一个场景 场景构思 假设该场景发生于一个银行转账背景下,月中,又到了发工资的日子.潭州教育科技集团打算给Tuple老师发放一个月的工资.(此 ...
- ng自带的表单验证
几点注意:使用ng的表单验证,需要给form,input,textarea一个name 要求:验证输入框的内容(长度,正则,必填,),当验证不通过的时候,就禁用提交按钮 使用的验证:ng-maxlen ...
- poj 3128 Leonardo's Notebook (置换群的整幂运算)
题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd9 ...
- activiti 一个流程的运转步骤 以请假流程为例
---为了加深对activiti的理解记忆,对自己做的一个流程进行自述.加强记忆 请假实例 一.设计请假的流程图以及流程文件,完善对应数据项,比如用户信息,请假单信息 --请假单 --流程图 --流程 ...
- memcached+tomcat转发forward时 sessionid一直变化的问题
今天遇到了一个很奇怪的问题, 我在tomcat过滤器 中, 对请求过来的静态资源及html页面做了forword转发操作,核心代码如下: private void redirectMobile(Htt ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 初学 Java Script (数据类型)
简介:JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.Javascript脚本语言同其他语言一样,有它自 ...