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

集合框架

集合相关接口和类均处于 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());
          }

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值