黑马程序员——JAVA集合

----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------

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. }
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值