- 浏览: 54236 次
- 性别:
- 来自: 深圳
最新评论
-
sdm_seven:
吊 解决了我的问题
jboss5.1启动错误:java.lang.IllegalArgumentException: Wrong arguments. -
mycream:
吖的,最近发现这招不太灵了。因为项目比较赶,也没细看是什么原因 ...
端口占用解决方案 Windows xp -
xiao2004:
定义一个progn就完了。 (defun move ( ...
Lisp 语言学习--if 语句有问题
在看 JDK 1.6 的源码,用以补习自己的 Java 基础。
java.util 包中包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
在这里对 List 进行一个小结。
在接口定义中描述为:
简单的说 List 的特性:有序,允许重复元素,实现迭代器。
下面看具体的实现类,包括
Vector
Stack
ArrayList
LinkedList
ArrayDeque
Vector 和 Stack 是遗留的 collection 类。Vector 的所有方法都标识有 synchronized 以保证其线程同步的特性。
Stack 继承至 Vector 并添加了堆栈相关的特性(pop, push, peek)。因为其继承关系,其所有方法也是线程安全的。
ArrayList 是在 JDK 1.2 中对数据结构相关的工具类重新抽象整理的结果,在功能上与 Vector 完全一至,但去除了对线程安全的保证。
不过可以通过
来实现线程安全。故在代码中应该优先考虑使用 ArrayList 而非 Vector。
ArrayList 使用数组的形式实现数据存储,在添加数据的过程中会按照 (size * 3 )/2 + 1 的规则自动扩充。对比 Vector,Vector 可设置一个自增量,在需要扩充时自动增加自增量大小的空间或自动增大到原大小的一倍(自增量设置为0或小于0时)。
LinkedList 使用内部类的形式存储数据,失去了 ArrayList 随机访问数据的特性(可随机访问的列表会实现标识接口 RandomAccess)。LinkedList 实现了 Queue 和 Deque 接口,使其实现了队列及双向队列的特性。但在 JDK 1.6 版本之后,建议优先使用 ArrayDeque 来实现队列和堆栈,以获得更高的运行时效率。
在数据量非常大的时候,可以使用 LinkedList 以获得平衡的数据添加效率。因为 LinkedList 不需要去重新开辟新的 array 空间。(add at 2011-03-31)
以上列表的实现都可以插入 null,但这一操作是不被推荐的。因为在一些方法中,null 会用作特殊用途。如队列(Queue),pop()方法返回 null 表示队列为空。
ArrayDeque 是在 JDK 1.6 中引入的新类。此类实现了 List, Deque 接口,是一个双向队列实现。在此队列中使用数组存储数据,使用两个指针记录列队的头尾以实现循环队列。因为是循环队列的实现,因此该队列牺牲了随机访问的特性而节约了空间的开销。但其访问效率在 LinkedList 之上,在 JDK 文档中被推荐代替 LinkedList 和 Stack 类。
========
一些好玩的测试:
java.util 包中包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
在这里对 List 进行一个小结。
在接口定义中描述为:
引用
有序的 collection (也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。……
简单的说 List 的特性:有序,允许重复元素,实现迭代器。
下面看具体的实现类,包括
Vector
Stack
ArrayList
LinkedList
ArrayDeque
Vector 和 Stack 是遗留的 collection 类。Vector 的所有方法都标识有 synchronized 以保证其线程同步的特性。
Stack 继承至 Vector 并添加了堆栈相关的特性(pop, push, peek)。因为其继承关系,其所有方法也是线程安全的。
ArrayList 是在 JDK 1.2 中对数据结构相关的工具类重新抽象整理的结果,在功能上与 Vector 完全一至,但去除了对线程安全的保证。
不过可以通过
List list = Collections.synchronizedList(new ArrayList(...));
来实现线程安全。故在代码中应该优先考虑使用 ArrayList 而非 Vector。
ArrayList 使用数组的形式实现数据存储,在添加数据的过程中会按照 (size * 3 )/2 + 1 的规则自动扩充。对比 Vector,Vector 可设置一个自增量,在需要扩充时自动增加自增量大小的空间或自动增大到原大小的一倍(自增量设置为0或小于0时)。
LinkedList 使用内部类的形式存储数据,失去了 ArrayList 随机访问数据的特性(可随机访问的列表会实现标识接口 RandomAccess)。LinkedList 实现了 Queue 和 Deque 接口,使其实现了队列及双向队列的特性。但在 JDK 1.6 版本之后,建议优先使用 ArrayDeque 来实现队列和堆栈,以获得更高的运行时效率。
在数据量非常大的时候,可以使用 LinkedList 以获得平衡的数据添加效率。因为 LinkedList 不需要去重新开辟新的 array 空间。(add at 2011-03-31)
以上列表的实现都可以插入 null,但这一操作是不被推荐的。因为在一些方法中,null 会用作特殊用途。如队列(Queue),pop()方法返回 null 表示队列为空。
ArrayDeque 是在 JDK 1.6 中引入的新类。此类实现了 List, Deque 接口,是一个双向队列实现。在此队列中使用数组存储数据,使用两个指针记录列队的头尾以实现循环队列。因为是循环队列的实现,因此该队列牺牲了随机访问的特性而节约了空间的开销。但其访问效率在 LinkedList 之上,在 JDK 文档中被推荐代替 LinkedList 和 Stack 类。
========
一些好玩的测试:
public void testHashCode() { List list = new ArrayList(); System.out.println("hashcode:" + list.hashCode()); // hashcode:1 list.add(null); System.out.println("hashcode:" + list.hashCode()); // hashcode:31 list.add(null); System.out.println("hashcode:" + list.hashCode()); // hashcode:961 }
public void testTime() { int N = 100000; List<String> arrayList = new ArrayList<String>(N); List<String> linkedList = new LinkedList<String>(); for (int i = 0; i < N; i++) { arrayList.add("" + i); linkedList.add("" + i); } { Iterator<String> it = arrayList.iterator(); Date start = new Date(); StringBuffer sb = new StringBuffer(); while (it.hasNext()) { sb.append(it.next()); } Date end = new Date(); System.out.println("\ntime for arrayList used iterator:" + (end.getTime() - start.getTime())); start = new Date(); sb = new StringBuffer(); for (int i = 0; i < arrayList.size(); i++) { sb.append(arrayList.get(i)); } end = new Date(); System.out.println("\ntime for arrayList used for loop:" + (end.getTime() - start.getTime())); } { Iterator<String> it = linkedList.iterator(); Date start = new Date(); StringBuffer sb = new StringBuffer(); while (it.hasNext()) { sb.append(it.next()); } Date end = new Date(); System.out.println("\ntime for linkedList used iterator:" + (end.getTime() - start.getTime())); start = new Date(); sb = new StringBuffer(); for (int i = 0; i < linkedList.size(); i++) { sb.append(linkedList.get(i)); } end = new Date(); System.out.println("\ntime for linkedList used for loop:" + (end.getTime() - start.getTime())); } } // output:(单位是毫秒) // time for arrayList used iterator:16 // time for arrayList used for loop:15 // time for linkedList used iterator:0 // time for linkedList used for loop:92168
public void testArrayCopy () { // Prepare arrays User[] array = new User[10]; for (int i = 0; i < 10; i++) { array[i] = new User("" + i); } User[] newArray = new User[10]; System.arraycopy(array, 2, newArray, 1, 8); for (User user:newArray) { System.out.print(", " + user); } System.out.println(); // modify array newArray[1].setName("change"); for (int i = 0; i < 10; i++) { System.out.print(", " + array[i]); } } class User{ String name; protected User() { } public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return " \"" + name + "\" "; } } // output: // , null, "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , null // , "0" , "1" , "change" , "3" , "4" , "5" , "6" , "7" , "8" , "9"
public void testToArray() { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); String[] str = new String[5]; str[3] = "4"; str[4] = "5"; String[] newStr = list.toArray(str); for (String s : newStr) { System.out.print(", " + s); } } // output: , 1, 2, 3, null, 5
发表评论
-
JEECG 部署过程
2013-06-05 10:50 7643平台迁移(MyEclipse -> E ... -
构建 SSH2
2011-11-24 22:52 0之前做项目,框架已是搭建好的。虽然自己也搭建过,虽然网 ... -
天干地支
2011-10-10 11:40 992想实现天干地支与数值的互换算法,在网上找到了一些相关信息,于是 ... -
POJ 1009 Edge Detection(一)
2011-10-10 00:16 1807花了一晚上的时间才弄出来的程序居然 OutOfMemery 了 ... -
POJ 1008 Maya Calendar
2011-10-09 00:43 1295POJ 1008 Maya Calendar 这道题,让我一 ... -
POJ 1007 DNA Sorting(待改善)
2011-10-08 21:08 1494POJ 1007 DNA Sorting 这道题做的不舒服, ... -
POJ 1006 Biorhythms
2011-10-08 19:45 1154POJ 1006 Biorhythms 这题是去年完成的,找 ... -
POJ 1005 I Think I Need a Houseboat
2011-10-07 19:33 2193POJ 1005 I Think I Need a House ... -
POJ 1003 Hangover
2011-10-07 17:38 1138一开始没看清题目,不明白要做什么。在转了圈,明白了就是求 1/ ... -
POJ 1002 487-3279
2011-10-07 02:14 1415很久没写东东了,懒了。在大学的时候就一直想支持做 北大ACM ... -
Java Date 类的一个神级误差
2011-08-22 22:08 1832源自 Stack Overflow 的一个问题,原文点 ... -
Java Date 类的一个神级误差
2011-08-22 22:06 0源自 Stack Overflow 的一个 ... -
ServerSocket
2011-06-07 00:08 1155找到本好书,《How Tomecat Work》。嘻嘻,按里面 ... -
Struts2 小结
2011-05-29 23:55 1171从工作开始便一时使用 struts 2 作为前端,已经有18个 ... -
端口占用解决方案 Windows xp
2010-12-10 00:57 2433因为使用 JBoss 进行开发,所以 JBoss 使用的端口, ... -
BASE64 编码实现
2009-10-31 23:08 1356用了几天的时间实现了B ... -
垃圾收集趣史-Java垃圾收集算法 --- 王咏刚
2009-10-17 14:23 1145本文转自:Java的黑暗空 ...
相关推荐
面向对象编程的基础 要了解面向对象编程(OOP)的基本概念,需要理解 OOP 的三个主要概念,它们撑起 了整个 OOP 的框架。这三个概念是:封装、继承性和多态性。除此以外,还需了解对象、 类、消息、接口、及抽象等...
Java面试测试题目2018张大成总结,这是一本非常值得推荐的好书。
作者现在大四快要毕业,在实习中,为了在未来成为一名架构师,下定决心开始读Java的源代码;读源码的过程非常难熬,我在以前也曾读过源码,但都坚持的不久,也没有细读。现在为了激励自己,也为了促使自己能够坚持...
每个学生要学习若干课程,每门课程有平时成绩、其中考试成绩、实习成绩、期末考试成绩以及总评成绩等多个成绩,其中平时成绩的数目不定(因为不同课程的教师布置的平时作业不同),而总评成绩是其它成绩的平均值。...
该回购库包含所有用于实习和工作机会的顶级公司(美国和全球),因此请查看一下,如果喜欢,请分享,以便有人可以从中受益。 并且请不要忘记给这个仓库加注星标。 机会清单 姓名 地点 申请期间 笔记 芝加哥 当下 ...
import java.util.List; public class TestStudentManage { public static void main(String[] args) { List<Student> students = new ArrayList();//实例化对象 List<Course> courses = new ArrayList();//实例化...
由于实习需要,需要通过ajax来获取后台的List集合里面的值。由于前面没有接触过,所以今天就来研究下了。 一、首先需要下载JSON依赖的jar包。它主要是依赖如下: json-lib-2.2.2-jdk15 ezmorph-1.0.4 commons-...
因为此次实践时间有限,因此我们这次实习只学习了Java编程的基础,并最后简单开发了一个爬虫系统。 Java是一门面向对象编程语言,它不同于吸收C语言的各,摒弃了C语言里难以理解的多继承、指针等概念,因此Java语言具有...
这里是用来记录我找实习的学习过程,其中包括手撕数据结构与算法、剑指offer与LeetCode题解、手撕Java常见集合以及其他类。 希望在巩固自己知识点的同时,对大家也能有所帮助。 模块 datastructure 用来记录常见数据...
取回奖励带回家测试-Mobile-Engineer-实习生 Java中的本机Android应用程序,可从检索数据 要求 显示按“ listId”分组的所有项目\ 显示时,先按“ listId”对结果进行排序,然后按“名称”对结果进行排序\ 过滤掉...
JetBrains实习任务/合并请求分支的初步合并 如何 克隆项目 git clone git@github.com:drewlakee/jb-pmbprb-test-case.git 运行测试 cd jb-pmbprb-test-case ./gradlew test 使JAR具有依赖关系 # JAR will be ...
Gopro-实习生分配输入:来自命令行的文本文档,在本例中为constitution.txt 输出: Line 1: equivalent to wc constitution.txt. Displays line, word, and byte count of input document.Line 2: Modified wc to ...
Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...
2020年9月30日十月份的学习在这里#实习过程中遇到的不熟悉知识点,放在这里熟悉一下#value和$ value的区别$ value从配置文件中获取属性如:配置文件如下user : userName : zhangsan age : 18 sex : 男 list : - 1 -...
使用list命令来构建代码 在eval内部利用concat uplevel命令 subst命令 第11章 正则表达式 何时使用正则表达式 正则表达式的语法 高级正则表达式(are) 语法总结 regexp命令 rgsub命令 使用regsub将数据...