声明:这是上次写完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. ubuntu wubi.exe 直接加载下载好的 amd64.tar.xz

    玩了这么久的LINUX,一直都是直机装UBUNTU,虚一下XP的,后来不得不直机用WIN7,只能WUBI装一下UBUNTU了.不得不说,在WIN7下虚一个UBUNTU真是相当麻烦.网络那块很是难搞,而 ...

  2. Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)

    首次打开Dynamic CRM  2013会出现一个欢迎界面如下图,要想它不出现勾选图中的复选框就行,OK下回再打开就没有了. 但是当我们打开F12开发人员工具,清除域的缓存后再次打开CRM,这个欢迎 ...

  3. 03_Android NDK中C语言调用Java代码,javah的使用,javap的使用以及生成签名,Android.mk的编写,C代码的编写

     1  案例场景,通过C语言回调Java的代码,案例的最终界面: 2  案例的代码结构如下: 3 编写DataProvider的代码: package com.example.ndkcallbac ...

  4. Android调试工具之ADB

    Android调试工具之ADB 1.     什么是ADB adb的全称为Android Debug Bridge,顾名思义,这个是PC机与Android设备的连接桥.简单的说,就是通过adb ,PC ...

  5. 2014新年福利,居然有人将Ext JS 4.1的文档翻译了

    原文:http://damoqiongqiu.iteye.com/blog/1998022

  6. 《java入门第一季》之面向对象(匿名对象)

    /* 匿名对象:就是没有名字的对象. 匿名对象的应用场景: A:调用方法,仅仅只调用一次的时候. 注意:调用多次的时候,不适合. 匿名对象调用完毕就是垃圾.可以被垃圾回收器回收,释放了系统资源. B: ...

  7. LM**项目开发感悟

    LM**项目开发感悟 经过一个多月的项目开发,自己主要负责服务端业务逻辑的实现.服务端采用纯servlet完成,自己是在已有的项目架构上进行编程,对于所使用的架构,自己还没有认真的研究过,但明白其用到 ...

  8. 【一天一道LeetCode】 #3 Longest Substring Without Repeating Characters

    一天一道LeetCode (一)题目 Given a string, find the length of the longest substring without repeating charac ...

  9. linux服务搭建----NFS服务搭建

    nfs  服务     //配置脚本         /etc/exports     //服务器  发布目录     1> 确定需要发布的目录(想要共享的目录)     例如:      想发 ...

  10. C语言之linux内核实现最大公约数算法

    最大公约数算法,又称欧几里德算法,至今已有几千年的历史了.在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算. 两个整数的最大 ...