Java集合

原创 2015年07月08日 14:00:29
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集合类详解

Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMa...
  • u014136713
  • u014136713
  • 2016年08月01日 21:09
  • 117647

JAVA中的集合的概念

为什么要使用集合类 当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。 理解集合类 集合类存放于java.util包中。 集合类存放的都是...
  • Zhangxichao100
  • Zhangxichao100
  • 2016年05月01日 21:43
  • 2236

Java基础——集合(一)——集合体系、Collection集合

一、集合概述          Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而数组长度固定,不能满足变化的要求。所以,java提供了集合。          ...
  • haovip123
  • haovip123
  • 2015年05月02日 00:09
  • 12173

Java集合类操作优化经验总结

本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、Weak...
  • Gmarrylin
  • Gmarrylin
  • 2016年06月29日 17:30
  • 737

Java集合详解--什么是集合

什么是集合 集合类存放于java.util包中。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要...
  • wz249863091
  • wz249863091
  • 2016年10月17日 22:24
  • 4715

java 集合详解及如何应用

作为Java工程师,你是否还在不明所以的运用Java集合,这篇文章让你对Java集合不再困惑,对它有一个深刻的了解...
  • hellothejava
  • hellothejava
  • 2017年06月19日 11:03
  • 702

疯狂Java学习笔记(33)----------java集合概念和作用

终于学到疯狂Java讲义的第八章了------------java集合,在第七章卡了时间有点长!   一看java集合就是一种高大尚的东西呀!上几张图!                 各个集...
  • u011225629
  • u011225629
  • 2015年05月17日 16:24
  • 1689

java中的集合与队列

List ArrayList   以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第...
  • u011192409
  • u011192409
  • 2015年07月11日 14:32
  • 2650

java中集合输出的四种方式

一、Literator:迭代器 public boolean hasNext(); public E next() ; Iterator本身是一个接口,要想取得实例化只能依靠Collection...
  • wangdajiao
  • wangdajiao
  • 2016年08月12日 17:11
  • 3676

java集合对比汇总

java中的集合类结构List、Set和Map:       List是有序的集合,Set是无序的集合。Map是无序的键值对。HashMap详解:        HashMap有两个参数影响其性能:初...
  • zc474235918
  • zc474235918
  • 2016年06月24日 15:33
  • 759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java集合
举报原因:
原因补充:

(最多只允许输入30个字)