`
mycream
  • 浏览: 55599 次
  • 性别: 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 jsp 实习报告

    进一步,实习生掌握了Java的面向对象编程特性,如抽象、多态、继承和封装,并了解了Java异常处理、常用类(如String、StringBuffer)以及集合框架(如Set、List、Map)。 【数据库连接与Oracle知识】 在数据库方面...

    java实习周记25篇.pdf

    根据提供的文件信息,我们可以从中提炼出关于Java实习过程中的关键知识点。这不仅涵盖了Java基础知识的学习,还包括了实际项目开发中的具体应用。以下是对这五个星期实习周记中提及的重要知识点的详细总结: ### 第...

    西农java实习五-文件操作.docx

    本篇实习主要关注Java中的文件输入输出流,包括字节流、字符流、缓冲流和对象流的使用,以及File类和Serializable接口的应用。 首先,我们来看实验题1,它要求从指定目录“.\files\poem”中读取两个txt文件的内容,...

    java——1.rar_Java实习报告_java实习_java实习记录

    Java实习报告是对实习生在Java开发领域实践经历的总结与反思,是学习与工作经验的重要记录。在实习期间,实习生通常会参与实际项目,了解并掌握Java编程语言的核心概念、设计模式以及开发流程。以下是对"实验一"的...

    java培训实习报告

    总结,这份实习报告详细涵盖了Java语言的基础知识,从语言的历史、基本语法、数据类型、控制结构到面向对象编程、异常处理、集合框架等核心概念,还包括了简单的IO流、线程和网络编程的介绍,对于初学者来说是一份...

    java开发实习报告.pdf

    1. Java基础(coreJava):文档中多次提及Java基础,这涵盖了Java语言的核心概念,包括数据类型、运算符、控制流程(if-else、循环)、数组、面向对象编程(类、对象、继承、多态)、异常处理、集合框架(List、Map...

    Java毕业生校外实习日记.doc

    本文档记录了 Java 毕业生的校外实习日记,涵盖了 Java 基础内容、Java 网络编程、JDBC、泛型、反射等知识点。 Java 基础内容 * 线程(Thread):多用户同时工作的机制 * 集合(Collection):包括 List、Set、Map...

    java实习周记25篇通用

    2. **Java环境配置**:在第一周,实习生主要学习了如何配置Java编程环境,这是进行Java开发的基础步骤,包括安装JDK,配置JAVA_HOME环境变量,以及设置IDE(如Eclipse或IntelliJ IDEA)等。 3. **Java基础知识**: ...

    大厂真题之阿里云-Java实习生.pdf

    "阿里云Java实习生面试记录整理" 本文将从阿里云Java实习生面试记录中提取出重要的知识点,并对其进行详细的解释。 List和Set的区别 List和Set都是继承自Collection接口,但它们有着不同的特点。List的特点是元素...

    java实习周记

    本 Java 实习周记记录了作者在 Java 实习期间的学习经验和总结,涵盖了 Java 基础知识、Java 高级语法、Java 线程和 Collection 框架等方面的知识点。 一、Java 基础知识 * 类之间的关系:关联、聚合、继承、...

    Java个人实习总结.rar

    在Java实习过程中,实习生通常会经历一系列的学习与实践,这些经验是成为一名专业Java开发者的基石。这份"Java个人实习总结.pdf"很可能包含了这样的宝贵经验。以下是对Java实习中可能涉及的一些核心知识点的详细阐述...

    信息工程系Java专业实习报告

    实习初期,学生主要学习Java基础,包括线程Thread和集合Collection,如ArrayList、LinkedList、HashSet、TreeSet以及HashMap、TreeMap和HashTable等。线程是实现多用户并发操作的关键,而集合则涉及到数据的组织和...

    2020计算机java开发实习周记范文.docx

    通过五周的实习,实习生逐步掌握了Java语言的基础和高级特性,以及相关的编程概念。 第一周,实习生主要经历了适应期,理解了公司的背景、产品和业务方向,并开始调整作息时间以适应工作环境。在这个阶段,他们熟悉...

    实习生java面试题集及详细答案1

    ### 实习生Java面试题集及详细答案解析 #### 一、Java基本数据类型与String类型 1. **Java的基本数据类型**: - Java语言提供了八种基本数据类型,可以分为以下几类: - **整数类型**:包括`byte`(8位)、`...

    java实习内容笔记和作业.zip

    Java实习内容笔记与作业主要涵盖了Java编程语言的基础知识、核心概念以及实际开发中的应用。这份资料可能是某位实习生在实习期间的学习记录,包含了他对Java的理解和实践经验,对于初学者或者正在学习Java的人来说,...

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

    ### Java面试测试题目知识点梳理 #### 1. int和Integer有什么区别? - **int**: 是Java的基本数据类型之一,用于存储整数值。占用4个字节的空间,取值范围为-2^31到2^31-1。 - **Integer**: 是int的包装类,实现了...

    java实习总结与体会.pdf

    首先,对于Java实习,通常会涉及到的知识点可能包括Java基础语法、面向对象编程、Java集合框架、异常处理、输入输出流(I/O)以及Java的图形用户界面(GUI)编程等。 1. Java基础语法:在实习过程中,首先需要掌握...

    实习生java面试题集及详细答案

    根据给定的文件信息,以下是对“实习生java面试题集及详细答案”中涉及的关键知识点的深入解析: ### Java的基本数据类型与String的区别 Java语言提供了八种基本数据类型,分为数字类型、字符类型和布尔类型。具体...

    计算机java开发实习周记20篇.doc

    - **Collection**:Java集合框架的核心接口,包括List、Set和Queue等子接口,以及ArrayList、LinkedList、HashSet、HashMap等具体实现类。 - **迭代器**:遍历集合的工具,提供了remove()、hasNext()和next()等...

Global site tag (gtag.js) - Google Analytics