集合数据结构体系框架

Collection接口是List/Set/Queue接口的父接口,其中定义的常用的操作方法有(注意此处笔记不完整,演示代码没有导包):

添加功能
 i. boolean add(object obj)添加一个元素
 ii. boolean addAll(Collection c)将集合c的全部元素添加到原集合元素后返回true
 iii. 添加功能永远返回true删除功能
 i. void clear();移除所有元素
 ii. boolean remove(Object o)移除一个元素
 iii. boolean removeAll(Collection c)移除一个集合的元素,只要有一个被移除就返回true,改变原集合,删除原集合中和c中相同的元素
 iv. 删除功能只有删除成功后才返回true判断功能
 i. boolean contain(object o)判断集合中是否包含指定的元素。
 ii. boolean containsAll(Collection c)判断原集合中是否包含指定集合c的所有元素,有则true,
 iii. boolean isEmpty()判断集合是否为空获取功能
 i. Iterator iterator()迭代器,集合的专用方式,实现遍历的功能
 ii. Object next()获取当前元素,并移动到下一个位置
 iii. boolean hasNext()判断此位置是否有元素
 iv. 迭代器遍历实例在下面
f) 长度功能
 i. int size()元素的个数
 ii. 数组和字符串中都是length()方法获取元素个数,集合中是size()方法
  因为object包括集合、字符串、数组,所以其不能直接用length方法。交集功能boolean retainAll(Collection c)
 两个集合交集的元素给原集合,并判断原集合是否改变,改变则true,不变则false把集合转换为数组
 i. Object [] toArray()1、Set代表元素无序、不可重复的集合

(1)HashSet是Set接口的典型实现,线程执行是非安全的,集合元素可以为null
(2)HashSet通过过两个方法hashCode()和equals()保证元素的唯一性,方法自动生成。当存储对象时则无法确保唯一性,可能需要重写hashCode。
(3)TreeSet是Set接口实现
   + 1. 底层数据是红黑二叉树
   + 2. 排序方式:自然排序、比较器排序
   + 3. 通过比较返回值是否为0来保证元素的唯一性。
例子:

//使用HashSet类随机产生10个不重复的1到20的不重复随机数
public class HashSetDemo {
public static void main(String[] args) {
Random r=new Random();

HashSet <Integer> hs=new HashSet<Integer>(); while(hs.size()<10) { hs.add((r.nextInt(20)+1)); } for(Integer i:hs) { System.out.println(i); }

}

}

2、List代表元素有序、可以重复的集合

案例:main()方法中代码

Collection<String> lists = new ArrayList<>();
lists.add("集合lists测试1");
lists.add("集合lists测试2");
lists.add("集合lists测试3");

CollectionAll listall = new CollectionAll(); listall.print(lists);

CollectionAll类如下:

package com.paint.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CollectionAll<T> {

public void print(Collection&lt;T&gt; lists){ for(T o:lists){ System.out.println(o); }}

}

利用集合的迭代器遍历(优势是不会轻易改变集合实参值)

public class InteratoeDemo {
public static void main(String[] args) {

//Collection集合的遍历 Collection c=new ArrayList(); c.add("java01"); c.add("java02"); c.add("java03"); Iterator i=c.iterator(); while(i.hasNext()) { //向下转型 String s=(String) i.next(); System.out.println(s); } System.out.println("-----------------"); //List集合的遍历 List l=new ArrayList(); l.add(0,"测试01"); l.add(1,"测试02"); l.add(1,"java集合测试"); ListIterator li=l.listIterator(); //后向遍历 while(li.hasNext()) { String s=(String)li.next(); System.out.println(s); } System.out.println("-----------------"); //前向遍历 while(li.hasPrevious()) { String s=(String)li.previous(); System.out.println(s); } System.out.println("-----------------"); //get方法遍历 for(int x=0;x&lt;l.size();x++) { String s=(String)l.get(x); System.out.println(s); }

}
}

3、Queue队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口。

public class Main {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
}
}

4、Map用于保存映射关系的数据Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。TreeMap是有序的,HashMap和HashTable是无序的。Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。

HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

例子:
按照键值遍历

public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<String,String>();
//给map中添加元素
map.put("a", "孙俪");
map.put("b", "范冰冰");
map.put("c", "柳岩");
//获取Map中的所有key
Set<String> keySet = map.keySet();
//遍历存放所有key的Set集合
Iterator<String> it =keySet.iterator();
while(it.hasNext()){ //利用了Iterator迭代器
//得到每一个key
String key = it.next();
//通过key获取对应的value
String value = map.get(key);
System.out.println(key+"="+value);
}
}
}

按照键值对遍历

public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<String,String>();
//给map中添加元素
map.put("a", "孙俪");
map.put("b", "范冰冰");
map.put("c", "柳岩");
//获取Map中的所有key与value的对应关系
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍历Set集合
Iterator<Map.Entry<String,String>> it =entrySet.iterator();
while(it.hasNext()){
//得到每一对对应关系
Map.Entry<String,String> entry = it.next();
//通过每一对对应关系获取对应的key
String key = entry.getKey();
//通过每一对对应关系获取对应的value
String value = entry.getValue();
System.out.println(key+"="+value);
}