首先设计集合框架需要满足以下几个条件:
1、该框架必须是高性能的(基本集合动态数组、链表、树、哈希表)的实现也必须是高性能的
2、该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性
3、对一个集合的扩展和适应必须是简单的
因此,整个集合框架就围绕一组标准接口而设计的,你可以直接使用这些接口的标准实现,例如LinkedList,HashSet、和TreeSet等,除此之外也可以通过这些接口实现自己的集合。
集合框架是一个用来代表和操作集合的统一架构,所有的集合框架都包含如下内容
接口:是代表集合的抽象数据类型。接口允许集合独立操作其代表的细节,在面向对象的语言,接口通常是形成一个层次
实现类:是接口的具体实现。从本质上讲他们是可重复使用的数据结构
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如搜索和排序这些算法被称作为多态,那是因为相同的方法可以在相似的接口上有不同的具体实现
集合框架体系实现方式:
java集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中,所以使用集合框架的时候需要进行导包
其中set和list的区别
1、set接口的特点:
1.1存储是无序的、不重复的数据 list接口存储有序可以重复
1.2 set的检索效率比较低下,删除和插入效率比较高,其中插入和删除不会引起位置的改变(实现类有HashSet、TreeSet)
1.3 List集合和数组类似,可以实现数组的动态增长,根据实际存储的数据的长度而自动增长List长度,查找元素的效率高,插入和删除的效率比较低,以为会引起其他元素的位置的改变(实现类有ArrayList、LinkedList Vector)
集合的实现类(集合类)
Java提供了一套实现了Collection接口的标准集合类,其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现
LinkedList
该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。例如:
List=Collections.synchronizedList(newLinkedList(...)); List集合中的数据类型Collection这个是同步的实现方式LinkedList 查找效率低
ArrayList
该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的
50%,插入删除效率低。
、
HashSet该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
几个集合的整体总结:
List的具体实现类的区别实现:
LinkedList 该类实现了List接口,允许有null元素,主要用来创建链表数据结构,该类没有同步类方法,如果是多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是创建List时候构造一个同步的List,这样是可以保证线程同步
Listlist=Collections.synchronizedList(newLinkedList(...));LinkedList查询效率是非常低的但是增删速度慢
ArrayList 该类也是实现了List接口,实现了可变数组的大小随机访问元素和遍历的时候,提供了是更好的性能,该类也是非同步的,在多线程的情况下是不要使用的,ArrayList增长的是当前长度的50%,但插入和删除的效率的是非常比较低的。
Set里面是有HashSet和LinkedHashSet集合两种实现类的时候
HashSet 该类实现了Set接口,不允许出现重复的元素,不保证集合中元素的顺序允许包含Null值 但是null值只能是有一个
LinkedHashSet具有可预知的迭代顺序的Set接口哈希表和链表的实现
TreeSet该类实现了Set接口,可以实现排序的功能的实现方法
Map集合中的一些元素中的顺序实现过程
HashMap 是一个散列表,他存储的内容是key-value的键值对的也就是key-value的映射,该类实现了map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步,但是可以允许多个value的值为null
、LinkedHashMap是继承与HashMap类,使用元素的自然顺序对元素进行自然排序
vector该类和ArrayList非常相似,但是该类是同步的,线程是安全的,可以允许在多线程的情况下,该类允许设置默认的增长的长度,默认的扩容方式是原来的2倍
stack 栈是vector的一个子类,他实现了一个标准的后进先出的栈
Dictionary类是一个抽象类,用来存储键值对的,作用和Map基本上是相似的
HashTable是Dictionary的子类,这个是位于java.util包中里面
Properties继承与HashTable,是一个持久的属性集属性列表中每个键以及对应值都是一个字符串
集合中的算法
集合框架定义了几种算法,可用于集合和映射,这些算法被定义为集合类的静态方法。在尝试比较不兼容的类型时,一些方法能够抛出ClassCastException异常,当试图修改一个不可修改的集合的时候,不支持类型异常
如何使用迭代器
通常情况下,你会希望遍历一个集合中的元素,例如显示集合中的每一个元素
一般遍历数组都是采用for循环或者是增强for循环,这两个方法也是可以使用在集合框架中,但是还有一种方法就是采用迭代器遍历集合框架,它是一个对象实现了Iterator接口或者是ListIterator接口
迭代器,使你可以通过循环来得到或者是删除集合中的元素,ListIteratorji成了Iterator,以允许双向遍历列表和修改元素
vector该类和ArrayList类相似,但是该类是线程同步的,可以在多线程的情况下,该类允许设置默认的增长长度,默认的扩容方式为原来的2倍
遍历集合的几个实例
package list;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class map {
public static void main(String[] args) {
//遍历map集合的实现方式的四种方法
Map<Integer, String> map = new HashMap<Integer,String>();
map.put(1, "lilong1");
map.put(2, "lilong2");
map.put(3, "lilong3");
map.put(4, "lilong4");
//第一种遍历方式也是普遍使用的遍历方法就是通过key来取出来value
for (Integer integer : map.keySet()) {
System.out.println("key="+integer+" " + "value="+map.get(integer));
}
//通过键值对 也就是通过键来取出来值 这就是map的集合遍历的这种方式
//map集合遍历的第二种遍历方式
System.out.println("通过Map.entrySet使用Iterator来遍历key和value");
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = (Map.Entry<Integer, String>) iterator.next();
System.out.println("key="+entry.getKey()+" "+"value="+entry.getValue());
}
//当map集合中的数据量比较大的时候就是通过Map.entrySet来遍历key和value
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("key="+entry.getKey()+" "+"value="+entry.getValue());
}
//第四种方法是直接遍历map集合中的所有的value但是是不能遍历集合中的key值 这就是集合中的一个弊端实现方式
System.out.println("这是第四种遍历所有集合中的values");
for (String string : map.values()) {
System.out.println("value="+string);
}
}
}
遍历List集合的几种方法
package list;
import java.util.ArrayList;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("Hello");
list.add("world");
list.add("java");
//使用三种方法进行list集合的遍历
//使用foreach
// for (String str : list) {
// System.out.println(str);
// }
//使用第二种方法进行遍历
//把链表变成相关的数组,然后再次进行开始遍历
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
//使用第二种方法进行遍历实现这个集合,把链表集合编程数组 然后进行遍历实现
//这个是字符串数组的实现方式
String[] string = new String[list.size()];
list.toArray(string);
for (int i = 0; i < string.length; i++) {
System.out.println(i+string[i]);
}
//使用第三种方法进行遍历 而且这种方法不会出现空指针异常的出现
System.out.println("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string2 = (String) it.next();
System.out.println(string2);
}
//其中第三种方法是使用迭代器的方法然后再次进行遍历实现的这个集合中的数据,该方法进行遍历的时候不用担心会超出集
//集合的长度 也就是不用担心空指针的异常的出现这种方法
}
}