Java中字符串的全部知识_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 voidmain(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));

}

运行图:

159958b1e00bea183676ffb32318ec9b.png

public static voidmain(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));

}

运行图:

636a57c3a4f49dd760691ccf8e950c91.png

public static voidmain(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));

}

运行图:

2909327b228c03add9a3ef31ac11ffc4.png

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

2.线程安全与否

b55f98a95697aaf6c51b640242d6c0e5.png

结论:可以看到只有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);

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

运行图:

959ab37854170e2a0ab03b2983005642.png

有没有答对?

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

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

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

String:

a00e1d57f5c1c67b15f15206285d4e5e.png

Object:

f61eb7eb418282be7e2c47663f35618f.png

请接着看第二题↓

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);

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

运行结果:

b14b84f96986f48922c789df4cc90cfc.png

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值