黑马程序员-->Java基础-->集合

本文详细介绍了Java集合框架的基本概念,包括Collection、List、Set、Map等核心接口及其具体实现类的特点和使用方法。深入探讨了每种集合类型的适用场景,以及它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------android培训java培训、期待与您交流! ----------

 

一、集合框(集合类)架概述

1、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
 
2、数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
 
3、集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

 

4、为什么会出现这么多容器?
因为每一个容器对数据的存储方式都有不同,这个存储方式称为数据结构。

 

5、了解集合类必须知道集合框架的构成和分类关系,如图:

 


二、Collection集合 

1、Collection(接口)概述
 
  Collection是集合框架中的常用接口。其下有两个常见子接口:List(列表),Set(集)。
 
  所属关系:Collection
 
                 |--List:元素是有序的(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
 
                 |--Set:元素是无序的(存入和取出顺序有可能不一致),元素无索引。不可以存储重复元素。必须保证元素唯一性。
 
2、Collection接口的常见方法
 
  a.添加
 
  add(Object obj):添加一个元素
add方法的参数类型是Object。以便于接收任意类型对象。
 
  addAll(Collection coll):将指定 collection 中的所有元素都添加到此collection中。
 
  b.删除
 
  clear():将集合中的元素全删除,清空集合
 
  remove(Object obj):删除集合中指定的对象。注意:删除成功,集合的长度会改变。
 
  removeAll(Collection col):移除此 collection 与指定 collection 中的交集元素。
 
  c.判断
 
  boolean contains(Object obj):判断collection是否包含obj这个元素
 
  boolean isEmpty():判断集合是否为空
 
  d.获取
 
  int size():返回此collection中的元素个数,即集合长度。
 
  e.取交集
 
  boolean  retainAll(Collection coll):保留两个集合中交集的元素,即对当前集合中保留和指定集合中的相同的元素。如果两个集合元素相同,返回flase;如果retainAll修改了当前集合,返回true。
    如:s1.retainAll(s2),s2中跟s1相同的元素就存储在s1中,改变了s1原来的值。

 f.将集合变成数组:
    toArray();

注:集合中存储的都是对象的引用(地址)。
代码示例:


三、迭代器

(1)概述
  a.什么是迭代?迭代就是集合的取出元素种方式。

  b.集合迭代原理:将“取出方式”定义在集合的内部,这样“取出方式”就可以直接访问集合内部的元素,那么“取出方式”就被定义成了内部类。不同的数据结构,“取出方式”的具体实现细节也不相同,但都有共性内容“判断”和“取出”,将共性的规则抽取出来,即是Iterator。

  c.如何获取集合中的“对象”元素呢?

通过一个对外提供的方法:iterator(),来获取集合中存储的对象。因为Collection中有iterator方法,所以Collection的每一个子类集合对象都具备迭代器。

(2)迭代器的方法

注:在迭代时循环中next调用一次,就要hasNext判断一次。
 
  4、Iterator的使用方法示例:
 
  ArrayList a=newArrayList();//创建一个集合

    //方式一:while循环
  Iterator it=a.iterator();//获取一个迭代器,用于取出集合中的元素。
    while ( it.hasNext() ){
     System.out.println ( it.next() );
    }

  //方式二:for循环,好处在于it对象在迭代完成后就释放了,不占内存。
    for ( Iterator it = a.iterator() ; it.hasNext();){
     System.out.println ( it.next() );
    }

(3)迭代器的注意事项
 
  a.迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。
 
  b.迭代器的next()方法是自动向下取元素,要避免出现NoSuchElementException。
 
  c.迭代器的next()方法返回值类型是Object,所以要记得类型转换。
代码示例:

 

四、List集合

1、List集合组成
List:元素是有序的,元素可以重复。因为该集合体系有索引。
    |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
    |--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
    |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。


2、List集合的特有方法
凡是可以操作角标的方法都是该体系特有的方法。
    a.添加(增)
 
  void add(index , element):指定位置添加元素
 
  boolean add(index , collection):
 
  b.删除(删)
 
  Object remove(index): 删除指定位置的元素
 
  c.修改(改)
 
  Object set(index,element):修改指定位置的元素
 
  d.获取(查)
 
  Object get(index):获取指定角标的元素
 
  int indexOf(object):获取元素第一次出现的位置,如果没有则返回-1
 
  int lastIndexOf(object):返回此列表中最后出现的指定元素的索引
 
  List subList(from , to):返回列表中指定的from (包括)到to(不包括)之间的部分。
 
  注:List集合判断元素是否相同,移除等操作,依据的是元素的equals方法。

 

3、ListIterator(列表迭代器)
(1)概述
 
  a.ListIterator是List集合特有的迭代器,是Iterator的子接口。
 
  b.在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以在迭代器时,只能用迭代器的方法操作元素。可是Iterator方法有限,只能对元素进行判断、取出、删除的操作。如果想要其他的操作,如添加、修改等,就需要使用其子接口ListIterrator。该接口只能通过List集合的listIterator()方法获取。
 
  c.为什么ListIterator才可以增、删、改、查?因为List集合中的元素都带角标。
 
(2)ListIterator特有的方法
 
  void add(obj):为list增加元素
 
  void set(obj):用指定元素替换 next 或 previous 返回的最后一个元素。
 
  boolean hasPrevious():判断前面有没有元素
 
  Object previous():返回列表中的前一个元素。

 

4、Vector集合-->枚举Enumeration
 
a.枚举是Vector类特有的取出方式,发现枚举和迭代器很像。
b.其实枚举和迭代是一样的,因为枚举名称和方法的名称太长,所以被迭代器取代了。
c.特有方法
  addElement(obj):添加元素,相当于add(obj);
 
  Enumeration elements():Vector特有取出方式(枚举)
 
  hasMoreElements():是否还有元素,相当于Iterator的hasNext()方法
 
  nextElements():取出下一个元素,相当于Iterator的next()方法
 
代码示例:

 

5、LikedList
(1)LinkedList:底层使用的是链表数据结构。
(2)特点:增删速度很快,查询稍慢。
(3)特有方法:
 
  a.添加:
 addFirst():将指定元素插入此列表的开头
 addLast():将指定元素插入此列表的末尾
 
  b.获取:getFirst();   getLast();
 获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException。
 
  c.删除:removeFirst(); removeLast();
 获取元素,并删除元素,如果集合中没有元素,会出现NoSuchElementException。
 
(4)JDK1.6后,出现了替代方法。
 
  a.添加:offerFirst();offLast();
 
  b.取:peekFirst(); peekLast();
 获取元素,但是不删除。如果集合中没有元素,会返回null。
 
  c.删除:pollFirst(); pollLast();
 获取元素,并删除元素。如果集合中没有元素,会返回null。

 

五、Set集合

1、概述
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。    
   |--HashSet:底层数据结构是哈希表。线程不同步。 保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。
   |--TreeSet:可以对Set集合中的元素进行排序。默认按照字母的自然排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0。
   Set集合的功能和Collection是一致的。

2、HashSet
HashSet:底层数据结构式哈希表,线程是非同步的。
 
HashSet是如何保证元素唯一性的呢?
通过元素的两个方法,HashSet和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true,如果元素的HashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

3、TreeSet
(1)特点:
     a.底层的数据结构为二叉树结构(红黑树结构)
     b.可对Set集合中的元素进行排序,是因为:TreeSet类实现了Comparable接口,该接口强制让增加到集合中的对象进行了比较,需要复写compareTo方法,才 能让对象按指定需求(如人的年龄大小比较等)进行排序,并加入集合。
     c.java中的很多类都具备比较性,其实就是实现了Comparable接口。
     注意:排序时,当主要条件相同时,按次要条件排序。
     d.保证数据的唯一性的依据:通过compareTo方法的返回值,是正整数、负整数或零,则两个对象较大、较小或相同。相等时则不会存入。
(2)TreeSet排序有两种方式:
 第一种排序方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也被称为元素的自然顺序,或者叫做默认顺序。
代码示例:

 

第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
 在集合初始化时,就有了比较方式。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。比较器构造方式:定义一个类,实现Comparator接口,覆盖compare方法。当两种排序都存在时,以比较器为主。
代码示例:


六、Map集合

1、概述
定义:Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合。
特点:
  a.该集合存储键值对,一对一对往里存
  b.要保证键的唯一性。

2、Map集合子类体系
 Map:
 |--HashTable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0,效率低;
 |--HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是线程不同步的。jdk1.2,效率高;
 |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。

 

3、Map集合的常用方法
a.添加
        Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。
 
        voidputAll(Map <? extends K,? extends V> m);//添加一个集合
 
b.删除
        clear();//清空
 
        Vremove(Object key);//删除指定键值对
 
c.判断
        containsKey(Objectkey);//判断键是否存在
 
        containsValue(Objectvalue)//判断值是否存在
 
        isEmpty();//判断是否为空
 
d.获取
        get(Object key);//通过键获取对应的值
 
        size();//获取集合的长度
 
        Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合

e.两个取出方法
   Set<Map.Entry<K , V>>  entrySet();
 
      Set<K> keySet();
注:HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

 

4、Map集合的两种取出方式
Map集合的取出原理:将Map集合转成Set集合。再通过迭代器取出。
 
a.  Set<K> keySet():将Map中所以的键存入到Set集合。因为Set具备迭代器。所以可以通过迭代方式取出所以键的值,再通过get方法。获取每一个键对应的值。示例代码如下:

 

b.  Set<Map.Entry<K,V>> entrySet():将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry。关于Map.Entry:其实Entry也是一个接口,它是Map的接口中的一个内部接口。示例代码如下:

 

 

-------android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值