Java 集合框架
一:集合类简介
Java集合就像一种容器,可以把多个对象(实际上是对象的引用)“丢进”该容器中。从Java 5增加了泛型以后,Java集合可以记住容器中对象的数据类型,使得编码更加简洁、健壮。所有集合类都位java.util包下,但支持多线程的集合类位于java.util.concurrent包下。
如图(图片从别的博文摘取,谢谢您的精心绘制)(图片含义:黄色:接口,绿色:抽象接口,蓝色:实现类):
如图可以看出:java集合框架主要包含两种类型的容器,一种是集合(collection),存储一个元素的集合。一种是图(map),存储键值对映射。collection集合有3种子类型(List,Queue,Set),再往下是抽象类,最后实现类,常用的有:ArrayList,LinkedArrayList,HashSet,LinkedHashSet,HashMap,LinkedHashMap
集合框架是一个用来代表和操纵集合的同一款框架,所有集合框架包含如下内容:
1 接口 :代表集合的抽象数据类型,如collection,list,set,map,定义为接口,方便以不同的方式操作集合对象。
2 实现类:集合接口的具体实现,是可重复使用的数据结构。如Arraylist,linedlist,hashmap,hashset。
3 算法: 实现集合接口对象中的算法。如搜索排序,这些算法多为多态,在相似的接口上有着不同的实现。
二 java集合常见接口及实现类
1 collections接口常见方法(来源于java API)
1) collections实现接口及子类
集合的顶级接口collections
下面主要有三个接口,分别是:list,set,queue。
① list 的主要实现类:arraylist,linkedlist,vector
特点:有序,有下标,可重复。
ArrayList底层通过数组实现,LikedList底层通过链表实现。
② set的主要实现类:HashSet,LinkedHashSet,TreeSet
特点:无序(LinkedHashSet除外),无下标,不可重复
HashSet底层通过哈希表实现,LinkedHashSet底层通过哈希表+链表实现(链式哈希级)Treeset底层
通过树结构实现
③ Queue(队列Queue是一个队列集合,队列通常是指“先进先出”(FIFO)的容器。新元素插入(offer)到队列
的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
主要实现类:ArrayDeque、LinkedList、PriorityQueue。
三 Map集合
Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、LinkedHashMap、TreeMap等。
Map常见方法(来源于API)如下:
1)HashMap和HashTable
HashMap与Hashtable是Map接口的两个典型实现,它们之间的关系完全类似于ArrayList与Vertor。HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了。
区别:1 HashMap是线程不安全,HashTable是线程安全的。
2 HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把
null放进HashTable中,将会发生空指针异常。
四遍历集合中的数据
1 遍历ArrayList
import java.util.*;
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一种遍历方法使用 For-Each 遍历 List
for (String str : list) { //也可以改写 for(int i=0;i<list.size();i++) 这种形式
System.out.println(str);
}
//第二种遍历,把链表变为数组相关的内容进行遍历
String[] strArray=new String[list.size()];
list.toArray(strArray);
for(int i=0;i<strArray.length;i++) //这里也可以改写为 for(String str:strArray) 这种形式
{
System.out.println(strArray[i]);
}
//第三种遍历 使用迭代器进行相关遍历
Iterator<String> ite=list.iterator();
while(ite.hasNext())//判断下一个元素之后有值
{
System.out.println(ite.next());
}
}
}
2 遍历Map
import java.util.*;
public class Test{
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}
参考
1 https://blog.csdn.net/wangwei_620/article/details/82049502
2 https://www.cnblogs.com/dxflqm/p/11867611.html
3 https://www.runoob.com/java/java-collections.html
4 https://www.cnblogs.com/bingyimeiling/p/10255037.html