Java那些事儿之字符串和列表

来源:互联网 发布:linux dhcp服务器设置 编辑:程序博客网 时间:2024/06/05 19:30
   大年初六,周围还洋溢着浓厚的节日气氛,这几天亲戚们也走的差不多了,我是个闲不住的人,想想就来总结总结java基础吧。大家一起来探讨学习。
一:StringStringBufferStringBuilder

StringStringBuffer
性能比较:StringBuffer的字符串拼接效率不一定比String高惊讶
String str = "a"+"b"+"c";StringBuffer buffer = new StringBuffer();buffer.append("a").append("b").append("c");


        哪个效率更高呢?如果你说这里的StringBuffer效率更高的话,那你就错了,原因是对于jvm来说,他会把String str = "a"+"b"+"c";看成String str = "abc";来解析,因此效率更高。如果是下面的代码,效率就会更低了。
String s1 = "a";String s2 = "b";String s3 = "c";String str = s1+s2+s3;

由于String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,而StringBuffer的append或者是insert操作都是对其本身操作,并不产生新的对象。
在这里,String str = s1+s2+s3;是在操作多个String对象的引用,比起StringBuffer仅仅操作一个对象而言,String在做这种字符串拼接的操作中,性能是非常低的。
让我们做以下测试:
String:执行结果1170毫秒。
long stime = new Date().getTime();String str = "";for (int i = 0; i < 10000; i++) {str+="s"+i;}long etime = new Date().getTime();System.out.println("消耗时间:"+(etime-stime)+" 毫秒");


StringBuffer:执行结果23毫秒。
long stime = new Date().getTime();StringBuffer buf = new StringBuffer();for (int i = 0; i < 10000; i++) {buf.append("s"+i);}long etime = new Date().getTime();System.out.println("消耗时间:"+(etime-stime)+" 毫秒");


总结:在需要频繁做字符串拼接操作的时候,在String和StringBuffer中优先选择StirngBuffer提高性能。

StringBufferStringBuilder

我们在使用StringBuffer和StringBuilder视乎感觉不到他们的不同,StringBuilder和StringBuffer的使用方法完全相同,其实StringBuilder的设计就是用来作为一种更简单的
替换StringBuffer,然而StringBuilder并不保证线程安全,至于性能差异我们还是以代码来表现:
StringBuiler:执行结果24毫秒。
long stime = new Date().getTime();StringBuilder bui = new StringBuilder();for (int i = 0; i < 10000; i++) {bui.append("s"+i);}long etime = new Date().getTime();System.out.println("消耗时间:"+(etime-stime)+" 毫秒");


总结:在单线程下执行的效果看来,两者的执行效率几乎没有差别,但是由于StringBuilder不保证线程安全,也就意味着,它可以append或者是insert操作可以同时被多个线程执行,这样的话,StringBuilder的执行效率显然就比StringBuffer高了。因此在一般情况下建议优先采用StringBuilder。

二:线性列表链式列表
   ArrayList线性列表
 * 优点:通过下标快速定位,查询快,效率高。
 * 缺点:添加,删除需要移动大量元素(#重置下标),效率低。

    LinkedList链式列表
 * 优点:添加,删除只需改变其引用,效率高。
 * 缺点:通过引用取值意味着每次都需要将数组全部遍历一遍,效率低。
总结为两点:
①.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针(因为链式列表保存时时对象引用)。 
②.对于新增和删除操作add和remove,LinkedList优于ArrayList,因为ArrayList要移动数据(更新下标)。 
 测试:ArrayList耗时:140
            LinkedList耗时:7
 static long timeList(List list){       long start=System.currentTimeMillis();       for(int i=0;i<10000;i++)           list.add(0, i);       return System.currentTimeMillis()-start;       }       public static void main(String[] args) {           System.out.println("ArrayList耗时:"+timeList(new ArrayList()));           System.out.println("LinkedList耗时:"+timeList(new LinkedList()));       } 
后续更新中。。。



1 0