你的位置:首页 > Java教程

[Java教程]黑马程序员系列第四篇 集合(1)


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

 

(前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1o6mwDzO

 

目录:1、集合概述      2、Collection、Iterator接口     3、List接口与其ArrayList、LinkedList、Vector子类

 

1、集合概述 

 

下图为JDK中集合的框架设计图,我们主要使用的集合为黑色方框中的四种集合。

数组和集合的不同:集合中对象数量不定,而数组中对象数量必须是确定的。

ArrayList  底层数据存储结构是数组结构   特点:查询速度快,增删稍慢,线程不同步

LinkedList 底层数据结构是链表结构        特点:查询稍慢,增删快

Vector      底层是数组数据结构             特点:都很慢,线程同步,出现最早,已经被ArrayList替代了现在很少用

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

HashSet   底层数据结构是hash表

 

2、Collection、Iterator接口 

迭代器 Iterator  是为了方便集合操作元素而定义。而且专门为List集合定义了特有的迭代器ListIterator(为Iterator接口的子接口)

注意:使用迭代器时,不可以再通过集合对象的方法操作集合中的对象,会发生ConcurrentModification异常。

两个基本接口中的方法很重要

代码演示了Collection方法的使用以及遍历的操作方式(例子很普通,主要看下遍历的操作方法)

 1 public class CollectionTest { 2   public static void main(String[] args) { 3     List d=new ArrayList();//新建集合、向集合中添加对象 4     d.add("jake");  5     d.add("alean"); 6     d.add("sam");       7     iteratorTest(d); 8   } 9   //如何使用ListIterator进行遍历操作对象10   public static void iteratorTest(List c){11      ListIterator it=c.listIterator();12      while(it.hasNext()){13        //ListIterator中添加14        if(it.next()!=null){ 15          it.add("nanjing");16         }17 //        ListIterator中修改18 //        if(it.next()=="jake"){19 //          it.set("beokj");20 //        }       21       }22       System.out.println(c);23   }24   //collection接口方法使用25   public static void collectionMethods(){26     Collection c=new ArrayList();27     Collection d=new ArrayList();28     //增加29     d.add("jake"); d.add("alean");d.add("sam");30     c.addAll(d);31     //删除32     //c.remove("jake");33     //c.removeAll(c);34     //c.clear();35     System.out.println(c.isEmpty());36     System.out.println(c+":size="+c.size());37   }38 }

 

3、List接口与其ArrayList、LinkedList、Vector子类

      ArrayList中涉及到比较集合中对象是否相同中用到的底层方法是集合中对象的equals()方法

      LinkedList中的方法  JDK1.6以后出现了替代getFirst()\getLast()\removeFirst()\removeLast()方法的

      offerFirst\offerLast\peekFirst()\peekLast()新方法,新方法的优势是集合中没有元素了不会出现NoSuchElementException异常

      Vector  有特有的枚举方式取数据。其实枚举和迭代是一样的,枚举的名称和方法名称过长,所以被迭代器取代了,仅做了解

   ArrayList 演示代码(除去集合中的重复对象)

 1 public class ArrayListDemo { 2  3   public static void main(String[] args) { 4     //新建一个ArrayList类型集合,向其中添加Person对象 5     ArrayList al=new ArrayList(); 6     al.add(new Person("jack",12)); 7     al.add(new Person("jack",12)); 8     al.add(new Person("jack",11)); 9     al.add(new Person("jack2",12));10     al.add(new Person("jack",12));
//除去al集合中的相同对象,打印结果11 System.out.println(singleElement(al));12 }13 //删除ArrayList集合中重复的元素14 public static ArrayList singleElement(ArrayList arrays){15 ArrayList al=new ArrayList(); 16 Iterator ite=arrays.iterator();17 //通过while循环,在其中用ArrayList的contains方法判断是否重复18 while(ite.hasNext()){19 Object obj=ite.next();20 if(!al.contains(obj))21 al.add(obj);22 }23 return al;24 }25 26 }27 //Person类28 class Person{29 private String name;30 private int age;31 //共有全参构造方法32 public Person(String name, int age) {33 super();34 this.name = name;35 this.age = age;36 }37 public String getName() {38 return name;39 }40 public void setName(String name) {41 this.name = name;42 }43 public int getAge() {44 return age;45 }46 public void setAge(int age) {47 this.age = age;48 }49 //重写equals方法,自定义比较的依据,这里我们定义对象的姓名、年龄都相同时,对象才相等50 public boolean equals(Object obj) {51 Person per=(Person)obj; 52 if(!(obj instanceof Person)) 53 return false;54 else 55 return per.name.equals(name) && per.age==age;56 }57 //重写toString方法,便于查看程序的运行结果58 public String toString() {59 return name+"::"+age;60 }61 62 }

 

LinkedList示例代码(用LinkedList模拟堆栈(先进后出)和队列(先进先出)数据结构)

 1 public class LinkedListDemo { 2   public static void main(String[] args) { 3      4     Queue queue=new Queue(); 5     queue.set("红"); 6     queue.set("黄"); 7     queue.set("蓝"); 8     queue.set("紫"); 9     10     while(!queue.isNull()){11       System.out.println(queue.get());12     }13   }14 }15 //模拟队列,先进先出16 class Queue{17   private LinkedList ll;18   public Queue(){19     ll=new LinkedList();20    }21   public Object get(){22     return ll.removeFirst();23   }24   public void set(Object obj){25     ll.addLast(obj);26   }27   public boolean isNull(){28     return ll.isEmpty();29   }30 }31 //模拟堆栈-先进后出32 class Stack{33   private LinkedList ll;34   public Stack(){35     ll=new LinkedList();36    }37   public Object get(){38     return ll.removeLast();39   }40   public void set(Object obj){41     ll.addLast(obj);42   }43   public boolean isNull(){44     return ll.isEmpty();45   }46 }

 

 

 

 

 

       初学者难免错误,欢迎评判指教,持续更正ing...........

 

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