声明:这是上次写完String和StringBuffer后的补充(看上次的请复制链接在搜索栏粘贴访问)

链接:http://www.cnblogs.com/ytsbk/p/7420581.html

一、String、StringBuffer、StringBuilder三者的区别

1.消耗内存

a.当只进行一次简单的声明并不怎么用到的时候:

例如:

String s = "abc";//String s = new String("abc");
StringBuffer sBuffer = new StringBuffer("abc");
StringBuilder sBuilder = new StringBuilder("abc")

结论a:String比起StringBuffer和StringBuilder看起来舒服,三者使用的内存也大致相同。

b.当对一个字符串进行反复更改时:

例如:

public static void main(String[] args) {
String s = null;
double startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10; j++) {
s = s + "哈";
}
}
double endTime = System.currentTimeMillis();
System.out.println("String所用时间"+(endTime-startTime));
}

运行图:

public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("a");
double startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10; j++) {
sBuffer.append("哈");
}
}
double endTime = System.currentTimeMillis();
System.out.println("StringBuffer所用时间"+(endTime-startTime));
}

运行图:

public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder("a");
double startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10; j++) {
sBuilder.append("哈");
}
}
double endTime = System.currentTimeMillis();
System.out.println("StringBuilder所用时间"+(endTime-startTime));
}

运行图:

结论b:可以看出若进行多次操作时消耗的时间:String >>> StringBuilder>StringBuffer,可以知道他们三个在内存中所占用的空间也是相同的排序。

2.线程安全与否

结论:可以看到只有StringBuffer是线程安全的,String和StringBuilder是线程不安全的,从这里也可以看出StringBuilder比StringBuffer在一定情况下相对快的原因;

所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,使用StringBuilder。

二、第一眼看可能会出错的面试题!

1.请看下面程序运行的结果

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb1 = new StringBuffer("abc");
System.out.println(sb);
System.out.println(sb1);
System.out.println(sb.equals(sb1));
System.out.println(sb == sb1);

请认真思考一下:记下自己的答案!!!往下看结果

运行图:

有没有答对?

小伙伴说 :“==”比较的是地址,两个不一样可以理解,但是为啥.equals()方法比较也是错的呢,不是说.equals()是比较内容的吗?

其实这个是因为.equals()方法本来是Object类的方法,只是String类继承下来并把他重写了(下面有截图),但是StringBuffer他只继承但并没有重写

而Object中的.equals()方法就是和“==”一样的!!!所以StringBuffer使用.equals和使用“==”是一样的,都是比较的首地址。

String:

 Object:

请接着看第二题↓

2.请问程序运行的结果

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb1 = sb.append("abc");
System.out.println(sb1 == sb);
System.out.println(sb1.equals(sb));
System.out.println(sb);
System.out.println(sb1);

请认真思考一下:记下自己的答案!!!往下看结果

 

 

运行结果:

哈哈哈☺☺☺!有没有答对呢?

原因就是append()方法会直接在堆内存的字符串上添加新的字符串,而栈内存中的引用一直都指的是原来的空间首地址;

两个的引用都指向sb字符串的首地址。至于equal和“= =”还是上一个题的解释! 

最后:写在这里是想把自己所学的分享给大家,方便大家学习,同时也有助于自己记忆,如果有哪里不对的恳请指正!祝大家身体健康,工作顺利!

java中你不知道的字符串知识!!!的更多相关文章

  1. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  2. 详解Java中的字符串

    字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...

  3. [原创]Java中的字符串比较,按照使用习惯进行比较

    java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值. 但是很多情况下,我们开发一 ...

  4. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  5. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...

  6. Java中的字符串拼接

    Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...

  7. java中,字符串类型的时间数据怎样转换成date类型。

    将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...

  8. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

  9. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

随机推荐

  1. leetcode之word ladder

    对于之前没有接触过该类型题目的人来说,此题无疑是个难题,本人提交了10次才正确通过,期间遇到了非常多的问题,感觉几乎把OJ的所有错误遍历了一遍,下面详细说说自己做该题的经验. 首先承认,我一开始并没有 ...

  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(四)

    下面我们来实现选手从起点开始移动到终点的代码. 首先在GameScene.h接口中添加matchRun方法: #import "CCNode.h" @interface GameS ...

  3. 小强的HTML5移动开发之路(3)——HTML5与HTML4比较

    来自:http://blog.csdn.net/dawanganban/article/details/17652873 在前面介绍了HTML5的新特性,新标签的使用,智能表单设计,引入多媒体对象,C ...

  4. PSAM 卡的应用 操作方法

    PSAM 卡的应用        PSAM 功能 终端安全存储模块        PASM  常用于 脱机交易的 安全认证        脱机交易的流程          1.卡片对持卡人的认证(防止 ...

  5. Graph Cut and Its Application in Computer Vision

    Graph Cut and Its Application in Computer Vision 原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut- ...

  6. C 打印格式小记

    转自:http://blog.csdn.net/fivedoumi/article/details/7077504 d,lx,ld,,lu,这几个都是输出32位的 hd,hx,hu,这几个都是输出16 ...

  7. 安卓学习笔记--已root设备应用请求root权限

    网上查到的方法 Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " ...

  8. 在linux下制作静态库和动态链接库的方法

    静态库 .o文件的集合 制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ... 编译 gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径 ...

  9. 一个简单的ruby生成器例子(用连续体Continuation实现)

    ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能. ...

  10. webservice入门简介

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...