【JAVA集合框架】Java集合框架

1.概述

1.1 框架

为了解决一系列相关问题作的解决方案(就是一系列相关类构成的解决方案)java

1.2 集合

集合的广义的角度,就至关因而容器来存放的元素,JDK1.5以后,集合里面存放的就是对象。(int,float之类的要先打包才能存放)没有要求里面必定存放是相同的对象,Object类输出时注意类型的强制转换web

1.3 Java集合框架图

在这里插入图片描述

从上面的集合框架图能够看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另外一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,经常使用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。算法

集合框架是一个用来表明和操纵集合的统一架构。全部的集合框架都包含以下内容:数组

  • 接口:是表明集合的抽象数据类型。例如 Collection、List、Set、Map 等。之因此定义多个接口,是为了以不一样的方式操做集合对象数据结构

  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。多线程

  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是由于相同的方法能够在类似的接口上有着不一样的实现。架构

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,可是它们彻底整合在集合中。框架

顶级接口:Iterator ,collection, map; 实现接口的几个重要类:Haspset,ArrayList,Haspmap,LinkedList, 这些==java集合框架放在java.util包中的==,

1.3.1继承自Collection的接口分为两种


1)List接口:线性的存储方式,里面存放的元素能够重复,有序的存储方式;
2)set接口:散装的存储方式,里面不能有重复的元素(equals方法),不能存放null元素。svg

1.3.2 Collection接口里重要的方法

1)add方法:添加元素
2)clear方法:移除collection中的全部元素
3)remove方法:移除集合中指定的元素
4) iterator方法:获取Iterator接口的方法
5)size方法:返回collection中的元素总数

2. 接口

Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 因此当使用集合框架的时候须要进行导包。函数


集合接口

集合框架定义了一些接口。本节提供了每一个接口的概述:

序号 接口描述
1 Collection 接口

Collection 是最基本的集合接口,一个 Collection 表明一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。

Collection 接口存储一组不惟一,无序的对象。

2 List 接口

List接口是一个有序的 Collection,使用此接口可以精确的控制每一个元素插入的位置,可以经过索引(元素在List中位置,相似于数组的下标)来访问List中的元素,第一个元素的索引为 0,并且容许有相同的元素。

List 接口存储一组不惟一,有序(插入顺序)的对象。

3 Set

Set 具备与 Collection 彻底同样的接口,只是行为上不一样,Set 不保存重复的元素。

Set 接口存储一组惟一,无序的对象。

4 SortedSet
继承于Set保存有序的集合。
5 Map

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

6 Map.Entry
描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
7 SortedMap
继承于 Map,使 Key 保持在升序排列。
8 Enumeration
这是一个传统的接口和定义的方法,经过它能够枚举(一次得到一个)对象集合中的元素。这个传统接口已被迭代器取代。

Set和List的区别

  • 1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,能够重复的元素。

  • 2. Set检索效率低下,删除和插入效率高,插入和删除不会引发元素位置改变 <实现类有HashSet,TreeSet>

  • 3. List和数组相似,能够动态增加,根据实际存储的数据的长度自动增加List的长度。查找元素效率高,插入删除效率低,由于会引发其余元素位置改变 <实现类有ArrayList,LinkedList,Vector>

2.1 List接口

1 .ArrayList
存储图:相似于数组的存储方式
内存地址:是连续的。
优势:直接访问集合中某个元素,访问效率快。
缺点:增长和修改元素效率慢。扩容和缩容的操做效率慢。
**边遍历边删除元素就会出现问题,会报错,由于下一次会读取空值**
package Collection;
import java.util.*;

public class TestList {
	public static void main(String[] args)
	{
		List arryList=new ArrayList();
		//向接口里添加元素
		Integer i=new Integer(1);
		arryList.add(i);
		arryList.add(2);
		arryList.add("Hello");
		arryList.add("juu");
		//访问元素
		System.out.println("集合里的元素总数:"+arryList.size());
		int count=arryList.size();
		for(int j=0;j<count;j++)
		{
			//获取索引下的某个元素是经过get方法获得的
			System.out.println(arryList.get(j));
		}
		//若是要删除某个整形元素,就须要先经过打包整形的数据删除
		arryList.remove(new Integer(2));
		for(Object o:arryList){
			System.out.println(o);
		}	
	}
}
## 4 LinkedList
存储图:相似于链表的存储方式
存储的内存 地址:不是连续的
优势:增长和修改元素的效率快
缺点:访问元素的效率慢

2.2 set接口

散装存储
实现Set接口的一个重要类就是HashSet,它的存储是非线性的存储,按照Hash函数存储,集合
重要特色:

1)不支持索引访问
2)能够经过for加强的方式访问

for(Object o:hashSets)
	{
		System.out.println(o.hashCode());
	}

样例以下:

package Collection;
import java.util.*;

public class TestSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Set hashSets=new HashSet();
		hashSets.add(new Student("aobama",78));
		hashSets.add(new Student("mayun",68));
		hashSets.add(new Student("siri",88));
		hashSets.add(new Student("xiaodu",58));
		hashSets.add(new Student("admin",58));
		
		Student s=new Student("admin",78);
		hashSets.add(s);
		hashSets.add(s);
//		for(Object o:hashSets)
//		{
//			System.out.println(o.hashCode());
//		}
		
		Iterator it=hashSets.iterator();
		while(it.hasNext())
		{
			Student s1=(Student)it.next();
			//it.remove();
			
			System.out.println(s1.getName()+":"+s1.getScore());
		}
	}

}

2.3 Iterator接口

重要做用:实现迭代的功能,==是无序的存储==
重要方法:
1)hasNext():若是仍有元素能够迭代,则返回 true
2)next:指针指向的当前元素
3)remove:从迭代器指向的 collection 中移除迭代器返回的最后一个元素
样例以下:
Iterator it=hashSets.iterator();
	while(it.hasNext())
	{
		Student s1=(Student)it.next();
		//it.remove();
		System.out.println(s1.getName()+":"+s1.getScore());
	}

2.4 Map接口

存储方式:双元素(键值对存储)
注意:

键是不能够重复的,判断是否重复的标准是对象的equals方法。
package Collection;

import java.util.*;

public class MapTest {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	Map map=new HashMap();
	//存放的是键值对的数据
	map.put("a", "hello");
	map.put("b", "world");
	map.put("c", "java");
	
	//如何访问Map里面的数据
	//首先访问的是key的数据集合
	Set sets=map.keySet();
	Iterator it=sets.iterator();
	while(it.hasNext()){
		Object key=it.next();//找到key集合里的元素
		Object value=map.get(key);//经过键值找到元素
		System.out.println("key:"+key+"-----value:"+value);
	}
}

}

3.集合实现类(集合类)


集合实现类(集合类)

Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类能够直接拿来使用,而另一些是抽象类,提供了接口的部分实现。

标准集合类汇总于下表:

序号 类描述
1 AbstractCollection
实现了大部分的集合接口。
2 AbstractList
继承于AbstractCollection 而且实现了大部分List接口。
3 AbstractSequentialList
继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。
4 LinkedList

该类实现了List接口,容许有null(空)元素。主要用于建立链表数据结构,该类没有同步方法,若是多个线程同时访问一个List,则必须本身实现访问同步,解决方法就是在建立List时候构造一个同步的List。例如:

Listlist=Collections.synchronizedList(newLinkedList(...));

LinkedList 查找效率低。

5 ArrayList

该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的状况下不要使用。ArrayList 增加当前长度的50%,插入删除效率低。

6 AbstractSet
继承于AbstractCollection 而且实现了大部分Set接口。
7 HashSet

该类实现了Set接口,不容许出现重复元素,不保证集合中元素的顺序,容许包含值为null的元素,但最多只能一个。

8 LinkedHashSet
具备可预知迭代顺序的 Set 接口的哈希表和连接列表实现。
9 TreeSet

该类实现了Set接口,能够实现排序等功能。

10 AbstractMap
实现了大部分的Map接口。
11 HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具备很快的访问速度,最多容许一条记录的键为null,不支持线程同步。
12 TreeMap
继承了AbstractMap,而且使用一颗树。
13 WeakHashMap
继承AbstractMap类,使用弱密钥的哈希表。
14 LinkedHashMap
继承于HashMap,使用元素的天然顺序对元素进行排序.
15 IdentityHashMap
继承AbstractMap类,比较文档时使用引用相等。

4.泛型操做

集合中存储数据,那么就规定是某个数据类型的(引用类型)。
使用泛型的好处:在放置到集合里面的数据进行了类型的检测。

package Collection;
import java.util.*;

public class TestDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List list=new ArrayList();
		list.add("hello");
		list.add(new Student("张珊",12));
		//编译时没有进行类型检查 会抛出异常
//		for(Object o:list)
//		{
//			Student s=(Student)o;
//			System.out.println(s);
//			
//		}
		//泛型的使用方式,在建立集合类型时,就规定好集合里面存放什么类型的元素
		List<Student> listarray=new ArrayList();
		//listarray.add("hello");类型检查出错,应该存放Student类型
		//访问的时候
		for(Student s:listarray)
		{
			System.out.println("name:"+s.getName()+"score:"+s.getScore());
		}
		
	}

}

5.集合中的排序和查找问题

主要针对线性集合的一个排序和查找:Collections类中

1)binarysearch:二分查找
2)sort:只能对线性元素进行排序;

package Collection;
import java.util.*;

public class SortDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Integer> list =new ArrayList<Integer>();
		list.add(12);
		list.add(34);
		System.out.println(Collections.binarySearch(list, new Integer(12)));
		
		List<Integer> list2 =new ArrayList<Integer>();
		list2.add(12);
		list2.add(34);
		list2.add(10);
		System.out.println(list2.size());
		//目标数组不能比原数组小
		Collections.copy(list2, list);
		System.out.println(list2.size());
		
		Collections.sort(list2);
		for(Integer i:list2)
		{
			System.out.println(i);
		}
	}
}