码迷,mamicode.com
首页 > 编程语言 > 详细

java集合框架

时间:2016-05-13 15:20:09      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:

Java集合框架
Collection接口API
Iterator迭代器接口
Collection子接口之一:Set接口
HashSet  LinkedHashSet  TreeSet
Collection接口之二:List接口
ArrayList LinkedList Vector
Map接口
HashMap TreeMap Hashtable
Collections工具类


java集合概述:
一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中。

Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。

 1.存储对象可以考虑:①数组 ②集合
 * 2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Student();....
 *    >弊端:①一旦创建,其长度不可变。②真实的数组存放的对象的个数是不可知。
 * 3.集合
 *     Collection接口
 *             |------List接口:存储有序的,可以重复的元素
 *                     |------ArrayList(主要的实现类)、LinkedList(对于频繁的插入、删除操作)、Vector(古老的实现类、线程安全的)
 *             |------Set接口:存储无序的,不可重复的元素
 *                     |------HashSet、LinkedHashSet、TreeSet
 *     Map接口:存储“键-值”对的数据
 *             |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子类:Properties)


lJava 集合可分为CollectionMap两种体系
Collection接口:
    Set元素无序、不可重复的集合---类似高中的“集合
    List元素有序,可重复的集合 ---动态数组
Map接口:具有映射关系“key-value对”的集合---类似于高中的“函数”y =f(x)   (x1,y1) (x2,y2)

技术分享



技术分享

Collection 接口是ListSet 接口的父接口,该接口里定义了List、Set的常用抽象方法。

       1.size():返回集合中元素的个数
       
        2.add(Object obj):向集合中添加一个元素
   
        3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
        Collection coll1 = Arrays.asList(1, 2, 3);
        coll.addAll(coll1);

        // 4.isEmpty():判断集合是否为空
        System.out.println(coll.isEmpty());

        // 5.clear():清空集合元素
        coll.clear();
        System.out.println(coll.isEmpty());

        // 6.contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false
        // 判断的依据:根据元素所在的类的equals()方法进行判断
        // 明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法!

       // 7.containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素

      // 8.retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合(将当前集合修改了)

        // 9.remove(Object obj):删除集合中的obj元素。若删除成功,返回true。否则,返回false

      //13.toArray() :将集合转化为数组
        Object[] obj = coll.toArray();
     
      //14  Iterator iterator = coll.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

集合的遍历:
方式一:
Iterator i = coll.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
示意图:
技术分享
方式二://使用增强for循环实现集合的遍历

for(Object i:coll){
            System.out.println(i);
        }
//使用增强for循环实现数组的遍历
    @Test
    public void testFor1(){
        String[] str = new String[]{"AA","BB","DD"};
        for(String s:str){
            System.out.println(s);
        }
    }
增强for循环的注意点
String[] str = new String[]{"AA","BB","DD"};
        for(int i = 0;i < str.length;i++){
            str[i] = i + "";
        }
        
        for(int i = 0;i < str.length;i++){
            System.out.print(str[i]+“ ”);
        }
打印结果:0 1 2
通过str[i]这种方式可以修改数组的值。

String[] str = new String[]{"AA","BB","DD"};
        for(String s : str){
            s =  "MM";//此处的s是新定义的局部变量,其值的修改不会对str本身造成影响。
            System.out.println(s);
        }        
        
        for(int i = 0;i < str.length;i++){
            System.out.print(str[i]+“ ”);
        }

打印结果AA BB CC
s是新定义的局部变量,其值的修改不会对str本身造成影响。


List的常用方法(有序可以重复的集合):(在继承colletion的基础上,会有一些自己的方法)

     * List中相对于Collection,新增加的方法
     *  void add(int index, Object ele):在指定的索引位置index添加元素ele
        boolean addAll(int index, Collection eles)
        Object get(int index):获取指定索引的元素
        Object remove(int index):删除指定索引位置的元素
        Object set(int index, Object ele):设置指定索引位置的元素为ele
        int indexOf(Object obj):返回obj在集合中首次出现的位置。没有的话,返回-1
        int lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置.没有的话,返回-1
        List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex结束的左闭右开一个子list
        
        List常用的方法:增(add(Object obj)) 删(remove) 改(set(int index,Object obj))
                    查(get(int index)) 插(add(int index, Object ele)) 长度(size())
     */
      ArrayList:List的主要实现类,底层数组存储。
      LinkedList:相对于ArrayList,linkedList底层是用链表实现的。
     新增加的方法:
     void addFirst(Objectobj)
     void addLast(Objectobj
     Object getFirst()
     Object getLast()
      Vector 是一个古老的集合类,是线程安全的。

ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,查询时候很快,
但是最大的缺点就是插入删除时非常麻烦(会有大量的位置移动)
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引,
对于频繁的插入或删除元素的操作 ,效率很高, 但是缺点就是查找非常麻烦 要丛第一个索引开始。

Set 接口:

Set接口是Collection的子接口,set接口没有提供额外的方法 Set:存储的元素是无序的,不可重复的! *  1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。 * 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
HashSet:Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet具有以下特点:
不能保证元素的排列顺序
HashSet不是线程安全的
集合元素可以是 null
* 说明:要求添加进HashSet中的元素所在的类,一定要重写equals()和hashCode()方法。
 进而保证Set中元素的不可重复性!

* HashSet中的元素时如何存储的呢?使用了哈希算法。
* 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
* 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
* 已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 万一返回false呢,都存储。(不建议如此)
* >要求:hashCode()方法要与equals()方法一致。


LinkedHashSet:
LinkedHashSetHashSet的子类

使用链表维护了一个添加进集合中的顺序。导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的!
LinkedHashSet根据元素的 hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存
LinkedHashSet插入性能略低于 HashSet(因为得维护链表的结构),但在迭代访问 Set 里的全部元素时有很好的性能()。

TreeSet: 不是HashSet的子类,是Set的实现类。
1.向TreeSet中添加的元素必须是同一个类的。
     * 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
     * 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
     * 4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
     * 在此方法中,指明按照自定义类的哪个属性进行排序。
     //当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列。
public class Person implements Comparable
    @Override
    public int compareTo(Object o) {
        if(o instanceof Person){
            Person p = (Person)o;
            //return this.name.compareTo(p.name);
            //return -this.age.compareTo(p.age);
            int i = this.age.compareTo(p.age);
            if(i == 0){
                return this.name.compareTo(p.name);
            }else{
                return i;
            }
        }
        return 0;
    }
     *
     * 5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此
     * 属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
     * 6,添加元素时,先compareTo(),如果return 0,则不添加,如果return的不是0,再hashcode()和equals方法比较。
     * >要求compareTo()与hashCode()以及equals()三者保持一致!


     * TreeSet的定制排序: 见下面的步骤 compare()与hashCode()以及equals()三者保持一致!
     */
    @Test
    public void testTreeSet2() {
        // 1.创建一个实现了Comparator接口的类对象
        Comparator com = new Comparator() {
            // 向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer
            // 的哪个属性排序的。
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Customer && o2 instanceof Customer) {
                    Customer c1 = (Customer) o1;
                    Customer c2 = (Customer) o2;
                    int i = c1.getId().compareTo(c2.getId());
                    if (i == 0) {
                        return c1.getName().compareTo(c2.getName());
                    }
                    return i;
                }
                return 0;
            }
        };
        // 2.将此对象作为形参传递给TreeSet的构造器中
        TreeSet set = new TreeSet(com);
        // 3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象。
        set.add(new Customer("AA", 1003));
        set.add(new Customer("BB", 1002));
        set.add(new Customer("GG", 1004));
        set.add(new Customer("CC", 1001));
        set.add(new Customer("DD", 1001));

        for (Object str : set) {
            System.out.println(str);
        }
    }

Map接口:
MapCollection并列存在。用于保存具有映射关系的数据:Key-Value
Map 中的 key 和  value 都可以是任何引用类型的数据
Map 中的 key Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()equals()方法。
常用String类作为Map的“键”。
key value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的确定的 value
技术分享


技术分享

技术分享
 HashMap: 1.key是用Set来存放的,不可重复。value是用Collection来存放的,可重复
     * 一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的。
     * 2.向HashMap中添加元素时,key是用set来存储的。先根据hashcode()判断,在根据equals判断,跟set的判断一样,若相同 则只能添加进添加的那个元素(会被后面这个覆盖)。
例如:
        map.put(new Person("zhangsan",45), 123);
        map.put(new Person("zhangsan",45), 789);//Person类重写了hashCode,equals方法,下面的value为789的会覆盖之前的value为123。

Map的遍历:
方法一
Set keySet = map.keySet();
        for (Object object : keySet) {
            System.out.println(object+"---->"+map.get(object));
        }
方法二:
Set entrySet = map.entrySet();
        for (Object object : entrySet) {
            Map.Entry entry=(Entry) object;
            System.out.println(entry.getKey()+"---->"+entry.getValue());
        }
Map接口的常用实现类:HashMapTreeMapProperties

HashMapMap接口使用频率最高的实现类。
允许使用null键和null值,与HashSet一样,不保证映射的顺序。
HashMap判断两个key 相等的标准是:hashCode值相等,两个key通过 equals()方法返回true
HashMap判断两个value相等的标准是:两个value通过 equals()方法返回 true

LinkedHashMapHashMap的子类
LinkedHashSet类似LinkedHashMap可以维护Map的迭代顺序:迭代顺序与Key-Value对的插入顺序一致

TreeMap存储Key-Value 时,需要根据key-value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。
TreeMapKey的排序:
自然排序TreeMap的所有的Key必须实现 Comparable接口,而且所有的 Key应该是同一个类的对象,否则将会抛出 ClasssCastException
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要 MapKey实现Comparable 接口

TreeMap判断两个key相等的标准:跟treeSet一致。

Hashtable是个古老的Map实现类,线程安全。
HashMap不同,Hashtable不允许使用null作为 key value
HashMap一样,Hashtable也不能保证其中Key-Value对的顺序
Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。

Properties 类是Hashtable的子类,该对象用于处理属性文件
由于属性文件里的 keyvalue都是字符串类型,所以Properties里的keyvalue 都是字符串类型
存取数据时,建议使用setProperty(Stringkey,String value)方法和getProperty(String key)方法

?Properties pros = new Properties();
?pros.load(newFileInputStream("jdbc.properties"));
?String user = pros.getProperty("user");
?System.out.println(user);


操作集合的工具类Collections:

        reverse(List):反转 List 中元素的顺序
        sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
        sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
        swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换


        Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
        Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
        Object min(Collection)
        Object min(Collection,Comparator)
        int frequency(Collection,Object):返回指定集合中指定元素的出现次数

Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题

技术分享








java集合框架

标签:

原文地址:http://blog.csdn.net/hangshuai799/article/details/51381686

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!