黑马程序员_java集合框架1

来源:互联网 发布:教学钢琴的软件 编辑:程序博客网 时间:2024/06/05 13:04
 ---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

一、      集合类概述

1.1、为什么出现集合类?

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

 

1.2、数组和集合类同是容器,有什么不同呢?

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

集合框架出现许多容器的原因:因为每一个容器对数据的存储方式不同,这个存储方式称之为:数据结构。

 

1.3、集合的特点

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

 

二、      List

       List:元素是有序的,元素可以重复,因为该集合体系有索引;

               List集合判断元素是否相同,依据的是元素的equals方法。      

       List特有方法:

A、

void  add(int index,element):在指定角标插入指定元素;

boolean add(E e):向集合中添加元素;

boolean addAll(int index, Connection e):在指定位置插入指定的集合e;

B、

E remove(int index):移除列表中指定位置的元素;

boolean remove(Object o):从此列表中移除第一次出现的指定元素(如果存在)(可选操作);

boolean removeAll(Collection<?> c):从列表中移除指定 collection 中包含的其所有元素(可选操作);

C、

E set(int index,element):用指定元素替换列表中指定位置的元素;

D、 

E get(int index):获取指定角标的元素;

Lise subList(int fromIndex,int toIndex):获取从fromIndex(包括 )和 toIndex(不包括)之间的子集合;

示例:

  1. import java.util.*;  
  2.   
  3. class ListDemo   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         ArrayList al = new ArrayList();  
  8.         al.add("day01");  
  9.         al.add("day02");  
  10.         al.add("day03");  
  11.         al.add("day04");  
  12.   
  13.         ArrayList al1 = new ArrayList();  
  14.         al1.add("day11");  
  15.         al1.add("day12");  
  16.           
  17.         //al.add(2,"day08");  //在第二个位置上增加一个元素"day08";  
  18.         //System.out.println(al); //打印结果:[day01, day02, day08, day03, day04];  
  19.         //al.addAll(al1);  //将al1集合中所有的元素添加到al集合中;  
  20.         //System.out.println(al); //打印结果:[day01, day02, day03, day04, day11, day12];  
  21.           
  22.         //al.remove(2); //将集合中位置2上的元素删除;  
  23.         //System.out.println(al);//打印结果:[day01, day02, day04];  
  24.         //al.set(2,"day08"); //将集合中位置2上的元素更改为day08;  
  25.         //System.out.println(al);//打印结果:[day01, day02, day08, day04];  
  26.   
  27.         //System.out.println(al.get(2));// 获取位置2上的元素;  
  28.   
  29.         for(Iterator it = al.iterator(); it.hasNext(); )  
  30.         {     
  31.             System.out.println(it.next());  
  32.         }  
  33.         //获取元素位置;  
  34.         System.out.println(al.indexOf("day02"));  
  35.   
  36.         //从指定位置获取一个新的子集合。  
  37.         List sub = al.subList(1,3);  
  38.         System.out.println(sub);  
  39.     }  
  40. }

     

       2.1ListIterator

ListIteratorList集合特有的迭代器。是Iterator的子接口。ListIterator可以在遍历元素的时候对元素进行增删改查等操作。

在迭代时不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常,所以在迭代时只能用迭代器操作方法操作元素,但是Iterator的方法有限,只能对元素进行判断、取出、删除的操作,如果想要其他操作如添加、修改等,就需要使用其子接口ListIterator,该接口只能通过List集合的Listiterator方法获取。 

示例:

  1. import java.util.*;  
  2.   
  3. class ListDemo1   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         ArrayList al = new ArrayList();  
  8.         al.add("day01");  
  9.         al.add("day02");  
  10.         al.add("day03");  
  11.         al.add("day04");  
  12.   
  13.         System.out.println(al);  
  14.           
  15.         for(ListIterator li = al.listIterator();li.hasNext(); )  
  16.         {   //此时如果用Iterator it = al.iterator(),  
  17.             //将会发生ConcurrentModificationException异常;  
  18.             Object obj = li.next();  
  19.             if(obj.equals("day02"))  
  20.                 //li.add("java");//在day02后添加元素java;  
  21.                 li.set("java");  //将day02更改为java;  
  22.         }  
  23.         System.out.println(al);  
  24.     }  

List常用的三个子类:ArrayListLinkedListVector

       各自特点(重点)

       ArrayList:底层使用的数据结构是数组结构。查询速度很快,但增删稍慢,线程不同步。

       LinkedList:底层使用的数据结构是链表数据结构。增删很快,但查询较慢。

       Vector:底层使用的是数组数据结构。线程同步,现已被ArrayList替代。

Enumeration(枚举):枚举是Vector特有的取出元素的方式,枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长,所以枚举被迭代器替代了。


       2.2ArrayList子类共性方法

       1)add方法中的参数类型是Object,以便于接受任意类型对象;

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

 

       常用方法:

       1)int size();  //获取集合长度

       2)boolean remove(Object o) //删除集合中某个对象;

       3)boolean removeAll(Cllection c) //删除集合同的对象;

       4)boolean retainAll(Collection c)//保留集合中相同的对象;

       5)Iterator itorator();

       迭代器:取出集合中元素的方式。

       示例:

  1. import java.util.*;  
  2.   
  3. class CollectionDemo   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         method2();  
  8.     }  
  9.   
  10.     public static void method2()  
  11.     {  
  12.         ArrayList al = new ArrayList();  
  13.   
  14.         al.add("day01");  
  15.         al.add("day02");  
  16.         al.add("day03");  
  17.         al.add("day04");  
  18.         for(Iterator it = al.iterator(); it.hasNext(); )  
  19.         {    //获取迭代器用于取出集合中的元素;  
  20.             System.out.println(it.next());  
  21.         }  
  22.     }  
  23.   
  24.     public static void method()  
  25.     {  
  26.         ArrayList al = new ArrayList();  
  27.   
  28.         al.add("day01");  
  29.         al.add("day02");  
  30.         al.add("day03");  
  31.         al.add("day04");  
  32.           
  33.         //al.clear();    
  34.         al.remove("day01");  //删除集合中的对象;  
  35.         System.out.println("集合是否为空:"+al.isEmpty());//判断集合是否为空;  
  36.         System.out.println("集合对象:"+al);  //打印集合中的对象;  
  37.         System.out.println("集合中包含day01:"+al.contains("day01"));//集合中是否包含某一对象;  
  38.         System.out.println("al长度:"+al.size());//打印集合长度  
  39.     }  
  40.   
  41.     public static void method1()  
  42.     {  
  43.         ArrayList al1 = new ArrayList();  
  44.         al1.add("day01");  
  45.         al1.add("day02");  
  46.         al1.add("day03");  
  47.         al1.add("day04");  
  48.   
  49.         ArrayList al2 = new ArrayList();  
  50.         al2.add("day01");  
  51.         al2.add("day02");  
  52.         al2.add("day06");  
  53.         al2.add("day07");  
  54.           
  55.         al1.removeAll(al2);//删除集合中相同的对象;  
  56.         //al1.retainAll(al2);  //保留集合中相同的对象;  
  57.         System.out.println(al1);  
  58.         System.out.println(al2);  
  59.     }  

2.3LinkedList类共性方法

LinkedList特有方法:

addFirst();

addLast();

 

getFirst();  可以获取元素,但不删除元素;如果集合中没有元素,将会

getLast();  抛出noSuchElementException异常

 

removeFirst(); 可以获取元素,同时删除元素;如果集合中没有元素,将

removeLast(); 会抛出noSuchElementException异常

JDK1.6版本后出现了替代方法:

pollFirst();  可以获取元素,但会删除元素;如果集合中没有元素,将会

pollLast();  返回null

 

offerFirst();  在集合开头插入一个元素;

offerLast();  在集合结尾插入一个元素;

 

peekFirst();  可以获取元素,同时不删除元素;如果集合中没有元素,将

peekLast();  返回null

示例:

  1. import java.util.*;  
  2.   
  3. class LinkedListDemo   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         LinkedList link = new LinkedList();  
  8.   
  9.         link.add("day01");  
  10.         link.add("day02");  
  11.         link.add("day03");  
  12.         link.add("day04");  
  13.         //获取第一个元素;打印结果:day01;  
  14.         //System.out.println(link.getFirst());  
  15.         //删除第一个元素;打印结果:day01;  
  16.         //但集合中的第一个元素被删除;  
  17.         //System.out.println(link.removeFirst("day08"));  
  18.         System.out.println(link.offerFirst("day08"));  
  19.         System.out.println(link);  
  20.   
  21.         //获取集合中所有元素;  
  22.         while(!link.isEmpty())  
  23.         {  
  24.             //顺着打印  
  25.             //System.out.println(link.removeFirst());  
  26.             //倒着打印  
  27.             System.out.println(link.removeLast());  
  28.         }  
  29.     }  
  30. }

练习:

   1、向一个集合中存入对象,同时又从中取出对象,要求先进的先出,后进的后出。 

  1. import java.util.*;  
  2.   
  3. class DuiLie  
  4. {  
  5.     private LinkedList link;  
  6.   
  7.     DuiLie()  
  8.     {  
  9.         link = new LinkedList();  
  10.     }  
  11.   
  12.     public void myAdd(Object obj)  
  13.     {  
  14.         link.addFirst(obj); //让进来的对象都依次从后往前排;  
  15.     }  
  16.   
  17.     public Object myGet()  
  18.     {  
  19.         return link.removeLast(); //取出的时候从最后开始取;  
  20.     }  
  21.   
  22.     public boolean isNull()  
  23.     {  
  24.         return link.isEmpty();//判断集合是否为空;  
  25.     }  
  26. }  
  27.   
  28. class LinkedListTest   
  29. {  
  30.     public static void main(String[] args)   
  31.     {  
  32.         DuiLie dl = new DuiLie();  
  33.         dl.myAdd("day01");  
  34.         dl.myAdd("day02");  
  35.         dl.myAdd("day03");  
  36.         dl.myAdd("day04");  
  37.           
  38.         while(!dl.isNull())  
  39.         {  
  40.             System.out.println(dl.myGet());  
  41.         }  
  42.     }  
  43. }

2、删除集合中重复的元素。

  1. import java.util.*;  
  2.   
  3. class ArrayListTest   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         ArrayList al = new ArrayList();  
  8.         al.add("day01");  
  9.         al.add("day08");  
  10.         al.add("day05");  
  11.         al.add("day01");  
  12.         al.add("day07");  
  13.   
  14.         al = singleElement(al);  
  15.         System.out.println(al);  
  16.     }  
  17.   
  18.     public static ArrayList singleElement(ArrayList al)  
  19.     {  
  20.         ArrayList newal = new ArrayList();  
  21.           
  22.         Iterator it = al.iterator();  
  23.         while(it.hasNext())  //使用迭代器遍历集合al中的元素;  
  24.         {  
  25.             Object obj = it.next();  
  26.   
  27.             if(!newal.contains(obj))//将集合中已有的元素去掉;  
  28.                 newal.add(obj);  //将al中的元素添加到newal中(不包含重复元素);  
  29.         }  
  30.         return newal;  
  31.     }  

3、将自定义对象作为元素存入到集合里,并去除重复元素

  1. import java.util.*;  
  2. class Person  
  3. {  
  4.     private String name;  
  5.     private int age;  
  6.     Person(String name,int age)  
  7.     {  
  8.         this.name = name;  
  9.         this.age = age;  
  10.     }  
  11.   
  12.     public boolean equals(Object obj)  
  13.     {  
  14.         if(!(obj instanceof Person))  
  15.             return false;  
  16.         Person p = (Person)obj;  
  17.         return this.name.equals(p.name) && this.age == p.age;  
  18.     }  
  19.   
  20.     public String getName()  
  21.     {  
  22.         return name;  
  23.     }  
  24.     public int getAge()  
  25.     {  
  26.         return age;  
  27.     }  
  28. }  
  29.   
  30. class ArrayListTest1   
  31. {  
  32.     public static void main(String[] args)   
  33.     {  
  34.         ArrayList al = new ArrayList();  
  35.   
  36.         al.add(new Person("lisi01",12));//al.add(Object o);   
  37.         al.add(new Person("lisi02",8));  
  38.         al.add(new Person("lisi02",8));//Object obj = new Person("lisi01",12);类型被提升为Object;  
  39.         al.add(new Person("lisi03",32));  
  40.         al.add(new Person("lisi04",28));  
  41.         al.add(new Person("lisi04",28));  
  42.           
  43.         al = singleElement(al);  
  44.   
  45.         Iterator it = al.iterator();  
  46.         while(it.hasNext())  
  47.         {  
  48.             Object obj = it.next();  
  49.             Person p = (Person)obj; //需要强转型为Person类才能调用方法;  
  50.             System.out.println(p.getName()+":"+p.getAge());  
  51.         }  
  52.     }  
  53.   
  54.     public static ArrayList singleElement(ArrayList al)  
  55.     {  
  56.         ArrayList newal = new ArrayList();  
  57.   
  58.         Iterator it = al.iterator();  
  59.         while(it.hasNext())  
  60.         {  
  61.             Object obj = it.next();  
  62.             if(!newal.contains(obj))  
  63.                 newal.add(obj);  
  64.         }  
  65.         return newal;  
  66.     }  
  67. }


三、      Set

Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。

Set集合的功能和Collection是一致的。

Set的两个常用子集:HashSettreeSet

 

3.1HashSet

HashSet:底层数据结构式哈希表。线程是非同步的。

HashSet保证元素唯一性是通过元素的两个方法hashCodeequals来完成的,如果元素的hashCode值相同才会判断equals是否为true,如果元素的hashCode值不同,则不会调用equals方法。

注意:对于判断元素是否存在(contains)以及删除(remove)等操作,依赖的方法是元素的hashCodeequals方法。

      

       3.2TreeSet

       TreeSet:底层数据结构式二叉树,可以对Set集合中的元素进行排序。

       TreeSet保证元素唯一性的依据是compareTo方法return 0.

       TreeSet的第一种排序方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。该顺序也被称为元素的自然顺序或者默认顺序。

    示例:

  1. import java.util.*;  
  2. class TreeSetDemo   
  3. {  
  4.     public static void main(String[] args)   
  5.     {  
  6.         TreeSet ts = new TreeSet();  
  7.         ts.add(new Student("java04",25));  
  8.         ts.add(new Student("java01",12));  
  9.         ts.add(new Student("java05",12));  
  10.         ts.add(new Student("java02",18));  
  11.         ts.add(new Student("java03",22));  
  12.         Iterator it = ts.iterator();  
  13.         while(it.hasNext())  
  14.         {  
  15.             Student s = (Student)it.next();  
  16.             System.out.println(s.getName()+"..."+s.getAge());  
  17.         }  
  18.     }  
  19. }  
  20. class Student implements Comparable//让Student实现Comparable接口,  
  21. {                                  //使之具有比较性;  
  22.     private String name;  
  23.     private int age;  
  24.     Student(String name,int age)  
  25.     {  
  26.         this.name = name;  
  27.         this.age = age;  
  28.     }  
  29.     public int compareTo(Object obj)//覆盖Comparable中的compareTo方法;  
  30.     {  
  31.         if(!(obj instanceof Student))  
  32.             throw new RuntimeException("类型不匹配");  
  33.         Student s = (Student)obj;  
  34.         if(this.age>s.age) //比较学生的年龄;  
  35.             return 1;  
  36.         if(this.age == s.age)//如果年龄相同,则再次比较姓名,  
  37.         {                    //再按照姓名顺序排序;  
  38.             return this.name.compareTo(s.name);  
  39.         }  
  40.         return -1;  
  41.     }  
  42.     public String getName()  
  43.     {  
  44.         return name;  
  45.     }  
  46.     public int getAge()  
  47.     {  
  48.         return age;  
  49.     }  

       TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的时,这时就需要让集合自身具备比较性。 实现方式:在集合初始化时,就让其具备比较性。即定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

       定义比较器的方法:定义一个类实现Comparator接口,覆盖其Compare方法。

    示例:

  1. import java.util.*;  
  2. class TreeSetDemo1   
  3. {  
  4.     public static void main(String[] args)   
  5.     {  
  6.         TreeSet ts = new TreeSet(new MyCompare());//将比较器对象作为参数传递给  
  7.         ts.add(new Student("java01",12));     //TreeSet集合的构造函数,让集合具有比较性;  
  8.         ts.add(new Student("java01",18));  
  9.         ts.add(new Student("java05",28));  
  10.         ts.add(new Student("java03",20));  
  11.         ts.add(new Student("java04",16));  
  12.         ts.add(new Student("java02",35));  
  13.         Iterator it = ts.iterator();  
  14.         while(it.hasNext())  
  15.         {  
  16.             Student s = (Student)it.next();  
  17.             System.out.println(s.getName()+"::"+s.getAge());  
  18.         }  
  19.     }  
  20. }  
  21. class Student  
  22. {  
  23.     private String name;  
  24.     private int age;  
  25.     Student(String name,int age)  
  26.     {  
  27.         this.name = name;  
  28.         this.age= age;  
  29.     }  
  30.     public String getName()  
  31.     {  
  32.         return name;  
  33.     }  
  34.     public int getAge()  
  35.     {  
  36.         return age;  
  37.     }  
  38. }  
  39. class MyCompare implements Comparator//定义一个比较器,让其实现Comparator接口;  
  40. {  
  41.     public int compare(Object o1,Object o2)//覆盖Comparator中的compare方法,  
  42.     {                                      //让其按照我们自定义的放将对象进行比较;  
  43.         Student s1 = (Student)o1;  
  44.         Student s2 = (Student)o2;         
  45.         int num = s1.getName().compareTo(s2.getName());  
  46.         if(num == 0)  //当名字相同时,再继续比较年龄,按年龄大小进行排序;  
  47.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  48.         return num;     //将学生的年龄进行封装,再做比较;  
  49.     }  
  50. }

       当两种方式都存在时,以比较器为主。

       注意:排序时,当主要条件相同时,一定要判断一下次要条件。


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

原创粉丝点击