Java集合框架


今天学集合框架,在这里整理记录以巩固所学。

集合概述

集合是保存和管理对象的容器。

一个程序包含的对象某些情况下可以是指定数量、类型和生命周期的,例如当我们想保存一组基本数据类型数据时,我们可以选择使用数组,数组是保存一组对象的有效方式。
而在大多数实际应用场合中,程序所需的对象往往是根据运行时具体情况决定创建条件的,在此之前一般无法确定创建对象的数量、类型等。集合可以可以在任意时刻、任意位置,存储多种类型、任意数量的对象。

引入泛型:jdk5增加了泛型,弥补集合类型安全性问题。jdk5前,集合把所有对象都存储成Object类型,意味着所有对象都可被存储成任何类型,这可能导致集合中存储不兼容类型,从而产生运行时类型不匹配错误。引入泛型,集合可以记住容器中确切数据类型,避免运行时类型不匹配错误。


Java集合包括Collection和Map两种体系

1. Collection接口:一个独立元素的序列。该接口里定义的方法可用于操作List、Set等集合,jdk不提供该接口的直接实现,而通过List、Set等子接口实现。

这里写图片描述

所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个Iterator接口的对象。Iterator对象 称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素,其本身不提供承装对象的能力。如果要创建Iterator对象,则必须有一个被迭代的集合。Iterator接口常用方法有boolean hasNext()、E next()、void remove(),调用it.next()方法前必须先调用it.hasNext()判断是否有下一个元素,否则,如果没有下一条记录而直接调用it.next()会抛出NoSuchElementException异常。

java 5提供foreach循环迭代访问Collection

for(Person myperson:nowperson){
    System.out.println(myperson.getName());
}

示例代码:

public class TestForeach{
    public static void main(String[] args){
        String[] st = new String[5];
        for(String mySt:st){
            mySt = "yoyo";
            System.out.println(mySt);
        }
        for(int i=0;i<st.length;i++){
            System.out.println(st[i]);
        }
    }
}


List和Set继承自Collection接口

1)List:元素有序、可重复的集合(动态数组)。每个元素有其对应的顺序索引,元素对应一个整数型的序号记录其位置,便于存取。List接口添加了很多根据索引操作集合元素的方法,如插入void add(int index, Object ele)、删除Object remove(int index)、修改Object set(int index, Object ele)等等。

List接口有三个主要的实现类ArrayList、LinkList和Vector,ArrayList是List的经典实现类,它实质是对象引用的一个变长数组。ArrayList是线程不安全的,而Vector是线程安全的,但即使为保证List集合线程安全,也不推荐使用Vector。LinkList类用于插入、删除元素频繁的操作,它新增方法有void addFirst(Object obj)、void addLast(Object obj)、Object getFirst()、Object getLast()、Object removeFirst()、Object removeLast()等。Vector是很早的一个集合,jdk1.0就有了,大多数操作与ArrayList相同,区别在于它是线程安全的,但Vector总是比ArrayList慢,所以尽量少用Vector,而在List中,最好把ArrayList作为缺醒选择,当插入、删除频繁时使用LinkList。

List提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator继承Iterator接口,提供了专门操作List的方法:void add()、boolean hasPrevious()、Object previos()、boolean hasNext()、Object next()等。ListIterrator和Iterator都有hasNext()方法和next()方法,用以实现顺序向后遍历,都可以实现删除对象。但ListIterator有hasPrevious方法和previous方法,可以实现逆向遍历;有nextIndex()和previousindex(),可以定位当前的索引位置;有add()方法,可以向List中插入对象;ListIterator的set()可以实现对象的修改,Iterator仅能遍历。ListIterator的这些功能可以实现对LinkList等List数据结构的操作。

2)Set:元素无序、不可重复的集合。Set判断两个对象是否相同不是使用==运算符,而是用equals方法。除了Collection已有的的方法,Set接口没有提供额外的方法。

Set两个主要实现类是HashSet和TreeSet。
HashSet是Set接口的典型实现,按Hash算法来存储集合中的元素,具有很好的存取和查找性能。特征:(1)不能保证元素的的排列顺序;(2)不是线程安全的;(3)集合元素可以是null。向HashSet集合中存入一个元素时,HashSet会调用hasCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。HashSet集合通过两个对象的equals()方法比较判断两个元素是否相等,并且两个对象的hashCode()方法返回值也应相等。如果两个元素的equals()方法返回true ,但它们的hashCode()返回值不相等,HashSet将把它们存储在不同的位置,但依然可以添加成功。存放在Set集合中的对象,其对应的类一定要重写equals()和hashCode()方法,以实现对象相等原则。重写hashCode()方法的基本原则(1)程序运行时同个对象多次调用hashCode()方法应该返回相同的值;(2)两个对象的equals()方法返回true时,它们返回的hashCode()方法返回值应相等;(3)对象用作equals()方法的Field,都应该用来计算hashCode值。
TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态。TreeSet两种排序方法:自然排序和定制排序,默认为自然排序。自然排序时,TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小,然后将元素按升序排列。如果试图把一个对象添加到TreeSet时,该对象的类必须实现Comparable接口,实现Comparable的类必须实现compareTo(Object obj)方法,两个对象通过compareTo(Object obj)方法的返回值来比较大小。向TreeSet添加元素时,只有第一个元素无须实现Comparable接口,后面的所有元素必须实现Comparable接口,因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的两个对象对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较返回值当把一个对象放入TreeSet中,重写该对象的equals()方法时,应保证该方法与compareTo(Object obj)方法返回一致的结果:如果两个对象通过equals()方法比较返回ture,则通过compareTo(Object obj)比较方法应返回0。如果需要定制排序,如降序排序,可通过Comparator接口,重写compare(T o1,T o2)方法。利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则o1大于o2;如果返回0,则相等;否则o1小于o2。实现定制排序,要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。但仍然只能向TreeSet中添加类型相同的对象,否则发生ClassCastException异常。定制排序判断两个对象相等时通过Comparator比较两个元素返回值是否为0。

2. Map接口:一组成对的“键值对”对象,即具有映射关系“key-value”的集合。Map和Collection并列存在。

这里写图片描述

Map是key对value的映射集合,key和value都可以是任何引用类型的数据。key用Set来存放,不能重复,即同一个Map对象所对应的类,须重写hashCode()方法和equals()方法,常用String类做Map的”键“。key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value,value可重复。常用方法:Object put(Object key,Object value)、Object remove(Object key)、Object get(Object key)等。
主要实现类有HashMap、TreeMap、Properties和Hashtable。
HashMap是Map使用频率最高的实现类,允许使用null键和null值,与HashSet一样,不保证映射的顺序。HashMap判断两个Key相等是两个Key通过equals()方法返回true,hashCode值也相等;判断两个value相等是两个value通过equals()方法返回true。
TreeMap存储Key-Value对时需要根据Key-Value对进行排序。TreeMap可以保证所有key-value对处于有序状态。自然排序:TreeMap所有的Key必须实现Compareble接口,而且所有的Key应该是同一个类的对象,否则会抛出ClassCastException异常;定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对于TreeMap中的所有key进行排序,不需要Map的Key实现Compareble接口。判读两个Key是通过compareTo()方法返回0。如果使用自定义的Key,所属类要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法返回0。
Hashtable是个较早的Map实现类,线程安全。与hashMap不同,Hashtable不允许使用null作为Key和Value,但它和hashMap一样,不保证Key-Value对顺序,判断Key、Value相等与hashMap一样。
Properties类是Hashtable的子类,该对象用于处理属性文件。Properties里的Key和value都是字符串类型存取数据时建议使用setProperties(String key,String value)方法和getProperties(String key)方法。

List、Set和Map是主要的三个主要接口。

Collections:操作List、Set、Map集合的工具类。提供一系列静态的方法对集合对象进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。

Enumeration接口是Iterator迭代器的“古老版本”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值