`
mycream
  • 浏览: 54236 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 基础实习 - List

    博客分类:
  • JAVA
阅读更多
在看 JDK 1.6 的源码,用以补习自己的 Java 基础。

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

分享到:
评论

相关推荐

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    面向对象编程的基础 要了解面向对象编程(OOP)的基本概念,需要理解 OOP 的三个主要概念,它们撑起 了整个 OOP 的框架。这三个概念是:封装、继承性和多态性。除此以外,还需了解对象、 类、消息、接口、及抽象等...

    Java面试测试题目2018张大成总结

    Java面试测试题目2018张大成总结,这是一本非常值得推荐的好书。

    java1.8源码-jdk1.8.0_151-:阅读Java源码,版本为jdk1.8.0_151,将会同步翻译源码中的文档注释

    作者现在大四快要毕业,在实习中,为了在未来成为一名架构师,下定决心开始读Java的源代码;读源码的过程非常难熬,我在以前也曾读过源码,但都坚持的不久,也没有细读。现在为了激励自己,也为了促使自己能够坚持...

    java项目-学生成绩管理系统

    每个学生要学习若干课程,每门课程有平时成绩、其中考试成绩、实习成绩、期末考试成绩以及总评成绩等多个成绩,其中平时成绩的数目不定(因为不同课程的教师布置的平时作业不同),而总评成绩是其它成绩的平均值。...

    Internship-And-Job-List-Foreign-for-2020:此回购包含所有顶级公司工作和实习机会(主要是美国公司)的链接

    该回购库包含所有用于实习和工作机会的顶级公司(美国和全球),因此请查看一下,如果喜欢,请分享,以便有人可以从中受益。 并且请不要忘记给这个仓库加注星标。 机会清单 姓名 地点 申请期间 笔记 芝加哥 当下 ...

    java学生成绩管理系统设计.doc

    import java.util.List; public class TestStudentManage { public static void main(String[] args) { List&lt;Student&gt; students = new ArrayList();//实例化对象 List&lt;Course&gt; courses = new ArrayList();//实例化...

    ajax+json+Struts2实现list传递实例讲解

    由于实习需要,需要通过ajax来获取后台的List集合里面的值。由于前面没有接触过,所以今天就来研究下了。 一、首先需要下载JSON依赖的jar包。它主要是依赖如下: json-lib-2.2.2-jdk15 ezmorph-1.0.4 commons-...

    IT实践报告(大学生)

    因为此次实践时间有限,因此我们这次实习只学习了Java编程的基础,并最后简单开发了一个爬虫系统。 Java是一门面向对象编程语言,它不同于吸收C语言的各,摒弃了C语言里难以理解的多继承、指针等概念,因此Java语言具有...

    leetcode分类-MyInternshipWay:我的实习之路

    这里是用来记录我找实习的学习过程,其中包括手撕数据结构与算法、剑指offer与LeetCode题解、手撕Java常见集合以及其他类。 希望在巩固自己知识点的同时,对大家也能有所帮助。 模块 datastructure 用来记录常见数据...

    Fetch-Rewards-Coding-Exercise-Mobile-Engineer-Intern

    取回奖励带回家测试-Mobile-Engineer-实习生 Java中的本机Android应用程序,可从检索数据 要求 显示按“ listId”分组的所有项目\ 显示时,先按“ listId”对结果进行排序,然后按“名称”对结果进行排序\ 过滤掉...

    jb-pmbprb-test-case:Jet Brains实习任务拉取请求分支的初步合并构建

    JetBrains实习任务/合并请求分支的初步合并 如何 克隆项目 git clone git@github.com:drewlakee/jb-pmbprb-test-case.git 运行测试 cd jb-pmbprb-test-case ./gradlew test 使JAR具有依赖关系 # JAR will be ...

    Gopro-Intern-Assignment:GoPro 的实习生分配

    Gopro-实习生分配输入:来自命令行的文本文档,在本例中为constitution.txt 输出: Line 1: equivalent to wc constitution.txt. Displays line, word, and byte count of input document.Line 2: Modified wc to ...

    c#学习笔记.txt

    Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...

    SpringBoot值

    2020年9月30日十月份的学习在这里#实习过程中遇到的不熟悉知识点,放在这里熟悉一下#value和$ value的区别$ value从配置文件中获取属性如:配置文件如下user : userName : zhangsan age : 18 sex : 男 list : - 1 -...

    Tcl_TK编程权威指南pdf

    使用list命令来构建代码 在eval内部利用concat uplevel命令 subst命令 第11章 正则表达式 何时使用正则表达式 正则表达式的语法 高级正则表达式(are) 语法总结 regexp命令 rgsub命令 使用regsub将数据...

Global site tag (gtag.js) - Google Analytics