欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 关于集合框架(Set, List, Map)

程序员文章站 2022-05-14 09:27:52
...

集合框架

集合相关接口和类均处于 java.util 包下
Collection

  • Set(集)
    • SortedSet(进一步扩展 Set 接口,增加对元素排序功能)
  • List(列表)

Map

  • SortedMap(增加按照键 - 值对的键对元素进行排序)

           *      java.util.Collection
           * +boolean add(Object o)  向集合中加入指定元素,加入成功返回true,否则返回false。在Set接口中,此方法在添加元素前要进行是否重复的判断,如果是重复元素,添加被拒绝,返回false,否则成功,返回true。List接口则不变。
           * +boolean addAll(Collection c)  将指定Collection中的所有元素都添加到此Collection中。子接口中方法发生变化和 +boolean add(Object o)一样
           * +void clear()  移除此Collection中的所有元素
           * +boolean contains(Object o)  如果此Collection包含指定的元素,返回true,否则返回false
           * +boolean containsAll(Collection c)  如果此Collection包含指定Collection中所有元素,返回true,否则返回false
           * +boolean isEmpty()  如果此Collection不包含任何元素,则返回true,否则返回false
           * +Iterator iterator()  返回在此Collection的元素上进行的迭代器
           * +boolean remove(Object o)  从此Collection中移除指定元素,成功返回true,否则返回false
           * +boolean removeAll(Collection c)  移除此Collection中那些包含指定Collection中所有元素
           * +boolean retainAll(Collection c)  仅保留此Collection中那些也包含在指定Collection的元素
           * +int size()   返回此Collection中的元素数
           * +Object[] toArray()   返回包含此Collection中的所有元素的数组
    

集合实现类
Collection

  • HashSet(Set)
    • TreeSet(SortedSet)
  • LinkedList,Vector,ArrayList(List)

HashTable,HashMap(Map)

Set

模拟数学集合概念,特征:
(1)集合中不允许出现重复元素
(2)集合中不区分元素顺序
SortedSet接口只是增加了对集合存放的元素按升序排列的功能
HashSet类是Set接口常用的实现类,它不能存放重复的元素,且其中的元素是无序的,HashSet中可以存放null
HashSet集合判断元素重复的标准:

  • HashSet底层采用哈希表实现,向HashSet添加对象元素时,会根据对象的哈希码计算对象的存储位置,对象的哈希码通过Object类提供的hashCode()方法获得,hashCode()方法返回的值根据对象的内存地址得到哈希码。
  • 这两个对象通过new构造的地址不一样,得到的哈希码就不一样,所以HashSet认为两者是不同的对象;hashCode返回相同值的同时必须保证两个对象利用equals方法比较的结果为真,这样HashSet才认为两者为相同的对象。
  • 事实上,开发者只需要记住一点即可:如果用HashSet存放自定义类型的对象时,一定要重写hashcode()和equals()这两个方法,重写的原则是两个对象相同时保证两者的hashcode()方法返回相同的整数,并且两者利用equals()比较时返回true。

TreeSet类实现了Set接口的子接口SortedSet,基本特征和用法与HashSet类一样,只是增加了排序功能的集合。在将对象元素添加到TreeSet时,会按照一定排序规则,将元素插入到有序的对象序列中,保证TreeSet中的元素组成的对象序列时刻按照“升序”排列。 有一点要注意,向TreeSet添加的对象元素的类型必须实现处于java.lang包下的Comparable接口,否则程序运行时出现
java.lang.ClassCastException异常。API中的String类,封装类都已实现该接口,对于自定义类型,开发者必须实现Comparable接口,也就是说,要实现接口中的抽象方法。Comparable接口只有一个抽象方法: public int compareTo(Object o),用来实现排序规则。自定义类型如果不实现Comparable接口,即不去定义排序规则,Java运行时就不知道该如何排序,进而导致java.lang.ClassCastException异常。

List

基本特征是采用线性方式存放元素,具体表现为数组,向量,链表,栈和队列等。特征如下:
(1)集合区分元素的顺序,即按照元素的存入顺序存放元素
(2)允许存放重复元素
List接口允许使用者对插入列表的元素进行精确控制,并添加了根据元素索引位置来访问元素,搜索元素的功能。

                   相对于Collection接口List接口新增方法如下:
          +void add(int index, Object o)  在列表的指定位置插入指定元素
          +boolean addAll(int index, Collection)  将指定Collection中的所有元素插入到列表中的指定位置
          +Object get(int index)  返回列表中指定位置的元素
          +int indexOf(Object o)  返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,返回-1
          +int lastIndexOf(Object o)  返回此列表中最后出现的指定元素的索引,如果列表不包含此元素,返回-1
          +ListIterator listIterator(int index)  从列表的指定位置开始返回列表中元素的列表迭代器
          +Object remove(int index)  移除列表中指定位置的元素
          +Object set(int index, Object o)  用指定元素替换列表中指定位置的元素

List接口常用的主要实现类LinkedList,ArrayList和Vector的基本用法是一样的,只是底层的实现方式不同,导致各实现类适用的场合不同
适用迭代器遍历方法:Iterator是使用统一方式对各种集合元素进行遍历/迭代的工具。实际上,无论Collection的实际类型如何,都支持一个iterator()的方法,所以程序中定义print(Collection c)是一个通用的集合元素遍历方法,iterator()方法返回一个迭代子,使用该迭代子即可逐一访问Collection中的每一个元素。
迭代器典型用法:

Iterator it = collection.iterator(); //获得一个迭代子
while (it.hasNext()) {
Object obj = it.next; //获得下一个元素
}

  • LinkedList: 实现了List接口,以一般的双向链表完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素;如果在List的开始处增加元素,或者在List中进行插入删除操作,应该使用LinkedList
  • ArrayList: 实现了List接口,用于表示长度可变的数组列表;在构造对象时可以指定列表的长度,默认为10,不指定长度且实际添加对象数目超过10时,系统将自动增加列表长度;ArrayList是非同步的,适合在单线程环境下使用
  • Vector: 实现了List接口,表示一个可变的对象数组;Vector是同步(线程安全)的,占用资源多一些,相比ArrayList的运行效率低一些,主要用在多线程环境下。

Map

Map中存放的是成对“键 - 值”(Key - Value)信息,Map中的每一个元素都必须包括起到标识作用的“键“和元素”值“两部分。特征:
(1)在存放的键 - 值对不允许有重复的键
(2)每个键最多只能映射一个值
Map描述了映射结构,Mao中存放的是“键-值”对信息,Map中不能存放键重复的键值对,每个键只能映射一个值。允许通过键集,值集合或键值对映射关系的形式查看映射内容。 SortedMap只是增加了按照键 - 值对的键对元素进行升序排列功能

            java.util.Map(主要方法)
          +void clear()  从此映射中移除所有映射关系
          +boolean containsKey(Object key)  如果此映射包含指定键的映射关系,则返回true,否则返回false
          +boolean containsValue(Object value)  如果此映射将一个或多个键映射到指定值,返回true,否则返回false
          +Set entrySet()  返回此映射中包含的映射关系的Set集合
          +Object get(Object key)  返回指定键所映射的值,如果此映射不包含该键的映射关系,返回null
          +boolean isEmpty()  如果此映射未包含键 - 值映射关系,返回true,否则返回false
          +Set keySet()  返回所有映射中包含的键的Set集合
          +Object put(Object key, Object value)  将指定的指定键 - 值对放入此映射中
          +void putAll(Map m)  从指定映射中将所有映射关系复制到此映射中
          +Object remove(Object key)  如果存在一个键的映射关系,则将其从此映射中移除
          +int size()  返回此映射中的键 - 值映射映射关系数
          +Collection values()  返回此映射中包含的值的Collection集合

HashMap类实现了Map接口,是比较常用的Map实现类,HashMap集合用于存放“键-值”对信息,不能存放重复的“键-值”对。在HashMap中判断键值是否重复的标准和Set中判断添加元素的标准完全一致。
TreeMap类实现了Map接口的子接口SortedMap,基本使用方法和HashMap类似,只是在HashMap接口原有功能的基础上增加了对添加的“键-值”对元素按照“键”进行升序排列的功能。向TreeMap添加的“键-值”对元素的键类型必须实现Comparable接口或定义比较器类。
可配合接口Map.entry<K, V>来实现获得当前项对应的键或值

               java.util.Map.Entry<K,V>
          +K getKey()  返回与此项对应的键
          +V getValue()  返回与此项对应的值
          


          Map m = new HashMap();
          m.put("zhang", "1212");
          Set entrySet = m.entrySet(); //m此时不是java.lang.Iterable的数组或实例,所以得把m转换到Set集合
          for(Object obj: m) {
              Map.Entry entry  = (Map.Entry)obj; //必须显示的把Object类型转换为Map.Entry类型
              System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());
          }

内容不是很全,可以评论下,我好改改!