java--集合(1)--黑马程序员

集合(1)

主要内容:《 数组的局限性、Collection接口的结构和基本方法、批量操作、遍历、迭代器、list接口、list接口方法、ArrayList、Vector 》

1.数组的局限性

当我们面向对象编程时,总要处理大量的对象;
  1.处理大量对象,可以使用"数组"存储;
  2.但数组有很多的局限性:
     1).数组的长度一旦确定,后期不能更改;我们程序员可以定义新的数组,但是每次做这样的操作都很费事;
     2).数组在定义时,指定了"数据类型",那么这个数组就只能装这个数据类型的,不能装其它类型的。
 
   3.以上的两个局限性,对于我们程序员来说,在操作大量对象时,就非常的不方便。 所以这时,Java为我们提供了一种"工具"。它类似于"仓库",可以用来存             储大量的"引用"。
    
 这种"仓库"就是:"集合类";
   特点:
   1).对于我们程序员来说,就像一个"无底洞",可以装无数的"引用";我们不用关心"长度"信息;
   2).这些"集合类"可以装任何"引用数据"类型的数据;

2.Collection接口的结构

 

3.Collection接口的基本方法

1.添加:
   boolean add(Object e):将元素e的引用添加到集合中;如果此 collection 由于调用而发生更改,则返回 true。(
 2.删除
   boolean remove(Object o):将元素o从集合中删除。删除第一个匹配的元素,之后就返回;
   void clear():清空集合
 3.获取:
   boolean contains(Object o):查找集合中的元素o,如果有:返回true,否则返回false;内部使用equals()进行判断;
   boolean isEmpty():判断集合是否为空:
   int size():获取集合的大小;

使用子类:ArrayList

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         Collection list = new ArrayList();
 5         //2.boolean add(Object e):填充集合
 6         System.out.println(list.add("刘德华"));
 7         System.out.println(list.add("刘德华"));
 8         System.out.println(list.add("张学友"));
 9         System.out.println(list.add("刘亦菲"));
10         System.out.println("打印集合:"  + list);
11         
12         //3.boolean remove(Object o):将元素o从集合中删除
13         //从集合中移除"张学友"
14         /*
15         list.remove("张学友");//内部使用:equals()方法进行逐个判断。如果为true,则认为是相同元素,就执行删除
16         System.out.println("移除张学友后,打印集合:"  + list);
17         */
18         /*
19         list.remove("刘德华");
20         System.out.println("移除1刘德华后,打印集合:"  + list);
21         list.remove("刘德华");
22         System.out.println("移除2刘德华后,打印集合:"  + list);
23         */
24         //4.void clear()
25         /*
26         list.clear();
27         System.out.println("清空集合后,打印集合:" + list);
28         */
29         //5.boolean contains(Object o):查找集合中的元素o,如果有:返回true,否则返回false;
30         //在集合中查找"刘德华"
31         System.out.println("集合中是否存在刘德华:" + list.contains("刘德华"));//true
32         System.out.println("集合中是否存在范冰冰:" + list.contains("范冰冰"));//false
33         //6.boolean isEmpty():判断集合是否为空:
34         System.out.println("集合是否为空:" + list.isEmpty());
35         System.out.println("集合大小:" + list.size());
36         list.clear();
37         System.out.println("清空集合后,集合是否为空:" + list.isEmpty());
38         System.out.println("清空集合后,集合大小:" + list.size());
39     }
40 }

4.Collection的一些批量操作的方法:

boolean addAll(Collection c):将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 * boolean removeAll(Collection c):移除此collection 中那些也包含在参数collection 中的所有元素(可选操作)。


boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的"所有元素",则返回 true。


boolean retainAll(Collection c):移除此 collection 中未包含在指定 collection 中的所有元素。

 

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //定义两个集合
 4         Collection list1 = new ArrayList();
 5         list1.add("刘德华");
 6         list1.add("张学友");
 7         list1.add("刘亦菲");
 8         
 9         Collection list2 = new ArrayList();
10         list2.add("马云");
11         list2.add("柳传志");
12         list2.add("马化腾");
13         
14         
15         //1.boolean addAll(Collection c)
16     /*
17         list1.addAll(list2);
18         System.out.println(list1);
19         System.out.println(list2);
20     */
21         //2.boolean removeAll(Collection c)
22         /*
23         list1.removeAll(list2);
24         System.out.println("list1 = " + list1);
25         System.out.println("list2 = " + list2);
26         */
27         //3.boolean containsAll(Collection c)
28         /*
29         System.out.println(list1.containsAll(list2));
30         */
31         //4.boolean retainAll(Collection c)
32         list1.retainAll(list2);
33         System.out.println("list1 = " + list1);
34         System.out.println("list2 = " + list2.toString());
35     }
36 }

5.collection的遍历

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.定义集合
 4         Collection list = new ArrayList();
 5         //2.填充集合
 6         list.add("刘德华");
 7         list.add("张学友");
 8         list.add("郭富城");
 9         list.add("黎明");
10         
11         //3.遍历集合
12     //    System.out.println(list);//这不是遍历,是获取一个String
13         Object[] objArray = list.toArray();
14         for(int i = 0 ;i < objArray.length ; i++){
15             String s = (String)objArray[i];
16             System.out.println(s);
17         //    System.out.println(objArray[i]);//调用Object-->toString()
18         }
19     }
20 }

6.Collection存储自定义对象

 1 import java.util.ArrayList;
 2 import java.util.Collection;
 3 
 4 public class Demo {
 5     public static void main(String[] args) {
 6         //1.定义集合
 7         Collection list = new ArrayList();
 8         //2.填充集合
 9         /*
10         Cat c1 = new Cat("波斯猫",2,'雌');
11         list.add(c1);
12         */
13         list.add(new Cat("波斯猫",2,'雌'));
14         list.add(new Cat("折耳猫",3,'雄'));
15         list.add(new Cat("熊猫",4,'雌'));
16         list.add(new Cat("大脸猫",2,'雄'));
17         
18         //3.遍历集合
19         Object[] objArray = list.toArray();
20         for(int i = 0 ;i < objArray.length ; i++){
21             Cat c = (Cat)objArray[i];
22             System.out.println(c.getName() + "," + c.getAge() + "," + c.getSex());
23         }
24         
25     }

7.Collection遍历集合_迭代器

Collection集合的遍历方式二:

 迭代器:

 Iterator iterator():

 java.util.Iterator(接口):
 成员方法:
 boolean hasNext() 如果仍有元素可以迭代,则返回 true。

 Object next() 返回迭代的下一个元素。

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合类;
 4         Collection list = new ArrayList();
 5         //2.填充集合
 6         list.add("张三");
 7         list.add("李四");
 8         list.add("王五");
 9         list.add("周六");
10         //3.使用迭代器遍历
11         Iterator it = list.iterator();
12         /*
13         Object obj = it.next();
14         System.out.println(obj);
15         obj = it.next();
16         System.out.println(obj);
17         obj = it.next();
18         System.out.println(obj);
19         
20         System.out.println(it.hasNext());
21         obj = it.next();
22         System.out.println(obj);
23         
24         System.out.println(it.hasNext());
25     */
26         while(it.hasNext()){
27             String str  = (String)it.next();
28             System.out.println(str);
29         }
30         
31     }
32 }

8.List接口存储字符串

Collection(接口)
  |--List(接口)
  |--ArrayList(类):
  |--Set(接口)
 
  此例:左边使用List类型接收。但仍然使用Collection中的方法。效果跟之前是一样的。

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合对象
 4         List list = new ArrayList();
 5         //2.填充集合
 6         list.add("张三");
 7         list.add("李四");
 8         list.add("王五");
 9         list.add("周六");
10         //3.遍历集合
11         //方式一:toArray()
12         Object[] objArray = list.toArray();
13         for(int i = 0;i < objArray.length ; i++){
14             String str = (String)objArray[i];
15             System.out.println(str);
16         }
17         System.out.println("*************************");
18         //方式二:使用迭代器
19         Iterator it = list.iterator();
20         while(it.hasNext()){
21             String s = (String)it.next();
22             System.out.println(s);
23         }
24         
25     }
26 }

9.List接口的特有方法

List接口中增加了一些特有功能,使其具有一些特性:
  1.有序的(取出时的顺序跟存入时的顺序是一样的);
  2.可以存储重复的元素;
  
  特有的成员方法:
    void add(int index,E element):在列表的指定位置插入指定元素(可选操作)。原index位置上的元素后移。
    E remove(int index):移除列表中指定位置的元素(可选操作)。
    E get(int index):获取index位置上的元素;
    E set(int index,E element):将index位置上的元素替换为element。
    ListIterator listIterator():特有的遍历迭代器
  
    interface Collection{
    boolean add(Object obj);
    }
    interface List extends Collection{
    void add(int index,Object element);
    }
    

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         List list = new ArrayList();
 5         //2.填充集合:使用Collection --> add(Object obj):
 6         list.add("刘德华");
 7         list.add("张惠妹");
 8         list.add("刘亦菲");
 9         //使用List-->add(int index,Object obj)添加
10         list.add(1,"周星驰");
11         
12         System.out.println("插入后:" + list);
13         
14         //3.E remove(int index)
15         //移除周星驰
16         list.remove(1);
17         System.out.println("移除周星驰后:" + list);
18         //4.E get(int index)
19         //获取索引为1的
20         Object obj = list.get(1);
21         System.out.println("获取索引为1的:" + obj);
22         
23         //5.E set(int index,E element)
24         //将索引为1的,替换为"周星驰"
25         list.set(1, "周星驰");
26         System.out.println("替换后:" + list);
27         
28     }
29 }

 

10.List(接口)的特有迭代器:

  ListIterator listIterator():一个可以向前遍历的迭代器;
  注意:当使用此迭代器向前遍历时,一定要先向后遍历。
 
 
  Iterator和ListIterator的区别:
    1.Iterator是父接口:
      Iterator是单向的,只能向下遍历;
 
    2.ListIterator是Iterator的子接口;
      ListIterator是双向的,可以向前遍历;

 

class ArrayList implements List{必须重写Collection接口的方法,必须重写List中的方法}
   
  

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         List list = new ArrayList();
 5         //2.填充集合
 6         list.add("张三");
 7         list.add("李四");
 8         list.add("王五");
 9         
10         //3.使用ListIterator迭代
11         ListIterator listIt = list.listIterator();
12         while(listIt.hasNext()){
13             String str = (String)listIt.next();
14             System.out.println(str);
15         }
16         
17         System.out.println("*************向前遍历************");
18         //向前遍历
19         while(listIt.hasPrevious()){
20             String str = (String)listIt.previous();
21             System.out.println(str);
22         }
23     }
24 }

11.使用ListIterator时的并发修改异常

当我们通过"迭代器"遍历时,通过list的引用去修改集合内容时,会产生一个异常:ConcurrentModificationException。
 
 所以:
  当通过迭代器遍历时,如果想修改,就通过迭代器修改;
  当使用list遍历时,如果想修改,可以通过list修改;

public class Demo {
    public static void main(String[] args) {
        //1.实例化一个集合
        List list = new ArrayList();
        //2.填充集合
        list.add("刘德华");
        list.add("张学友");
        list.add("郭富城");
        
        //3.遍历集合
        ListIterator listIt = list.listIterator();
        while(listIt.hasNext()){
            String str = (String)listIt.next();
            System.out.println(str);
            if(str.equals("张学友")){
                //通过ListIterator向集合中添加一个元素
                listIt.add("周星池");//OK的
            //    list.add("周星驰");//运行时异常:ConcurrentModificationException
            }
            
        }
        
        
    }
}

12.List的三个子类的特点

  1.ArrayList:数组实现;线程不安全的,效率高;
  2.Vector:数组实现;线程安全的,效率低;
  3.LinkedList:链表实现;线程不安全的,效率高

13.ArrayList存储字符串


 Collection(接口)
 |--List(接口): 有序的;可以存储重复值;
 |--ArrayList(类):实现了所有List中的方法和Collection中的方法;

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         ArrayList list = new ArrayList();
 5         //2.填充集合
 6         list.add("aaa");//Collection中的方法
 7         list.add(0, "bbb");//List中的方法;
 8         
 9         //3.获取迭代器
10         Iterator it = list.iterator();//Collection中的方法
11         ListIterator listIt = list.listIterator();//List中的方法;
12         
13         while(it.hasNext()){
14             System.out.println(it.next());
15         }
16     }
17 }

14.List特有的遍历方式

之前遍历集合的方式:
   1.Collection --> toArray():
  2.Collection --> iterator():
  
   List接口,可以结合两个方法,进行遍历:
   3.Collection --> size();
   List --> get(int index):
   使用for循环:
  for(int i = 0;i < list.size();i++){
   System.out.println(list.get(i));
 }

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         List list = new ArrayList();
 5         //2.填充集合
 6         list.add("藏獒");
 7         list.add("金毛");
 8         list.add("吉娃娃");
 9         list.add("黑贝");
10         //3.遍历
11         for(int i = 0;i < list.size() ; i++){
12             System.out.println(list.get(i));
13         }
14     }
15 }

15.Vector特有功能

Collection(接口)
  |--List(接口):
  |--ArrayList(类):
  |--Vector(类):
  特有方法:
   public void addElement(E obj):添加一个元素;
   public E elementAt(int index):返回指定索引处的引用;
  
   

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         Vector vec = new Vector();
 5         //2.填充集合
 6         vec.add("波斯猫");
 7         vec.add("折耳猫");
 8         vec.add("加菲猫");
 9         vec.add("暹罗猫");
10         
11         //3.遍历集合
12         for(int i = 0;i < vec.size() ; i++){
13             //使用List的get方法;
14         //    String str = (String)vec.get(i);
15             //使用Vector特有的方法
16             String str = (String)vec.elementAt(i);
17             System.out.println(str);
18         }
19     }
20 }

 

16.LinkedList特有功能

Collection:
   |--List:
   |--ArrayList:
   |--Vector:
   |--LinkedList:
  
  LinkedList类的特有功能:
 
   public void addFirst(E e):将元素e添加到第一个位置上。原位置上的元素依次后移;可以模拟"栈"结构;
   addLast(E e):将元素e添加到末尾。
   public E getFirst()及getLast():获取第一个元素和最后一个元素;
   public E removeFirst()及public E removeLast():删除第一个元素和最后一个元素;

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         LinkedList list = new LinkedList();
 5         //2.填充元素:
 6         list.addFirst("aaa");
 7         list.addFirst("bbb");
 8         list.addFirst("ccc");
 9         //3.遍历元素:
10         for(int i = 0;i < list.size() ; i++){
11             System.out.println(list.get(i));
12         }
13         //4.获取第一个元素
14         System.out.println("第一个元素:" + list.getFirst());
15         System.out.println("最后一个元素:" + list.getLast());
16         //5.删除元素
17         System.out.println("删除第一个元素:"  + list.removeFirst());
18         System.out.println("删除后的集合:" + list);
19         System.out.println("删除最后一个元素:" + list.removeLast());
20         System.out.println("删除后的集合:" + list);
21         
22     }
23 }

17.去除ArrayList中重复字符串元素

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //1.实例化一个集合
 4         ArrayList list = new ArrayList();
 5         //2.填充集合
 6         list.add("aaa");
 7         list.add("bbb");
 8         list.add("ccc");
 9         
10         list.add("aaa");
11         list.add("aaa");
12         
13         //3.打印集合
14         System.out.println("list = " + list);
15         
16         //*****去除集合中的重复元素******
17         //方式一:使用新集合
18         ArrayList list2 = new ArrayList();
19         //1.遍历原集合
20         for(int i = 0;i < list.size() ;i++){
21             String str = (String)list.get(i);
22             if(!list2.contains(str)){//如果在list2中不存在
23                 list2.add(str);
24             }
25         }
26         //2.遍历新集合
27         System.out.println("新集合:" + list2);
28         //方式二:直接操作原集合
29         System.out.println("原集合:" + list);
30         //1.遍历原集合
31         for(int i = 0;i < list.size() ;i++){
32             String str = (String)list.get(i);
33             //将每个元素,与它后面的其它元素进行比较,如果有相同的。删除后面相同的元素
34             for(int j = i + 1 ; j < list.size() ; j++){
35                 String str2 = (String)list.get(j);
36                 if(str.equals(str2)){
37                     //删除后面的元素
38                     list.remove(j);
39                     //删除元素后,集合的大小会发生变化。要保存j的一直性;
40                     j--;
41                 }
42             }
43         }
44         //2.打印集合
45         System.out.println("去重后,集合内容:"  + list);
46         
47     }
48 }

 

posted on 2015-08-06 21:31  林木森  阅读(245)  评论(0编辑  收藏  举报

导航