A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始






6、集合

6.2 集合类

    6.2.3 Vector、ArrayList、LinkedList

    List:
  
        |--Vector:内部是数组数据结构,是同步的。增删,查询都很慢。

          |--ArrayList:内部是数组数据结构,是不同步的,替代了Vector。替代了Vector,查询的速度快。
          |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

    LinkedList方法:
    addFirst();
    addLast();


    jdk1.6版本后新方法:
    offerFirst();与addFirst方法没有区别。
    offerLast();与addLast方法没有区别。
    ---------------------------------------------------------
    getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementException。
    getLast();

    jdk1.6版本后新方法:
    peekFirst();//获取但不移除,如果链表为空,返回null。
    peekLast();
    --------------------------------------------------------
    removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementException。
    removeLast();

    jdk1.6版本后新方法:
    pollFirst();//获取并移除,如果链表为空,返回null;
    pollLast();


    示例1:
  1. import java.util.Enumeration;
  2. import java.util.Iterator;
  3. import java.util.Vector;

  4. public class VectorDemo{
  5.        public static void main(String[] args){
  6.             Vector v = new Vector();

  7.             v.addElement( "abc1");
  8.             v.addElement( "abc2");
  9.             v.addElement( "abc3");
  10.             v.addElement( "abc4");

  11.             Enumeration en = v.elements();

  12.              while(en.hasMoreElements()){
  13.                   System.out.println( "nextElement:" + en.nextElement());
  14.             }

  15.             Iterator it = v.iterator();

  16.              while(it.hasNext()){
  17.                   System.out.println( "next:" + it.next());
  18.             }
  19.       }     
  20. }
复制代码
   运行结果:


    示例2:
  1. import java.util.Iterator;
  2. import java.util.LinkedList;

  3. public class LinkedListDemo{
  4.        public static void main(String[] args){
  5.             LinkedList link = new LinkedList();

  6.             link.addFirst( "abc1");
  7.             link.addFirst( "abc2");
  8.             link.addFirst( "abc3");
  9.             link.addFirst( "abc4");

  10.             Iterator it = link.iterator();
  11.              while(it.hasNext()){
  12.                   System.out.println( "next:" + it.next());
  13.             }

  14.             System.out.println(link);
  15.             System.out.println("getFirst:" + link.getFirst()); //获取第一个,但是不删除。
  16.             System.out.println("getLast:" + link.getLast());

  17.             System.out.println("removeFirst:" + link.removeFirst()); //获取第一个,但是删除
  18.             System.out.println("removeLast:" + link.removeLast());

  19.              //删除所有元素的方法
  20.              while(!link.isEmpty()){
  21.                         System.out.println(link.removeFirst());
  22.             }
  23.       }
  24. }
复制代码
    运行结果:


    请使用LinkedList来模拟一个堆栈或者队列数据结构。

    堆栈:先进后出 First In Last Out FILO
    队列:先进先出 First In First Out FIFO

    我们应该描述这样一个容器,给使用者提供一个容器对象完成这两种结构中的一种。


    代码:
  1. import java.util.LinkedList;

  2. class DuiLie{
  3.        private LinkedList link;

  4.        public DuiLie(){
  5.             link = new LinkedList();
  6.       }

  7.        //队列的添加元素的功能。
  8.        public void myAdd(Object obj){
  9.             link.addLast(obj);
  10.       }

  11.        public Object myGet(){
  12.              return link.removeFirst();
  13.       }

  14.        public boolean isNull(){
  15.              return link.isEmpty();
  16.       }
  17. }

  18. public class DuiLieTest{
  19.        public static void main(String[] args){
  20.             DuiLie dl = new DuiLie();

  21.             dl.myAdd( "abc1");
  22.             dl.myAdd( "abc2");
  23.             dl.myAdd( "abc3");
  24.             dl.myAdd( "abc4");

  25.              while(!dl.isNull()){
  26.                   System.out.println(dl.myGet());
  27.             }
  28.       }
  29. }
复制代码
    运行结果:


    示例3:
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. class Person{
  4.        private String name;
  5.        private int age;

  6.        public Person(){
  7.       }

  8.        public Person(String name,int age){
  9.              this.name = name;
  10.              this.age = age;
  11.       }

  12.        public void setName(String name){
  13.              this.name = name;
  14.       }

  15.        public String getName(){
  16.              return this .name;
  17.       }

  18.        public void setAge(int age){
  19.              this.age = age;
  20.       }

  21.        public int getAge(){
  22.              return this .age;
  23.       }
  24. }

  25. public class ArrayListTest{
  26.        public static void main(String[] args){
  27.             ArrayList al = new ArrayList();
  28.             al.add( new Person("lisi1" ,21));
  29.             al.add( new Person("lisi2" ,22));
  30.             al.add( new Person("lisi3" ,23));
  31.             al.add( new Person("lisi4" ,24));

  32.             Iterator it = al.iterator();
  33.              while(it.hasNext()){
  34.                   Person p = (Person)(it.next());
  35.                   System.out.println(p.getName() + ":" + p.getAge());
  36.             }
  37.       }
  38. }
复制代码
   运行结果:


   
Set:元素不可以重复,是无序。
    Set接口中的方法和Collection一致。
    |--HashSet:内部数据结构是哈希表,是不同步的。
    |--TreeSet:可以对Set集合中的元素进行排序,是不同步的。

    示例4:
  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. import java.util.Set;

  4. public class HashSetDemo{
  5.        public static void main(String[] args){
  6.             
  7.             Set hs = new HashSet();
  8.             
  9.             hs.add( "hahah");
  10.             hs.add( "heihei");
  11.             hs.add( "hehe");
  12.             hs.add( "xixi");

  13.             Iterator it = hs.iterator();

  14.              while(it.hasNext()){
  15.                   System.out.println(it.next());
  16.             }
  17.       }
  18. }
复制代码
   运行结果:


    哈希表确定元素是否相同
    1. 判断的是两个元素的哈希值是否相同。
        如果相同,再判断两个对象的内容是否相同。
    2. 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。
   

    P.S.
    如果哈希值不同,不需要判断equals。

    往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素。

    示例5:
  1. import java.util.HashSet;
  2. import java.util.Iterator;

  3. class Person{
  4.        private String name;
  5.        private int age;

  6.        public Person(){
  7.       }

  8.        public Person(String name,int age){
  9.              this.name = name;
  10.              this.age = age;
  11.       }

  12.        public void setName(String name){
  13.              this.name = name;
  14.       }

  15.        public String getName(){
  16.              return this .name;
  17.       }

  18.        public void setAge(int age){
  19.              this.age = age;
  20.       }

  21.        public int getAge(){
  22.              return this .age;
  23.       }

  24.        public int hashCode(){
  25.              return name.hashCode() + age * 39;
  26.       }

  27.        public boolean equals(Object obj){
  28.              if(this == obj)
  29.                    return true ;//同一个对象放两次,直接返回true
  30.             
  31.              if(!(obj instanceof Person))
  32.                    throw new ClassCastException("类型错误");

  33.             Person p = (Person)obj;

  34.              return this .name.equals(p.name) && this.age == p.age;
  35.       }
  36. }

  37. public class HashSetTest{
  38.        public static void main(String[] args){
  39.             HashSet hs = new HashSet();

  40.             hs.add( new Person("lisi4" ,24));
  41.             hs.add( new Person("lisi7" ,27));
  42.             hs.add( new Person("lisi1" ,21));
  43.             hs.add( new Person("lisi9" ,29));
  44.             hs.add( new Person("lisi7" ,27));

  45.             Iterator it = hs.iterator();
  46.       
  47.              while(it.hasNext()){
  48.                   Person p = (Person)it.next();
  49.                   System.out.println(p.getName() + "..." + p.getAge());
  50.             }
  51.       }
  52. }
复制代码
   运行结果:

    定义功能去除ArrayList中的重复元素。  

    示例6:
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class ArrayListTest{
  4.        public static void main(String[] args){
  5.             ArrayList al = new ArrayList();
  6.             al.add( new Person("lisi1" ,21));
  7.             al.add( new Person("lisi2" ,22));
  8.             al.add( new Person("lisi3" ,23));
  9.             al.add( new Person("lisi4" ,24));
  10.             al.add( new Person("lisi3" ,23));
  11.             al.add( new Person("lisi4" ,24));

  12.             System.out.println(al);

  13.             al = getSingleElement(al);

  14.              //remove底层用的还是equals方法
  15.             System.out.println(al.remove( new Person("lisi2" ,22)));
  16.             System.out.println(al);
  17.       }

  18.        public static ArrayList getSingleElement(ArrayList al){
  19.              //1、定义一个临时容器
  20.             ArrayList temp = new ArrayList();

  21.              //2、迭代al集合
  22.             Iterator it = al.iterator();

  23.              while(it.hasNext()){
  24.                   Object obj = it.next();

  25.                    //3、判断被迭代到的元素是否在临时容器存在
  26.                    //contains方法依靠的是equals方法                  
  27.                    if(!temp.contains(obj)){
  28.                         temp.add(obj);
  29.                   }
  30.             }
  31.              return temp;
  32.       }
  33. }
复制代码
    运行结果:

    无序变有序,使用LinkHashSet。  

    示例7:
  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. import java.util.LinkedHashSet;

  4. public class LinkedHashSetDemo{
  5.        public static void main(String[] args){
  6.             HashSet hs = new LinkedHashSet();

  7.             hs.add( "hahaa");
  8.             hs.add( "hehe");
  9.             hs.add( "heihei");
  10.             hs.add( "xixii");

  11.             Iterator it = hs.iterator();

  12.              while(it.hasNext()){
  13.                   System.out.println(it.next());
  14.             }
  15.       }
  16. }
复制代码
    运行结果:


    TreeSet判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

    示例8:
  1. import java.util.Iterator;
  2. import java.util.TreeSet;

  3. class Person implements Comparable{
  4.        private String name;
  5.        private int age;

  6.        public Person(){
  7.       }

  8.        public Person(String name,int age){
  9.              this.name = name;
  10.              this.age = age;
  11.       }

  12.        public void setName(String name){
  13.              this.name = name;
  14.       }

  15.        public String getName(){
  16.              return this .name;
  17.       }

  18.        public void setAge(int age){
  19.              this.age = age;
  20.       }

  21.        public int getAge(){
  22.              return this .age;
  23.       }

  24.        public int hashCode(){
  25.              return name.hashCode() + age * 39;
  26.       }

  27.        public boolean equals(Object obj){
  28.              if(this == obj)
  29.                    return true ;
  30.                   
  31.              if(!(obj instanceof Person))
  32.                    throw new ClassCastException("类型错误");

  33.             Person p = (Person)obj;

  34.              return this .name.equals(p.name) && this.age == p.age;
  35.       }

  36.        public int compareTo(Object o){
  37.             Person p = (Person)o;
  38.             
  39.              //先按照年龄排序,再按照年龄排序,以免年龄相同的人,没有存进去。
  40.              int temp = this.age - p.age;
  41.              return temp == 0?this.name.compareTo(p.name):temp;
  42.       }
  43. }

  44. public class TreeSetDemo{
  45.        public static void main(String[] args){
  46.             TreeSet ts = new TreeSet();

  47.              //以Person对象年龄进行从小到大的排序
  48.             ts.add( new Person("zhangsan" ,28));
  49.             ts.add( new Person("wangwu" ,23));
  50.             ts.add( new Person("lisi" ,21));
  51.             ts.add( new Person("zhouqi" ,29));
  52.             ts.add( new Person("zhaoliu" ,25));

  53.             Iterator it = ts.iterator();

  54.              while(it.hasNext()){
  55.                   Person p = (Person)it.next();

  56.                   System.out.println(p.getName() + ":" + p.getAge());
  57.             }
  58.       }
  59. }
复制代码
   运行结果:

   
TreeSet对元素进行排序的方式一:    让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法。

    如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
    可以使用TreeSet集合第二种排序方式:
    让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
    将该类对象作为参数传递给TreeSet集合的构造函数。

    示例9:

  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. //创建了一个根据Person类的name进行排序的比较器。
  5. class ComparatorByName implements Comparator{
  6.        public int compare(Object o1,Object o2){
  7.             Person p1 = (Person)o1;
  8.             Person p2 = (Person)o2;
  9.       
  10.              int temp = p1.getName().compareTo(p2.getName());
  11.              return temp == 0?p1.getAge()-p2.getAge() : temp;
  12.       }
  13. }

  14. public class TreeSetDemo{
  15.        public static void main(String[] args){
  16.             TreeSet ts = new TreeSet(new ComparatorByName());

  17.              //以Person对象年龄进行从小到大的排序
  18.             ts.add( new Person("zhangsan" ,28));
  19.             ts.add( new Person("wangwu" ,23));
  20.             ts.add( new Person("lisi" ,21));
  21.             ts.add( new Person("zhouqi" ,29));
  22.             ts.add( new Person("zhaoliu" ,25));

  23.             Iterator it = ts.iterator();

  24.              while(it.hasNext()){
  25.                   Person p = (Person)it.next();

  26.                   System.out.println(p.getName() + ":" + p.getAge());
  27.             }
  28.       }
  29. }
复制代码
    运行结果:

    P.S.
    如果自定义类实现了Comparable接口,并且TreeSet的构造函数中也传入了比较器,那么将以比较器的比较规则为准。
    TreeSet集合的底层是二叉树进行排序的。

    练习:对字符串进行长度排序。

    代码:
  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. public class TreeSetTest{
  5.        public static void main(String[] args){
  6.             TreeSet ts = new TreeSet(new ComparatorByLen());

  7.             ts.add( "aaaa");
  8.             ts.add( "zz");
  9.             ts.add( "nbag");
  10.             ts.add( "cba");
  11.             ts.add( "abc");

  12.             Iterator it = ts.iterator();

  13.              while(it.hasNext()){
  14.                   System.out.println(it.next());
  15.             }
  16.       }
  17. }

  18. class ComparatorByLen implements Comparator{
  19.        public int compare(Object o1,Object o2){
  20.             String s1 = (String)o1;
  21.             String s2 = (String)o2;

  22.              int temp = s1.length() - s2.length();

  23.              return temp == 0?s1.compareTo(s2):temp;
  24.       }
  25. }
复制代码
   运行结果:


~END~



~爱上海,爱黑马~



评分

参与人数 1黑马币 +10 收起 理由
yqlbd + 10 老师,示例6的代码有错误,尤其是remove(.

查看全部评分

25 个回复

倒序浏览
:):):):):):):):)
回复 使用道具 举报
每天复制笔记都是一场艰苦的旅程!

点评

后期会出pdf  发表于 2015-6-7 22:51
回复 使用道具 举报
学习是需要耐心的是。
回复 使用道具 举报
学习是需要耐心的是
回复 使用道具 举报
为了理想而奋斗 来自手机 中级黑马 2015-6-24 22:31:34
地板
学习是需要耐心的事
回复 使用道具 举报
赞一个~~~~
回复 使用道具 举报
很哈啊   
回复 使用道具 举报
很66666啊
回复 使用道具 举报
zan zan zan zan zan zan !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报
每天复制笔记都是一场艰苦的旅程!hao liu bi!给力!!!
回复 使用道具 举报
又学习了,加油~
回复 使用道具 举报
不错不错,谢谢分享
回复 使用道具 举报
twa42 中级黑马 2015-7-13 16:56:12
14#
谢谢老师
回复 使用道具 举报
不错   顶!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报
给力啊,这笔记做的细致!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报

不错   值得收藏
回复 使用道具 举报
集合真的有点难,要 加强记忆,希望可以记住。
回复 使用道具 举报
支持 黑马 加油
回复 使用道具 举报
刚刚学完了集合 支持
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马