Java面向对象 集合(上)

来源:互联网 发布:java ftp批量下载文件 编辑:程序博客网 时间:2024/06/06 16:36


Java面向对象  集合(上)


知识概要:

            (1)体系概述 

            (2)共性方法

            (3)迭代器

            (4)list集合

            (5)Set 集合



体系概述:

             集合类

  为什么出现集合类? 


      • 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多 个对象的操作,就对对象进行存储,集合就 

        是存储对象最常用的一 种方式。

     数组和集合类同是容器,有何不同? 


      •  数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
         数组中可以存储基本数据类型,集合只能存储对象。

  集合类的特点 


     •  集合只用于存储对象,集合长度是可变的,集合可以存储不同类型 的对象。

集合的体系结构图

    


List接口中常用类

 Vector     :  线程安全,但速度慢,已被 ArrayList替代。
 ArrayList  :  线程不安全,查询速度快。
 LinkedList:  链表结构,增删速度快。


Collection定义了集合框架的共性功能。


1,添加
            add(e);
            addAll(collection);

2,删除  
            remove(e);
            removeAll(collection);
            clear();

3,判断
           contains(e);
           isEmpty();

4,获取
           iterator();
           size();

5,获取交集
           retainAll();

6,集合变数组
          toArray();

   1,add方法的参数类型是Object。以便于接收任意类型对象。

   2,集合中存储的都是对象的引用(地址)


Collection
         |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
               |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
               |--LinkedList:底层使用的链表数据结构。            特点:增删速度很快,查询稍慢。线程不同步。
               |--Vector:底层是数组数据结构。                         特点:线程同步。被ArrayList替代了。因为效率低。

        |--Set:元素是无序,元素不可以重复。



List:
        特有方法。凡是可以操作角标的方法都是该体系特有的方法。


       add(index,element);
       addAll(index,Collection);


       remove(index);


       set(index,element);

       get(index):
       subList(from,to);


       listIterator();


       int indexOf(obj):获取指定元素的位置。


       ListIterator listIterator();


List集合特有的迭代器。    ListIterator是Iterator的子接口。

       在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

       所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,

       删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

       该接口只能通过List集合的listIterator方法获取。


什么是迭代器呢?

      其实就是集合的取出元素的方式。如同抓娃娃游戏机中的夹子。

      迭代器是取出方式,会直接访问集合中的元素。
      所以将迭代器通过内部类的形式来进行描述。
      通过容器的iterator()方法获取该内部类的对象。

迭代注意事项

  迭代器在Collcection接口中是通用的,它替 代了Vector类中的Enumeration(枚举)。
  迭代器的next方法是自动向下取元素,要避出现NoSuchElementException。
  迭代器的next方法返回值类型是Object,所以要记得类型转换。 

让我们先来看一个类Vector

import java.util.*;/*枚举就是Vector特有的取出方式。发现枚举和迭代器很像。其实枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长。所以被迭代器取代了。枚举郁郁而终了。*/class VectorDemo {public static void main(String[] args) {Vector v = new Vector();v.add("java01");v.add("java02");v.add("java03");v.add("java04");Enumeration en = v.elements();while(en.hasMoreElements()){System.out.println(en.nextElement());}}}

class  CollectionDemo{public static void main(String[] args) {method_get();}public static void method_get(){ArrayList al = new ArrayList();//1,添加元素。al.add("java01");//add(Object obj);al.add("java02");al.add("java03");al.add("java04");/*Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。while(it.hasNext()){sop(it.next());}*/for(Iterator it = al.iterator(); it.hasNext() ; ){sop(it.next());}}public static void method_2(){ArrayList al1 = new ArrayList();al1.add("java01");al1.add("java02");al1.add("java03");al1.add("java04");ArrayList al2 = new ArrayList();al2.add("java03");al2.add("java04");al2.add("java05");al2.add("java06");//al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。al1.removeAll(al2);sop("al1:"+al1);sop("al2:"+al2);}public static void base_method(){//创建一个集合容器。使用Collection接口的子类。ArrayListArrayList al = new ArrayList();//1,添加元素。al.add("java01");//add(Object obj);al.add("java02");al.add("java03");al.add("java04");//打印原集合。sop("原集合:"+al);//3,删除元素。//al.remove("java02");//al.clear();//清空集合。//4,判断元素。sop("java03是否存在:"+al.contains("java03"));sop("集合是否为空?"+al.isEmpty());//2,获取个数。集合长度。sop("size:"+al.size());//打印改变后的集合。sop(al);}


LinkedList:特有方法:
    
    addFirst();
   
    addLast();
    
    getFirst();
    
    
getLast();
   
    获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
    removeFirst();
    removeLast();
    获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

    在JDK1.6出现了替代方法。
    offerFirst();
  
    offerLast();

    peekFirst();

    
peekLast();
    
获取元素,但不删除元素。如果集合中没有元素,会返回null。
    pollFirst();
    pollLast();
    
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

 
LinkedList举例


/*使用LinkedList模拟一个堆栈或者队列数据结构。堆栈:先进后出  如同一个杯子。队列:先进先出 First in First out  FIFO 如同一个水管。*/import java.util.*;class DuiLie{private LinkedList link;DuiLie(){link = new LinkedList();}public void myAdd(Object obj){link.addFirst(obj);}public Object myGet(){return link.removeFirst();}public boolean isNull(){return link.isEmpty();}}class  LinkedListTest{public static void main(String[] args) {DuiLie dl = new DuiLie();dl.myAdd("java01");dl.myAdd("java02");dl.myAdd("java03");dl.myAdd("java04");while(!dl.isNull()){System.out.println(dl.myGet());}}}
Set集合

              |--HashSet
                                  数据结构是哈希表。线程是非同步的。
                                       保证元素唯一性的原理:判断元素的hashCode值是否相同。
                                             如果相同,还会继续判断元素的equals方法,是否为true。
             |--TreeSet
                                  可以对Set集合中的元素进行排序。
                                             底层数据结构是二叉树。
                                                    保证元素唯一性的依据:
                                                         compareTo方法return 0.
  
    TreeSet排序
 
    第一种方式:让元素自身具备比较性。
    元素需要实现Comparable接口,覆盖compareTo方法。
    也种方式也成为元素的自然顺序,或者叫做默认顺序。

    第二种排序方式。
    当元素自身不具备比较性时,或者具备的比较性不是所需要的。
    这时就需要让集合自身具备比较性,定义结合比较器comparator, 在集合初始化时,就有了比较方式。

HashSet是如何保证元素唯一性的呢?
       是通过元素的两个方法,hashCode和equals来完成。

       如果元素的HashCode值相同,才会判断equals是否为true。
       如果元素的hashcode值不同,不会调用equals。
       注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

代码演示
import java.util.*;/*往hashSet集合中存入自定对象姓名和年龄相同为同一个人,重复元素。*/class HashSetTest {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs = new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));//hs.add(new Person("a2",12));//hs.add(new Person("a4",14));//sop("a1:"+hs.contains(new Person("a2",12)));//hs.remove(new Person("a4",13));Iterator it = hs.iterator();while(it.hasNext()){Person p = (Person)it.next();sop(p.getName()+"::"+p.getAge());}}}class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}public int hashCode(){System.out.println(this.name+"....hashCode");return name.hashCode()+age*37;}public boolean equals(Object obj){if(!(obj instanceof Person))return false;Person p = (Person)obj;System.out.println(this.name+"...equals.."+p.name);return this.name.equals(p.name) && this.age == p.age;}public String getName(){return name;}public int getAge(){return age;}}
TreeSet集合排序示例

import java.util.*;/*当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法。*/class Student implements Comparable//该接口强制让学生具备比较性。{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}public int compareTo(Object obj){//return 0;if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");Student s = (Student)obj;//System.out.println(this.name+"....compareto....."+s.name);if(this.age>s.age)return 1;if(this.age==s.age){return this.name.compareTo(s.name);}return -1;/**/}public String getName(){return name;}public int getAge(){return age;}}class TreeSetDemo2 {public static void main(String[] args) {TreeSet ts = new TreeSet();ts.add(new Student("lisi02",22));ts.add(new Student("lisi02",21));ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi06",18));ts.add(new Student("lisi06",18));ts.add(new Student("lisi007",29));//ts.add(new Student("lisi007",20));//ts.add(new Student("lisi01",40));Iterator it = ts.iterator();while(it.hasNext()){Student stu = (Student)it.next();System.out.println(stu.getName()+"..."+stu.getAge());}}}class MyCompare implements Comparator{public int compare(Object o1,Object o2){Student s1 = (Student)o1;Student s2 = (Student)o2;int num = s1.getName().compareTo(s2.getName());if(num==0){return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));/*if(s1.getAge()>s2.getAge())return 1;if(s1.getAge()==s2.getAge())return 0;return -1;*/}return num;}}





0 0
原创粉丝点击