集合类


集合类

一.集合概述:

  在我们编程时候,我们常常要利用集合把一组数据存储起来,数据多了以后,我们用对象存储,对象多了,我们用数组存储,但是数组也有以下的缺陷:

  • 数组长度是不可变的,一旦定义了一个数组,如果要保存个数变化的数据,就不能了.
  • 数组无法保持具有映射关系的数据,如 张三-50岁, 李四--25岁,如果确定两个数组,那么它们的元素之间要有一定的联系,很麻烦.
  • 数组只能存储单一的类型
于是,Java提供了集合类,高效地解决了上面三个问题,集合类又称做是容器类,集合里面保存的是对象,所有集合类位于java.util包下面
如下图,对集合类做个概括

集合的结构


Java集合类主要由两个接口派生出来:Collection 和Map, 其中
Collection----
                 |---List 有序且允许元素重复。
             |--ArrayList 一种类似数组的形式进行存储
             |--LinkedList 链表存储
             |--Vector  实现类似数组功能

          |---Set 不允许元素重复
             |--HashSet 哈希编码存储
                        |--TreeSet  唯一一个在集合中有排序的

Map---      keyvalue的映射集合
         |--HashMap 哈希结构
         |--TreeMap  二叉树结构
 二. Collection 接口 是List 和Set的父接口,定义了如下操作集合元素的方法
 (1) 对单个元素的添加、删除操作:
boolean add(Object o):将对象添加给集合
boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o
(2) 查询操作:
int size() :返回当前集合中元素的数量
boolean isEmpty() :判断集合中是否有任何元素
boolean contains(Object o) :查找集合中是否含有对象o

Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素
          |--boolean hasNext()  如果仍有元素可以迭代,则返回 true
          |--E<泛型>next() 返回迭代的下一个元素。
(3) 对组操作 :作用于元素组或整个集合
boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素

boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合

void clear(): 删除集合中所有元素

void removeAll(Collection c) : 从集合中删除集合c 中的所有元素

void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素

(4) Collection转换为Object数组 :
Object[] toArray() :返回一个内含集合所有元素的array

Object[] toArray(Object[] a):返回一个内含集合所有元素的array。
import java.util.*;

public class Demo_Collection {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
      Collection c=new ArrayList();
      c.add("哥哥");
      c.add("姐姐");
      c.add(1);
      System.out.println(c.size());
      
      c.remove(1);
      System.out.println(c.size());
      System.out.println(c.contains("哥哥"));
      
      Iterator i=c.iterator();
     While(i.hasNext()) { 
	 System.out.println(i.next());
	 } 
           Collection person=new HashSet();
         person.addAll(c);
            System.out.println(person);
      person.clear(); 
        System.out.println(person); 
 }
}


List 接口 代表一个有序集合,集合中的每个元素都有相应的顺序索引,可以通过索引来访问指定的集合元素。因为List集合默认按元素的添加顺序设置元素的索引。
void add(int index, Object element): 在指定位置index上添加元素element
boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index

Object get(int index): 返回List中指定位置的元素

int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1

int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否
则返回-1

Object remove(int index) :删除指定位置上的元素

Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回旧的元素

(2) List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集:

ListIterator listIterator() : 返回一个列表迭代器,用来访问列表中的元素

ListIterator listIterator(int index) : 返回一个列表迭代器,用来从指定位置index开始访问列表中的元素

List subList(int fromIndex, int toIndex) :返回从指定位置fromIndex(包含)到toIndex(不包含)范围中各个元素的列表视图
注意:Object set(int index, Object element) 替换元素不能超出List集合的索引范围。也就是不能改变集合的长度。

ArrayList  动态分配,动态的增加和减少元素,查询速度快。
主要方法:
boolean add(E e)    将指定的元素添加到此列表的尾部。
void add(int index, E element)   将指定的元素插入此列表中的指定位置
       E set(int index, E element)   用指定的元素替代 此列表中指定位置上的元素。

小结:在每个ArrayList 对象中都有一个capacity.这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity在常量时间内自动增加。开始创建是容量10的列表,超过则50%添加,而Vector 是100%添加。
可以自定义增加分配的空间
void ensureCapacity(int minCapacity)    增加了容量的ArrayList实例,如果有必要,以确保它可以容纳至少指定的元素数量的最小容量参数。

LinkList 链表排序 是对链头,链尾操作的集合类,利用它,可以实现堆栈,队列的数据结构
addFirst(e);  在链头插入元素
getFirst(e);   取出链头的元素
removeFirst(e); (有打印作用)
.....
堆栈(先进后出)addLast(e) --removeLast(e);
队列  (先进先出)

Set 接口  不可以存放重复,同样的元素,元素存取是无序的。即是存入和取出顺序是不同的。

前述:集合框架中有两种比较接口:Comparable接口和Comparator接口。像StringIntegerJava内建类实现 Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过 Comparator接口来定义您自己的比较方式。
Comparable接口 常用类:
Character:按照字符的UNICODE值进行比较
String: 按照字符的UNICODE值进行比较

HashSet   线程不安全,不是同步的,不能保证元素排列顺序,元素值可以为null,但是存取速度快。
HashSet中的对象需要实现 hashCode()方法,利用哈希码的算法。而对于唯一性是通过hashCode和equals方法来完成的,当元素的hashcode值相同。当元素在HashSet中存储对象时,会分配一个hash值,这个hash值是不定的,而在hash表当中是按照hash值的大小取出来的,所以HashSet实现了无序。如果两个对象的hash值相同,则会判断比较是否同一个对象,调用equals的方法比较,如果不同,则存入,相同,则不存储,这保证了HashSet接口对象的唯一性。
构造函数:
(1) HashSet(): 构建一个空的哈希集
(2) HashSet(Collection c): 构建一个哈希集,并且添加集合c中所有元素
(3) HashSet(int initialCapacity): 构建一个拥有特定容量的空哈希集
(4) HashSet(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0.0至1.0之间的一个数

TreeSet  底层数据结构是红黑树。给据红黑树数据结构对元素进行排序,它支持两种排序方法。
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法来比较元素间的大小关系。该方法返回一个整数值,正数,0,负数分别表示大于,等于,小于。 这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet第二种排序(主要的)当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
构造方法:
(1) TreeSet():构建一个空的树集
(2) TreeSet(Collection c): 
构建一个树集,并且添加集合c中所有元素
(3) TreeSet(Comparator c): 
构建一个树集,并且使用特定的比较器对其元素进行排序
“comparator
比较器没有任何数据,它只是比较方法的存放器。这种对象有时称为函数对象。函数对象通常在运行过程中被定义为匿名内部类的一个实例。
 TreeSet(SortedSet s): 
构建一个树集,添加有序集合s中所有元素,并且使用与有序集合s相同的比较器排序

Map 用于保存具有映射关系的数据,key值(不允许重复),value值。一个key值对应一个value值,value值可以重复。相当于高中时期学过的映射关系。
Map 接口常用的方法:
(1) 添加、删除操作:
Object put(Object key, Object value): 
将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null

 Object remove(Object key): 
从映像中删除与key相关的映射

void putAll(Map t): 
将来自特定映像的所有元素添加给该映像

void clear(): 
从映像中删除所有映射

键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。

(2) 
查询操作:
Object get(Object key): 
获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回null

boolean containsKey(Object key): 
判断映像中是否存在关键字key

boolean containsValue(Object value): 
判断映像中是否存在值value

int size(): 
返回当前映像中映射的数量

boolean isEmpty() 
:判断映像中是否有任何映射

(3) 
视图操作 :处理映像中键/值对组
Set keySet(): 
返回映像中所有关键字的视图集

因为映射中键的集合必须是唯一的,您用Set支持。你还可以从视图中删除元素,同时,关键字和它相关的值将从源映像中被删除,但是你不能添加任何元素。

 Collection values():
返回映像中所有值的视图集

因为映射中值的集合不是唯一的,您用Collection支持。你还可以从视图中删除元素,同时,值和它的关键字将从源映像中被删除,但是你不能添加任何元素。

 Set entrySet(): 
返回Map.Entry对象的视图集,即映像中的关键字/值对

因为映射是唯一的,您用Set支持。你还可以从视图中删除元素,同时,这些元素将从源映像中被删除,但是你不能添加任何元素。


HashMap和Hashtable实现类

 

它们是Map接口的典型实现类,它们的区别:

1.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现。


2.Hashtable不允许使用Null作为key和value,但HashMap可以。


HashMap

(1) HashMap(): 构建一个空的哈希映像
(2) HashMap(Map m): 
构建一个哈希映像,并且添加映像m的所有映射
(3) HashMap(int initialCapacity): 
构建一个拥有特定容量的空的哈希映像
(4) HashMap(int initialCapacity, float loadFactor): 
构建一个拥有特定容量和加载因子的空的哈希映像


TreeMap
(1) TreeMap():构建一个空的映像树
(2) TreeMap(Map m): 
构建一个映像树,并且添加映像m中所有元素
(3) TreeMap(Comparator c): 
构建一个映像树,并且使用特定的比较器对关键字进行排序
(4) TreeMap(SortedMap s): 
构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值