java中你不知道的字符串知识!!!
声明:这是上次写完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中你不知道的字符串知识!!!的更多相关文章
- 第76节:Java中的基础知识
第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...
- 详解Java中的字符串
字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...
- [原创]Java中的字符串比较,按照使用习惯进行比较
java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值. 但是很多情况下,我们开发一 ...
- 理解Java中的字符串类型
1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...
- Java中的字符串驻留
转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...
- Java中的字符串拼接
Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...
- java中,字符串类型的时间数据怎样转换成date类型。
将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...
- Android学习笔记----Java中的字符串比较
用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...
- 转载:Java中的字符串常量池详细介绍
引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...
随机推荐
- leetcode之word ladder
对于之前没有接触过该类型题目的人来说,此题无疑是个难题,本人提交了10次才正确通过,期间遇到了非常多的问题,感觉几乎把OJ的所有错误遍历了一遍,下面详细说说自己做该题的经验. 首先承认,我一开始并没有 ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(四)
下面我们来实现选手从起点开始移动到终点的代码. 首先在GameScene.h接口中添加matchRun方法: #import "CCNode.h" @interface GameS ...
- 小强的HTML5移动开发之路(3)——HTML5与HTML4比较
来自:http://blog.csdn.net/dawanganban/article/details/17652873 在前面介绍了HTML5的新特性,新标签的使用,智能表单设计,引入多媒体对象,C ...
- PSAM 卡的应用 操作方法
PSAM 卡的应用 PSAM 功能 终端安全存储模块 PASM 常用于 脱机交易的 安全认证 脱机交易的流程 1.卡片对持卡人的认证(防止 ...
- Graph Cut and Its Application in Computer Vision
Graph Cut and Its Application in Computer Vision 原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut- ...
- C 打印格式小记
转自:http://blog.csdn.net/fivedoumi/article/details/7077504 d,lx,ld,,lu,这几个都是输出32位的 hd,hx,hu,这几个都是输出16 ...
- 安卓学习笔记--已root设备应用请求root权限
网上查到的方法 Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " ...
- 在linux下制作静态库和动态链接库的方法
静态库 .o文件的集合 制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ... 编译 gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径 ...
- 一个简单的ruby生成器例子(用连续体Continuation实现)
ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能. ...
- webservice入门简介
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...