集合框架
一、集合框架
集合框架被设计成要满足以下几个目标。
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
对一个集合的扩展和适应必须是简单的。
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
List的接口的实现类主要有ArrayList和LinkedList. Set接口主要的实现类有HashSet和TreeSet。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map等。之所以定义多个接口,是为了以不同的方式操作集合对象实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
二、集合接口
序号接口描述
1Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。2List 接口 List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象。(有索引,可以使用普通的for循环遍历)3Set Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象(没有索引,不能使用普通的for循环遍历)。4SortedSet 继承于Set保存有序的集合。5Map Map 接口存储一组键值对象,提供key(键)到value(值)的映射。6Map.Entry 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。7SortedMap 继承于 Map,使 Key 保持在升序排列。8Enumeration 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。
三、Collection集合
java.util
Interface Collection
集合层次结构中的根界面 。
是所有单利集合的顶层接口,;里面定义了所有单利集合共性的方法,任意的单例集合都可以使用Collection接口的方法;
public boolean add(E e)确保此集合包含指定的元素(可选操作)。public void clear() 从此集合中删除所有元素(可选操作)。public boolean remove(Object o)从该集合中删除指定元素的单个实例(如果存在)(可选操作)。 4.public boolean contains(Object o)如果此集合包含指定的元素,则返回 true 。 5.public boolean isEmpty() 如果此集合不包含元素,则返回 true 。 6.public int size()返回此集合中的元素数。
四、List接口
List接口,实现了Collection接口;常见方法:add()...remove();有序集合(存储和取出的顺序相同)允许存储重复元素;实现类:
ArrayList:数组结构的结合,方便查询;LinkedList: 链式结构的集合,方便增删改; 区分ArrayList、LinkedList、Vector?
Vector :数组结构,线程安全的,效率慢,而且也是可变长数组的,继承自List接口ArrayList :数组结构,线程不安全的,效率快,而且也是可变长数组的,继承自List接口;LinkedList:双向链表结构,继承自List接口;
1. ArrayList 类
数组的长度是不可以改变的,但是ArrayList集合的长度可以改变;
在ArrayList后面的代表泛型泛型:集合中所以元素全部都统一的什么类型注意:泛型只能是引用类型,不能是基本类型;对于ArrayList集合来说直接打印得到的不是地址值,而是内容; 如果内容为空,则为[].add(E e)向集合中添加元素,参数的类型和泛型一致;.get(int index)从集合当中获取元素,参数是索引编号;
package list
;
import java
.util
.ArrayList
;
public class ArrayListDemo1 {
public static void main(String
[] args
) {
ArrayList
<String> list
=new ArrayList<>();
System
.out
.println(list
);
list
.add("xiao");
System
.out
.println(list
);
}
}
2. LinkedList 类
1. LinkedList 类中的常用方法
向链表末尾添加一个新节点,该节点中的数据是参数element指定的对象:
public boolean add(Object element
)
向链表指定位置添加一个新节点,该节点中的数据是参数element指定的对象:
public void add(int index
,Object element
)
向链表表头添加一个新节点,该节点中的数据是参数element指定的对象:
public void addFirist(Object element
)
向链表表尾添加一个新节点,该节点中的数据是参数element指定的对象
public void addLast(Object element
)
删除第一个节点并返回这个节点中的对象
public Object
removeFirst()
删除最后一个节点并返回这个节点中的对象
public Object
removeLast()
删除指定位置的节点
public Object
remove(int index
)
得到指定位置的节点
public Object
get(int index
)
得到链表第一个节点的对象
public Object
getFirst()
表最后一个节点的对象
public Object
getLast()
返回节点对象element在链表中首次出现的位置,如果链表中无此节点的对象则返回-1
int indexOf(Object element
)
返回节点对象element在链表中最后出现的位置,如果链表中无此节点的对象则返回-1
public int lastIndexOf(Object element
)
将当前链表index位置节点中的对象替换成参数element指定的对象,返回被替换对象
public Object
set(int index
,Object element
)
返回链表的长度即节点个数
public int size()
判断链表节点对象中是否含有element
public boolean contains(Object element
)
五、Set 集合
接口,实现了Collection接口;不允许存储重复元素;(按自身内部规则欧排序 —无序)没有索引(不能通过普通for循环遍历);无序集合(存储和取出元素的顺序有可能不一样);实现类:
HashSet类: LinkedHashSet子类(可满足按插入顺序排序)TreeSet类:继承了Set,SortedSet;实现comparable接口:比较器 -headSet(E):不包含subSet(fromE to E)包前不包后tailSet(E):包含
Set
<Person> hashset
=new LinkedHashSet<>();
七、Collection与Collections区别
Collection集合框架的父接口;Collections:集合工具类:乱序,排序、查找(二分)等。
八、比较器
comparable:表示可以比较的; 实现该接口,这个类就可以比较大小,可以进行自然排序compareTo() 正数表示大,负数表示小,0表示相等Comparable 的实现必须与equals()结果一致,就是相等的对象的时候,比较结果为0comparator:比较工具;
九、Map 集合
接口存储一组键值对象,提供key到value的映射;key唯一不可重复,value可重复多个;
1.散列表Map
容量:散列表中的散列数组大小;散列桶:散列值相同的元素的线性集合;加载因子:散列元素的数量除以散列数组大小 0.75HashMap默认加载因子值
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
);
}
}
}
3. HashMap
以键值对形式存储对象,key唯一且不重复;
key可以是任意对象,value也可以是任意对象;(key:value)成对存放在集合中;重复的key第一个,重复添加是覆盖(替换);可以根据key值计算散列表,元素按照散列值排序;HashMap默认容量是16,加载因子默认值是0.75HashMap根据key查找value值
4. TreeMap类
十、泛型通配符
?:可以表示任意的数据类型;
**注意:**泛型没有继承概念;
使用方法:
不能创建对象使用;只能作为方法的参数使用;