Java集合
1、 Java集合简介
       面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储。集合则是用于存储对象的,也只能存储对象,不能存基本数据类型,集合的长度是可变的,并可以存储不同类型的对象。
       Java提供了一个全新的集合框架,主要由一组用来操作对象的接口组成:
           Collection接口:一组允许重复的对象。
           Set接口继承Collection,但不允许重复,使用自己内部的一个排列机制(即元素是无序的,无序是指元素存入和取出的顺序不一定是一致的)。
           List接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
           Map接口是一组成对的key-value对象,Map中不能有重复的key,但可以有重复的value,也是无序的。
       下面是一张我从网上找的集合框架图,可以更好的帮助我们了解集合框架。


2、 Collection接口
       用于表示任何对象或元素组,是List和Set接口的父接口。AbstractCollection是其一个抽象类。
       Collection接口的iterator()方法返回一个Iterator。Iterator接口方法能以迭代方式逐个访问集合中各个元素,Iterator要依赖Collection或其实现类。
       补充
       Iterator下有三个方法:
           (1)boolean hasNext():判断是否存在另一个可访问的元素。
           (2)Object next():返回要访问的下一个元素。如果到达集合结尾,则抛出NoSuchElementExcption异常。
           (3)void remove():删除上次访问返回的对象。本方法必须紧跟在一个元素的访问后执行,如果上次访问后集合已被修改,方法将抛出IllegalStateException异常。Iterator中删除操作对底层Collection也有影响。
       当另一个线程修改底层集合的时候,如果正在用Iterator遍历集合,那么Iterator会抛出ConcurrentModificationException异常并立刻失败。
3、 List接口
       List接口继承了Collection接口,从而用来定义一个允许重复项的有序集合,该接口不但能够对列表的一部分进行处理,还添加了对索引的操作。
       (1)AbstractList和AbstractSequentialList抽象类
                AbstractList和AbstractSequentialList是两个抽象的List实现类,像AbstractSet类一样,他们覆盖了equals()和hashCode()方法以确保两个相等的集合返回相同的哈希码。若两个列表大小相等且包含顺序相同的相同元素,则这两个列表相等。这里的hashCode()实现在List接口定义中指定,而在这里实现。
       (2)LinkedList和ArrayList类
               在集合框架中有两种常规的List实现:ArrayList和LinkedList。使用哪一种取决于特定的需要。
               ArrayList:底层的数据结构使用的是数组结构,查询修改速度很快,插入删除稍慢,线程不同步。
               LinkedList:底层数据结构是双向链表结构,删除插入很快,查询很慢。
       (3)ListIterator
                ListIterator接口继承Iterator接口以支持添加或更改底层集合中的元素,还支持双向访问。ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间。一个长度为n的列表有n+1个有效索引值。
       (4)Vector
                底层是数组数据结构,功能与ArrayList相似,是同步的线程安全,但效率低。建议使用ArrayList效率高,自己加锁即可。除此之外,Vector还提供了一个子类Stack,它模拟栈这种数据结构。
Stack st=new Stack();
st.push("zhangsan");
st.push("lisi");
System.out.println(st.peek());
st.push("wangwu");
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
       注意:前面说过,Arrays类提供了asList(Object ... a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector类的实例,而是Arrays的内部类ArrayList的实例,这是一个固定长度的List集合,因此程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。
       (5)Queue接口
                Queue通常用于模拟队列这种数据结构,队列通常是指”FIFO“(先进先出)的容器。PirorityQueue就是Queue接口的实现类。
PirorityQueue pq=new PirorityQueue();
//依次向pq中加入四个元素
pq.offer(6);
pq.offer(-3);
pq.offer(1);
pq.offer(9);
//输出pq队列,并不是按元素的加入顺序排列,而是按元素的大小顺序排列
System.out.println(pq);
//访问队列第一个元素,其实就是最小元素:-3
System.out.println(pq.peek());
4、 Set接口
       Set接口继承Collection接口,是无序的,不允许集合中存在重复项,是依据对象的hashCode码,用equals()方法对比,看两个对象是否重复。
       (1)HashSet:底层数据结构是哈希表,保证元素唯一性(先判断哈希值是否相同,若相同则判断是否是同一个对象,调用equals),线程是非同步的。
       (2)SortedSet接口:集合框架提供了个特殊的Set接口,它保持元素的有序顺序。添加到SortedSet实现类的元素必须实现Comparable接口,否则必须给它的构造函数提供一个Comparator接口的实现。TreeSet类是它的唯一的实现。SortedSet接口一般我们不直接使用,如果我们想要一个有序的Set,我们可以用它的实现类TreeSet
       (3)TreeSet:底层数据结构是二叉树。排序方法一:实现Comparable接口,重写compareTo方法;方法二:当元素不具备比较性时,就让集合自身具备比较性,定义一个类实现接口Comparator,重写compare方法(详细参考P160-161)。
5、 Map接口
       Map接口用于维护键值对,该接口描述了从不重复的键到值的映射。key不允许重复,而value可以重复。和Set很像,其实Set底层就是使用了Map集合。
       (1)HashMap和HashTable类
               都是Map接口典型的实现类。HashMap是线程不安全的实现,HashTable是线程安全的实现。HashTable不允许将null作为key或value,但HashMap允许。
       (2)SortedMap接口和TreeMap实现类
               SortedMap是Map派生的子接口之一,SortedMap有一个实现类TreeMap。TreeMap是一个有序的Map实现。
               有序实现一:TreeMap中的所有key必须实现Comparable接口,所有key的类型要一致。
               有序实现二:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序,采用该方法时不需要Map的key实现Comparable接口。如下所示:
Map map=new Map(new Comparator(){
      public int compare(Object arg0,Object arg1){
           Stu st1=(Stu)arg0;
           Stu st2=(Stu)arg1;
           int result=st1.name.compareTo(st2.name);
           if(result==0){
              result=st1.age<st2.age?1:(st1.age==st2.age?0:-1);
           }
           return  result; 
      }

});
       (3)WeakHashMap实现类
                  HashMap有key保留对实际对象的强引用,只要HashMap对象不被销毁,该HashMap对象所有key所引用的对象不会被垃圾回收。WeakHashMap中的每个key保存了实际对象的弱引用,当该对象所有key所引用的对象没有被其它强引用变量所引用时,这些key对应的对象就可能会被垃圾回收,然后自动删除这个key对应的key-value。
    基本操作:
        a、添加:
            put(K key, V value);
        b、删除:
            remove(Object key);
            clear();
        d、判断:
            containsKey(Object key);
            containsValue(Object values);
            isEmpty();
        e、获取:
            get(Object key);
            size();
            values();
            entrySet();
            keySet();
6、 Properties类
       Properties类是HashTable的子类,其实它是关联属性文件和Map的一种封装。Properties类中的key和value都是String类型,换句话说:Properties是key和value都为String的一个Map。用法如下:
Properties p=new Properties();
p.load(new FileInputStraem("test.properties"));
P.list(System.out);
System.out.println("----------");
p.put("sex","男");
p.list(System.out);
//写入文件
p.list(new PrintStream(new File("test1.properties")));




阅读更多
个人分类: 学习笔记
想对作者说点什么? 我来说一句

Java Generics and Collections

2018年05月09日 2.13MB 下载

JAVA 经典算法书集合(1)

2011年06月27日 10.57MB 下载

java集合与映射(牛)

2009年04月28日 3KB 下载

java 文件管理集合

2010年07月11日 6KB 下载

java集合框架图

2011年10月18日 313KB 下载

java集合API

2007年11月05日 204KB 下载

java集合思维导图

2017年08月07日 64KB 下载

JAVA应用实例集合

2011年12月03日 59KB 下载

JAVA 经典算法书集合(2)

2011年06月27日 5.6MB 下载

没有更多推荐了,返回首页

不良信息举报

Java集合

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭