Java那些事儿之字符串和列表
来源:互联网 发布:linux dhcp服务器设置 编辑:程序博客网 时间:2024/06/05 19:30
大年初六,周围还洋溢着浓厚的节日气氛,这几天亲戚们也走的差不多了,我是个闲不住的人,想想就来总结总结java基础吧。大家一起来探讨学习。
一:String,StringBuffer,StringBuilderString和StringBuffer
性能比较: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提高性能。
StringBuffer和StringBuilder
我们在使用StringBuffer和StringBuilder视乎感觉不到他们的不同,StringBuilder和StringBuffer的使用方法完全相同,其实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链式列表
* 优点:添加,删除只需改变其引用,效率高。
* 缺点:通过引用取值意味着每次都需要将数组全部遍历一遍,效率低。
* 优点:通过下标快速定位,查询快,效率高。
* 缺点:添加,删除需要移动大量元素(#重置下标),效率低。
LinkedList链式列表
* 优点:添加,删除只需改变其引用,效率高。
* 缺点:通过引用取值意味着每次都需要将数组全部遍历一遍,效率低。
总结为两点:
①.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针(因为链式列表保存时时对象引用)。
②.对于新增和删除操作add和remove,LinkedList优于ArrayList,因为ArrayList要移动数据(更新下标)。
测试:ArrayList耗时:140
LinkedList耗时:7
测试: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
- Java那些事儿之字符串和列表
- Java字符串那些事儿
- 【java解惑】java字符串比较那些事儿
- Java中字符串的那些事儿
- C++对象模型的那些事儿之五:NRV优化和初始化列表
- Java那些事儿之线程安全
- Linux那些事儿 之 戏说USB(37)字符串描述符
- Linux那些事儿 之 戏说USB(33)字符串描述符
- Java编程那些事儿
- Java编程那些事儿
- Java编译那些事儿
- Java this 那些事儿
- Java super 那些事儿
- Java数组那些事儿
- Java编译那些事儿
- Java正则那些事儿。。
- 曹胜欢,java那些事儿
- Java编程那些事儿
- c#学习——异常处理
- poj2104
- SQl2008配置管理工具服务显示远程过程调用失败
- HDU 3247 ac自动机+bfs+状态压缩dp
- Tornado的StaticHandler中Mimetype编码错误
- Java那些事儿之字符串和列表
- 二叉树
- C++之旅-如何运用Visual studio 2008 生成C++程序?
- (补)链表剖析之循环链表剖析
- 顺序搜索
- 幸运数
- Struts2-UI
- 洛谷 P1846 游戏
- 跳表(SkipList)与其在java中的使用