说起集合不得不说的就是Java中的集合体系:
集合分为单列集合和双列集合:
单列集合的顶层接口是:Collection
双列集合的顶层接口为:Map
单列集合中有两个体系:List体系和Set体系
其中List体系中的元素是可重复的、存取无序的。其中包括ArrayList集合、Vector集合、还有LinkedList集合。
说起List集合的这三个儿子可真是各有千秋:其中ArrayList集合比较常见,也比较常用。它的底层是数组结构,所以查询比较快,但是有利就有弊。他增删比较慢。它是不同步的,也就是不安全。
Vector集合是最不受待见的,现在基本不用了。它的底层也是数组结构,所以查询比较快,但是有利就有弊。他增删比较慢。它是同步的,也就是安全的,所以效率不较低。
LinkedList集合底层是链表结构,查询慢,但是增删快,是不同步的。效率比较快。
Set体系是无序的是不可重复的,它的体系包括三个集合:HashSet和TreeSet其中HashSet包括LinkedHashSet。
其中HashSet它的底层是哈希表。它不可重复主要依靠HashCode()和equals()方法,具体的运行过程,咱在这儿就暂且不表了。因为是初识集合嘛。有问题可以给我留言。LinkedHashSet它的底层是链表。它是唯一一个Set体系存取有序的。
再说说TreeSet集合,TreeSet的底层是二叉树具体是二叉树中的红黑树。它是无序。通过基本类实现Comparable接口或者传入比较器(传入比较器的时候一般都是用内明内部类作为实际参数来实现)来实现保证元素唯一性。他也是不可重复的,虽说是不可重复的但是我们可以按需求让它实现重复(毕竟程序员是可以颠覆世界的,只要有电脑,没有做不到,只有想不到)。
下面就说到双列集合了,双列集合的顶层接口是Map。
双列集合望文生义就是有两个参数。可以这么理解,双列集合中有键和值,其中键就像是索引,所以说键是不可重复的。而值是可以重复的。
双列集合包括HashMap和TreeMap其中HashMap包括LinkedHashMap
HashMap底层是哈希表,是线程不安全的效率表较高。
TreeMap底层是二叉树,是线程不安全的,效率比较高。
package com.heima.review;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
//需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。
public class Day15 {
public static void main(String[] args) {
Student[] arr = new Student[5];
arr[0] = new Student("张三", 23);
arr[1] = new Student("李四", 24);
arr[2] = new Student("张三", 25);
arr[3] = new Student("张三", 26);
arr[4] = new Student("李四", 27);
for (Student student : arr) {
// System.out.println(student);
}
// 集合转化成数组
Collection col = new ArrayList();
// 数组转化成集合,但这样会将整个数组作为一个元素存入集合中。
// col.add(arr);
// 将数组遍历然后添加到集合中,这样会使每个元素添加到集合中
for (int i = 0; i < arr.length; i++) {
col.add(arr);
}
// 迭代器的使用
// 创建迭代器的过程就是集合对象调用迭代器的过程.
Iterator it = col.iterator();
while (it.hasNext()) {
// 想使用基本类对象的特有方法时需要向下转型
Student s = (Student) it.next();
System.out.println(s.getName() + "***" + s.getAge());
}
// 集合转化成数组
Object[] arr1 = col.toArray();
for (int i = 0; i < arr1.length; i++) {
// Student st = (Student)arr;
// System.out.println(arr1);//st.getName()+"***"+st.getAge());
}
// ConcurrentModificationException并发修改异常,出现原因是在遍历数组的时候用数组修改数组
/*
* 解决办法: 1、用List迭代器便利元素,并且用迭代器的方法来修改数组 2、不用迭代器便利数组用加强for遍历用数组方法修改数组
*/
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
/*
* Iterator it1 = list.iterator();
* while(it1.hasNext()) {
* String str =(String)it1.next();
* if(str.equals("world")){
* list.clear(); //这里会抛出ConcurrentModificationException并发修改异常
* }
* }
*/
ListIterator<String> li = list.listIterator();
while (li.hasNext()) {
String str = (String) li.next();
if (str.equals("a")) {
// list.add("java");//利用集合方法修改集合也会出现并发修改异常
li.add("java");//怎样将"java"显示出来??
}
System.out.println(str);
}
//笔记中的:集合遍历元素,集合修改元素.是什么意思?在day15笔记中。
/*for (String string : list) {
if("a".equals(string)){
list.add("java");
}
}*/
//vector集合的迭代
Vector<String> v = new Vector();
v.add("a");
v.add("b");
v.add("c");
v.add("d");
Enumeration<String> en = v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
}
|
|