黑马程序员——16,集合

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

          

                    黑马程序员——16,集合

/*

   集合类:用来装对象的容器,任何对象都可以装进去,没有固定长度,功能和数组类似

   集合框架:装东西的容器不断向上抽取共有部分然后形成的体系

   最上面的是Collection接口

   为什么会有这么多容器?因为每种容器对数据的存储方式不同(数据结构)

*/

import java.util.*;
//Collection接口的体系放在Java.util包里面
class   Jihe
{
   public static  void  main(String[]args)
   {
       ArrayList  a=new ArrayList();
       //ArrayList是Collection接口的子类
       a.add("jdk01");
       a.add("jdk02");
       a.add("jdk03");
       a.add("jdk04");
       a.add("jdk05");
                   /*
       这里的添加本质上在内存上都是把对象的地址值放在了容器里面,
       这样容器就可以访问对象了,
       而不是真的把对象整个放进容器,
       仅仅是说法上是放进容器里面而已。
       如果就这样编译的话会有注意提示,这个不是编译错误,暂时不需要理会
        */
       soc("a原本的长度="+a.size());//size获取长度
       soc(a);//直接打印集合是可以的
 
       a.remove("jdk02");
       soc("remove掉jdk02后的a="+a);
       soc("remove掉的a的长度="+a.size());
 
       //a.clean();//清空容器内部
       soc("a.isEmpty()="+a.isEmpty());
       soc("a.contains(\"jdk03\")="+a.contains("jdk03"));
 
  }
     public   static  void  soc(Object   obj)
     {
      System.out.println(obj);  
     }
}
/*
上面代码编译运行结果:
a原本的长度=5
[jdk01, jdk02, jdk03, jdk04, jdk05]
remove掉jdk02后的a=[jdk01, jdk03,jdk04, jdk05]
remove掉的a的长度=4
a.isEmpty()=false
a.contains("jdk03")=true
*/

——————分割线——————

 

import java.util.*;
//Collection接口的体系放在Java.util包里面
class   Jihe2
{
         public  static  void  main(String[]args)
         {
                   ArrayList  a=new ArrayList();
                   //ArrayList是Collection接口的子类
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
        
                   ArrayList  a2=new ArrayList();
                   a2.add("jdk01");
                   a2.add("jdk02");
                   a2.add("yu03");
                   a2.add("yu04");
                   a2.add("yu05");
       
                   soc("a="+a);
                   soc("a2="+a2);
 
                   //a.retainAll(a2);//把a与a2的交集元素返回到a中
                   // soc("a.retainAll(a2)="+a);
 
       a.removeAll(a2);//把a当中a与a2交集元素去掉,然后再返回
       soc("a.removeAll(a2)="+a);
 
 
         }
         public   static  void  soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
a=[jdk01, jdk02, jdk03, jdk04, jdk05]
a2=[jdk01, jdk02, yu03, yu04, yu05]
a.removeAll(a2)=[jdk03, jdk04, jdk05]
 
*/

————————分割线——————

 

/*

由于不同的容器有不同的取出元素方式,所以就有迭代器

迭代器:取出元素的方式

*/

 

import java.util.*;
//Collection接口的体系放在Java.util包里面
class   Jihe3
{
         public   static  void   main(String[] args)
         {
                   ArrayList  a=new ArrayList();
                   //ArrayList是Collection接口的子类
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
 
       Iterator   it=a.iterator();//建立迭代器(取出方式的对象)
                   while(it.hasNext())//判断是否还有下一个元素
                   {
                       soc(it.next());
                   }
                   soc(a);
 
 
         }
         public   static  void  soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
jdk01
jdk02
jdk03
jdk04
jdk05
[jdk01, jdk02, jdk03, jdk04, jdk05]
*/

————————分割线——————

/*

  Collection下面有两个常用的子接口

  List和Set

  List中的元素有序排列,元素可以重复,该集合体系有索引

  Set中的元素无序排列,元素不可以重复,该集合体系没有索引

 

  List:凡是可以操作角标的方法都是该体系的特有方法

     增---add(index,element);

               addAll(index,Collection);

     减---remove(index);

          改---set(index,element);

          查---get(index);

               subList(from,to);

                     listIterator();

 

      

*/

 

import java.util.*;
//Collection接口的体系放在Java.util包里面
Class   Jihe4
{
         Public  static   void   main(String[] args)
         {
                   ArrayList  a=new ArrayList();
                   //ArrayList是List接口的子类
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
                   ArrayList  b=new ArrayList();
                   b.add("yu01");
                   b.add("yu02");
                   b.add("yu03");
                   b.add("yu04");
                   b.add("yu05");
 
                   soc("a---"+a);
                   soc("b---"+b);
 
                   a.add(2,"jdk06");
                   soc("a.add(2,\"jdk06\")---"+a);
                   a.addAll(3,b);
                   soc("a.addAll(3,b)---"+a);
                   a.remove(0);
                   soc("a.remove(0)---"+a);
                   a.set(4,"ooooo");
                   soc("a.set(4,\"ooooo\")---"+a);
                   a.get(6);
                   soc("a.get(6)---"+a);
                   a.subList(0,4);
                   soc("a.subList(0,4)---"+a);
                   soc("改变之后的a---"+a);
                   Iterator   it=  a.listIterator();
                   while(it.hasNext())
                   {
                       soc(it.next()); 
                   }
 
 
         }
         public   static  void  soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
b---[yu01, yu02, yu03, yu04, yu05]
a.add(2,"jdk06")---[jdk01, jdk02,jdk06, jdk03, jdk04, jdk05]
a.addAll(3,b)---[jdk01, jdk02, jdk06, yu01,yu02, yu03, yu04, yu05, jdk03, jdk04, jdk05]
a.remove(0)---[jdk02, jdk06, yu01, yu02,yu03, yu04, yu05, jdk03, jdk04, jdk05]
a.set(4,"ooooo")---[jdk02, jdk06,yu01, yu02, ooooo, yu04, yu05, jdk03, jdk04, jdk05]
a.get(6)---[jdk02, jdk06, yu01, yu02,ooooo, yu04, yu05, jdk03, jdk04, jdk05]
a.subList(0,4)---[jdk02, jdk06, yu01, yu02,ooooo, yu04, yu05, jdk03, jdk04, jdk05]
改变之后的a---[jdk02, jdk06,yu01, yu02, ooooo, yu04, yu05, jdk03, jdk04, jdk05]
jdk02
jdk06
yu01
yu02
ooooo
yu04
yu05
jdk03
jdk04
jdk05
 
*/

————————分割线——————

/*

ArrayList的一些方法应用

*/

import java.util.*;
//Collection接口的体系放在Java.util包里面
class   Jihe5
{
    public  static  void   main(String[] args)
   {
      method();
      soc("---分割线---");
      method2();
   }
  public   static  void   method()
   {
     ArrayList  a=new ArrayList();
     //ArrayList是List接口的子类
     a.add("jdk01");
     a.add("jdk02");
     a.add("jdk03");
     a.add("jdk04");
     a.add("jdk05");
      ArrayList  b=new ArrayList();
      b.add("yu01");
      b.add("yu02");
      b.add("yu03");
      b.add("yu04");
      b.add("yu05");
 
      soc("a---"+a);
      soc("b---"+b);
 
       soc(a.indexOf("jdk03"));
       //indexOf返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1
       Iterator   it= a.listIterator();
       while(it.hasNext())
       {
          Object   obj=it.next();
          if(obj.equals("jdk04"))
            {
                 //a.add("java");//这里不能用                                
                            /*
                因为不能够同时用集合方法和迭代器对同一组元素操作,
                容易产生并发修改异常
                            */
                it.remove();//将a中的jdk04删除
              }
           soc("obj---"+obj); 
           //不管迭代器有没有进行删除操作,obj 的指向都没有改变,所以都会打印出来
           //本质上迭代器删除的是储存在容器中的对象地址而已                
       }
       soc("修改后的a---"+a);                                                
  }
  public   static  void  method2()
  {
       ArrayList  a=new ArrayList();
       //ArrayList是List接口的子类
       a.add("jdk01");
       a.add("jdk02");
       a.add("jdk03");
       a.add("jdk04");
       a.add("jdk05");
       ArrayList  b=new ArrayList();
       b.add("yu01");
       b.add("yu02");
       b.add("yu03");
       b.add("yu04");
       b.add("yu05");
 
       soc("a---"+a);
       soc("b---"+b);
 
       ListIterator  li=a.listIterator();
       soc("正向遍历前的li.hasPrevious()---"+li.hasPrevious());
       //hasPrevious用来判断有没有前面元素,有的话返回true否则返回false
       soc("正向遍历前的li.hasNext()---"+li.hasNext());
       while(li.hasNext())
       {
          Object   obj=li.next();
          if(obj.equals("jdk04"))
           {
             li.add("hhhhh");//这个是ListIterator特有方法,这是Iterator所没有的
                  //hhhhh是添加在jdk04的后面的
 
              //li.set("ttt");//在jdk04的位置上改成ttt
              //这个是ListIterator特有方法,这是Iterator所没有的
            }
                    
         soc("obj---"+obj);                  
      }
       soc("修改后的a---"+a);
 
       soc("正向遍历后的li.hasPrevious()---"+li.hasPrevious());
       soc("正向遍历后的li.hasNext()---"+li.hasNext());
        
   }
   public   static  void  soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
  以上代码编译运行结果:
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
b---[yu01, yu02, yu03, yu04, yu05]
2
obj---jdk01
obj---jdk02
obj---jdk03
obj---jdk04
obj---jdk05
修改后的a---[jdk01, jdk02,jdk03, jdk05]
---分割线---
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
b---[yu01, yu02, yu03, yu04, yu05]
正向遍历前的li.hasPrevious()---false
正向遍历前的li.hasNext()---true
obj---jdk01
obj---jdk02
obj---jdk03
obj---jdk04
obj---jdk05
修改后的a---[jdk01, jdk02,jdk03, jdk04, hhhhh, jdk05]
正向遍历后的li.hasPrevious()---true
正向遍历后的li.hasNext()---false
 
*/

————分割线————

 

/*

    在List有几个常用的子类

              ArrayList---动态数组:底层数据结构是数组结构,查询快,增减慢,线程不同步

                    LinkedList---底层数据结构是链表结构,(像链子一样,后一个勾着前一个元素)增删快,查询慢

                    Vector---底层数据结构数组,功能与ArrayList一样,但是线程同步

                    ArrayList默认长度10,只要元素超出了长度就延长百分之50,直到能够足够装下所有元素

                    Vector默认长度10,只要元素超出长度就延长百分之100,直到能够装下所有元素

*/

import java.util.*;
//Collection接口的体系放在Java.util包里面
 
Class   Jihe6
{
         public static  void  main(String[] args)
         {
          method();
 
         }
         public   static  void   method()
         {
              Vector  a=new Vector();
                   //Vector是List接口的子类
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
                   soc("a---"+a);
 
                   Enumeration   it= a.elements();//建立一个枚举
                   //Vector中的枚举也是一种取出方式
                   /*
                   Vector中的枚举功能和迭代器一样只不过名字过长,慢慢被替代了
                   */
                   while(it.hasMoreElements())
                   {
                          soc(it.nextElement());
                   }
                                              
         }
         public   static  void  soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
jdk01
jdk02
jdk03
jdk04
jdk05
 
*/

————分割线————

 

/*
   以下是关于LinkedList的一些知识点
*/
import java.util.*;
//Collection接口的体系放在Java.util包里面
 
 
class Jihe7
{
         publicstatic void main(String[] args)
         {
                   method();
                   method2();
                   method3();
                   method4();
                   method5();
                   method6();
         }
        public   static   LinkedList   dx()
         {
            
             LinkedList a=new  LinkedList();
           //LinkedList 是List接口的子类,线程不同步
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
                   soc("原本的a---"+a);
                   return   a;
         }
         public    static  void   method()
         {
                   soc("以下是:method-------------");
                   LinkedList  a=dx();
                   a.addFirst("kkk");//把kkk添加到头部
                   soc("a.addFirst(\"kkk\")---"+a);
                   a.addFirst("uio");
                   soc("a.addFirst(\"uio\")---"+a);
                   a.addLast("last");
                   soc("a.addLast(\"last\")---"+a);
 
                   System.out.println("HelloWorld!");       
         }
         public   static  void   method2()
         {
                   soc("以下是:method2-------------");
                   LinkedList  a= dx();
                   soc("a.getFirst()---"+a.getFirst());//获取但是不删除元素
                   soc("a.getLast()---"+a.getLast());
                   soc("结果getFirst和getLast之后的a---"+a);
        
         }
         public   static  void  method3()
         {
            soc("以下是:method3-------------");
            LinkedList  a= dx();
            soc("原本a的长度---"+a.size());
            soc("a.removeFirst()---"+a.removeFirst());
            //removeFirst和removeLast方法返回的都是被增删的元素
            soc("removeFlirst之后的a---"+a);
            soc("再次a.removeFirst()---"+a.removeFirst());
            soc("再次removeFlirst之后的a---"+a);
            soc("a.removeLast()---"+a.removeLast());
            soc("removeLast之后的a---"+a);
            /*
            如果容器里面没有元素,就用getFirst,getLast,removeFirst或者removeLast方法操作元素,
            那么,就会抛出“没有这个元素”的异常NoSuchElementException
            */
         }
         public   static  void   method4()
         {
           soc("以下是:method4(1.6jdk新版本的方法)-------------");
           LinkedList  a= dx();
           //offFirst和offLast方法添加元素
           soc("a.offerFirst(\"456\")---"+a.offerFirst("456"));
            soc("经过a.offerFirst(\"456\")后的a---"+a);
 
           soc("a.offerLast(\"456\")---"+a.offerLast("456"));
            soc("经过a.offerLast(\"456\")后的a---"+a);
                                                
         }
         public   static  void   method5()
         {
           soc("以下是:method5(1.6jdk新版本的方法)-------------");
           LinkedList  a= dx(); 
            //peekFirst和peekLast方法获取但是不删除元素
           soc("a.peekFirst()---"+a.peekFirst());
            soc("a---"+a);
           soc("a.peekLast()---"+a.peekLast());
           soc("a---"+a);
            while(!a.isEmpty())
            {
                 a.removeFirst();     
            }
            soc("取出a中所有元素");
            soc("a.peekFirst()---"+a.peekFirst());
            soc("a---"+a);
            soc("a.peekLast()---"+a.peekLast());
            soc("a---"+a);
           //容器中没有元素时候,peekFirst和peekLast方法返回null
         }
         public   static  void   method6()
         {
           soc("以下是:method6(1.6jdk新版本的方法)-------------");
           LinkedList  a= dx(); 
            //pollFirst和pollLast方法获取并且删除元素
           soc("a.pollFirst()---"+a.pollFirst());
            soc("a---"+a);
           soc("a.pollLast()---"+a.pollLast());
            soc("a---"+a);
            while(!a.isEmpty())
            {
                 a.removeFirst();     
            }
            soc("取出a中所有元素");
           soc("a.pollFirst()---"+a.pollFirst());
           soc("a---"+a);
           soc("a.pollLast()---"+a.pollLast());
            soc("a---"+a);
//容器中没有元素时候,peekFirst和peekLast方法返回null
           
         }
   public   static   void soc(Object   obj)
         {
               System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
以下是:method-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
a.addFirst("kkk")---[kkk, jdk01,jdk02, jdk03, jdk04, jdk05]
a.addFirst("uio")---[uio, kkk,jdk01, jdk02, jdk03, jdk04, jdk05]
a.addLast("last")---[uio, kkk,jdk01, jdk02, jdk03, jdk04, jdk05, last]
Hello World!
以下是:method2-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
a.getFirst()---jdk01
a.getLast()---jdk05
结果getFirst和getLast之后的a---[jdk01,jdk02, jdk03, jdk04, jdk05]
以下是:method3-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
原本a的长度---5
a.removeFirst()---jdk01
removeFlirst之后的a---[jdk02, jdk03, jdk04, jdk05]
再次a.removeFirst()---jdk02
再次removeFlirst之后的a---[jdk03, jdk04, jdk05]
a.removeLast()---jdk05
removeLast之后的a---[jdk03, jdk04]
以下是:method4(1.6jdk新版本的方法)-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
a.offerFirst("456")---true
经过a.offerFirst("456")后的a---[456, jdk01, jdk02, jdk03, jdk04, jdk05]
a.offerLast("456")---true
经过a.offerLast("456")后的a---[456, jdk01, jdk02, jdk03, jdk04, jdk05, 456]
以下是:method5(1.6jdk新版本的方法)-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
a.peekFirst()---jdk01
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
a.peekLast()---jdk05
a---[jdk01, jdk02, jdk03, jdk04, jdk05]
取出a中所有元素
a.peekFirst()---null
a---[]
a.peekLast()---null
a---[]
以下是:method6(1.6jdk新版本的方法)-------------
原本的a---[jdk01, jdk02,jdk03, jdk04, jdk05]
a.pollFirst()---jdk01
a---[jdk02, jdk03, jdk04, jdk05]
a.pollLast()---jdk05
a---[jdk02, jdk03, jdk04]
取出a中所有元素
a.pollFirst()---null
a---[]
a.pollLast()---null
a---[]
 
*/

——————分割线——————

 

/*
  用LinkedList
    模拟队列(先进先出)
         模拟栈(先进后出)
*/
 
import java.util.*;
//Collection接口的体系放在Java.util包里面
class Dueilie//队列类
{
   private  LinkedList   a=new  LinkedList();
         public   void  myAdd(Object   obj)//加进元素
         {
               a.addLast(obj);        
         }
   public   Object   myGet()//删减元素
         {
            return a.pollFirst();
         }
         public   boolean isKong()
         {
              return  a.isEmpty();                  
         }
 
}
class Zhang
{
         private   LinkedList  b=new   LinkedList();
         public  void myAdd(Object  obj)
         {
              b.addLast(obj);           
         }
         public   Object myGet()
         {
              return  b.pollLast();             
         }
         public   boolean  isKong()
         {
               return  b.isEmpty();          
         }
}
class   Jihe8
{
         publicstatic void main(String[] args)
         {
              method();
              method2();
                  
         }
         public   static  void   method()
         {
                Dueilie   a= new  Dueilie();
                   a.myAdd("iop01");
                   a.myAdd("iop02");
                   a.myAdd("iop03");
                   a.myAdd("iop04");
                   a.myAdd("iop05");
                   a.myAdd("iop06");
       while(!a.isKong())
                   {
                         soc(a.myGet());  
                   }
      
         }
         public   static void   method2()
         {
             Zhang  a=new  Zhang();
                   a.myAdd("ert01");
                   a.myAdd("ert02");
                   a.myAdd("ert03");
                   a.myAdd("ert04");
                   a.myAdd("ert05");
                   a.myAdd("ert06");
       while(!a.isKong())
                   {
                         soc(a.myGet());  
                   }
                  
         }
         public  static void   soc(Object  obj)
         {
                System.out.println(obj);  
         }
}
/*
以上代码编译运行结果:
iop01
iop02
iop03
iop04
iop05
iop06
ert06
ert05
ert04
ert03
ert02
ert01
 
*/

——————分割线————

 

/*
去除容器中的重复元素
*/
 
import java.util.*;
//Collection接口的体系放在Java.util包里面
class Jihe9
{
         publicstatic void main(String[] args)
         {
                ff();
                method2();
                  
         }
         public   static  void   ff()
         {
             ArrayList  a=new   ArrayList();
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk01");
                   a.add("jdk01");
                   a.add("jdk04");
                   a.add("jdk04");
                   soc(a);
                   ArrayList   b=method(a);
                   soc(method(a));
         }
         public   static  ArrayList   method(ArrayList   a)
         {
                   ArrayList  b=new   ArrayList();
                   Iterator  it=a.iterator();
                   while(it.hasNext())
                   {
                        Object obj=it.next();
                             if( !b.contains(obj)   )//如果不包含就记录在b容器里面
                             {
                                 b.add(obj);
                             }
                   }
                   return   b;
                                                                                    
         }
         public   static  void   method2()
         {
             ArrayList  a=new   ArrayList();
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk01");
                   a.add("jdk01");
                   a.add("jdk04");
                   a.add("jdk04");
 
                   soc(a);
                   Iterator    it=a.iterator();
                   while(it.hasNext())
                   {
                       soc(it.next()+"-----"+it.next());//如果元素个数是奇数的话就容易出问题 
                             //所以一般在一个循环里面next()方法写一次
                   }
 
         }
 
 
         public   static  void  soc(Object  obj)
         {
                System.out.println(obj);
         }
}
/*
以上代码编译运行结果:
[jdk01, jdk02, jdk01, jdk01, jdk04, jdk04]
[jdk01, jdk02, jdk04]
[jdk01, jdk02, jdk01, jdk01, jdk04, jdk04]
jdk01-----jdk02
jdk01-----jdk01
jdk04-----jdk04
 
*/

——————分割线————

 

/*
依旧是ArrayList相关练习
*/
import java.util.*;
//Collection接口的体系放在Java.util包里面
class  Student
{
    private  String  name  ;
          private    int   age;
         Student(String  name,int age)
         {
                this.name=name;
                this.age=age;
 
         }
   public   String   getName()
         {
                 return  name;    
         }
   public   int   getAge()
         {
                 return  age;    
         }
         public  boolean  equals   (Object   obj)
         {
               if( !(obj instanceof   Student ) )
                     {
                         return  false;     
                     }
                     Student  stu=(Student)obj;
                    System.out.println(this.name+"----"+stu.name);
         System.out.println(this.age+"----"+stu.age);
                     boolean  cd= this.name.equals(stu.name)&& this.age==stu.age;
                              //这里的equals方法是字符串的equals方法,比较的是地址值
                     return cd;
 
         }
 
}
class   Jihe10
{
         Public static  void  main(String[]args)
         {
       ArrayList   a=  new  ArrayList();
                   a.add(new   Student("haha01",12));
                   a.add(new  Student("haha02",13));
                   a.add(new   Student("haha01",12));
                   a.add(new   Student("haha04",15));
                   a.add(new  Student("haha05",16));
                   a.add(new   Student("haha05",16));
 
                   //a.add(Object  obj);括号里面返回的是Object类的对象
 
                   a=    bijiao(a);
 
                   Iterator   it= a.iterator();
                   while(it.hasNext()        )
                   {
                        Student  stu=(Student)it.next()    ;  
                             //这里为什么要强制转换类型呢?
                             /*
                             因为a.add(Object  obj);括号里面返回的是Object类的对象,
                             it.next()代表的也是对应的Object类的对象,
            Object类的对象没有对应的getName()和getAge()方法调用
                             */
            soc("名字---"+stu.getName()+"---年龄---"+stu.getAge());
                   }
         }
   public   static   ArrayList   bijiao  (ArrayList  a)
         {
                 ArrayList   b=new  ArrayList();
                 Iterator    it= a.iterator();
 
           while(it.hasNext())
                       {
                  Student  stu= (Student)it.next();
                                 if(!b.contains(stu)   )
                                      /*
                                      这里的contains方法会内部自己调用到对象的equals方法,
                                      用来比较对象是否是一致的,但是由于equals方法被复写了,
                                      所以,实际上也就是调用了复写之后的equals方法
                                      remove方法也是调用了对象的equals方法,比较之后才会删减
                                      list,ArrayList也因为类似原理依赖于底层的Object类的equals方法,
 
                                      */
                                      {
                                            b.add(stu);
                                      
                                      }
                            }
                            return   b;
                                    
         }
         public   static  void  soc(Object  obj)
         {
                System.out.println(obj);
         }
}
/*
以上代码编译运行结果:
haha02----haha01
13----12
haha01----haha01
12----12
haha04----haha01
15----12
haha04----haha02
15----13
haha05----haha01
16----12
haha05----haha02
16----13
haha05----haha04
16----15
haha05----haha01
16----12
haha05----haha02
16----13
haha05----haha04
16----15
haha05----haha05
16----16
名字---haha01---年龄---12
名字---haha02---年龄---13
名字---haha04---年龄---15
名字---haha05---年龄---16
 
*/

——————分割线——————

 

   /*

  Set中的元素无序,元素不可以重复,该集合体系没有索引,

   无序意思就是存入和取出顺序不一定一样

  Set集合功能和Collection是一样的

  Set体系里面常用的是:

      HashSet----底层数据结构是哈希表,接收到的数据(对象的哈希值)都按照哈希表顺序排列,

                       一个数据按照自己的哈希值进来后,发现如果之前已经有存入的数据,就比较是否为同一个对象,

                       如果不是的话就在该哈希值下面顺延表示有两个对象在同一个哈希值下,否则就踢出去。

   */

import java.util.*;
//Collection接口的体系放在Java.util包里面
class   Jihe11
{
         public static  void  main(String[]args)
         {
        method();
              method2();
              method3();
         }
         public   static  void  method()
         {
         soc("以下是method-----------");
                HashSet   a=new HashSet();
                   a.add("jdk01");
                   a.add("jdk02");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk05");
                   a.add("jdk06");
                   Iterator   it=a.iterator();
                   while(  it.hasNext())
                   {
                        soc(it.next());       
                   }       
         }
         public  static  void   method2()
         {
         soc("以下是method2-----------");
            HashSet  a=new  HashSet();
                   a.add("jdk01");
                   a.add("jdk01");
                   a.add("jdk03");
                   a.add("jdk04");
                   a.add("jdk04");
                   a.add("jdk06");
                   Iterator   it=a.iterator();
                   while(  it.hasNext())
                   {
                        soc(it.next());       
                   }                            
         }
         public  static void   method3()
         {
                   soc("以下是method3-----------");
                   HashSet  a=new  HashSet();
                   soc("第一个a.add(\"jdk01\")返回的是---"+a.add("jdk01"));
                   soc("第二个a.add(\"jdk01\")返回的是---"+a.add("jdk01"));
 
         }
         public  static  void   soc(Object   obj  )
         {
            System.out.println(obj);                             
         }
}
/*
    以上代码编译运行结果:
以下是method-----------
jdk04
jdk03
jdk06
jdk05
jdk02
jdk01
以下是method2-----------
jdk04
jdk03
jdk06
jdk01
以下是method3-----------
第一个a.add("jdk01")返回的是---true
第二个a.add("jdk01")返回的是---false
 
*/

——————分割线————

/*

HashSet的具体实例的应用

依据相似的原理,对于HashSet而言,判断元素是否存在,删除这些操作都

依赖于hashCode和equals方法。

*/

import java.util.*;
//Collection接口的体系放在Java.util包里面
class  Student
{
    private  String  name  ;
          private    int   age;
         Student(String  name,int age)
         {
                this.name=name;
                this.age=age;
 
         }
         public   int  hashCode()//哈希值是int类型的
         //为什么这里要定义一个hashCode方法?
         /*
         因为要覆盖Object类中的hashCode方法,然后,
         返回后面需要调用的哈希值
         */
         {
             System.out.println("名字:"+this.name+"; hasCode()");//观测某对象是否调用了该方法
             return   this.name.hashCode()+this.age;
                   //名字的哈希值加上int类的年龄组成对应的对象的哈希值
       //后面如果出现不同名字和年龄的对象的话,就会按照哈希表放在容器某个位置
                   /*
          后面如果出现相同名字和年龄的对象的话,就会按照哈希表放在容器某个位置,
          并且虚拟机自动把其与前面相同名字年龄的对象比较名字年龄,当然,会被剔除出去,
            */
         }
   public   String   getName()
         {
                 return  name;    
         }
   public   int   getAge()
         {
                 return  age;    
         }
         public  boolean  equals   (Object   obj)
        
         {
               if( !(obj instanceof   Student ) )
                     {
                         return  false;     
                     }
                     Student  stu=(Student)obj;
                    System.out.println(this.name+"----"+stu.name);
                    System.out.println(this.age+"----"+stu.age);
                     boolean  cd= this.name.equals(stu.name)&& this.age==stu.age;
                              //这里的equals方法是字符串的equals方法,比较字符串内容是否相等
                     return cd;
 
         }
 
}
class  Jihe12
{
         publicstatic void main(String[] args)
         {
       HashSet   a=  new  HashSet();
                   a.add(new   Student("haha01",12));
                   a.add(new  Student("haha02",13));
                   a.add(new   Student("haha01",12));
                   a.add(new   Student("haha04",15));
                   a.add(new  Student("haha05",16));
                   a.add(new   Student("haha05",16));
    
                   //a.add(Object  obj);括号里面返回的是Object类的对象
       /*
                   就算是对象的名字年龄相同,每一个新建对象都有不同的哈希值,
                   从一开始就根据哈希表被放进容器里不同的位置上,即便后面使
                   用contains方法做比较都是没有实际效果,这样就挑不出重复的元素,
                   为了解决这个问题,就要覆盖Object类中的hashCode方法。
       */
                   //a=    bijiao(a);
                   /*
                   对于HashSet类的容器,往里面加元素时,虚拟机会自动比较提出重复元素,
                   (这也是HashSet类容器不允许重复元素存在的原因)
                   所以没有必要用到bijiao方法,但是会调用对象的equals方法
                   如果对象没有equals方法就默认是调用Object类的equals方法
       */
 
                   Iterator   it= a.iterator();
                   while(it.hasNext()        )
                   {
                        Student  stu=(Student)it.next()    ;  
            soc("名字---"+stu.getName()+"---年龄---"+stu.getAge());
                   }
         }
   public   static   ArrayList   bijiao  (ArrayList  a)//这个方法没有被调用
         {
                 ArrayList   b=new  ArrayList();
                 Iterator    it= a.iterator();
 
           while(it.hasNext())
                       {
                  Student  stu= (Student)it.next();
                                 if(!b.contains(stu)   )
                                      {
                                            b.add(stu);
                                      
                                      }
                            }
                            return   b;
                                    
         }
         public   static  void  soc(Object  obj)
         {
                System.out.println(obj);
         }
}
/*
以上代码编译运行结果:
名字:haha01; hasCode()
名字:haha02; hasCode()
名字:haha01; hasCode()
haha01----haha01
12----12
名字:haha04; hasCode()
名字:haha05; hasCode()
名字:haha05; hasCode()
haha05----haha05
16----16
名字---haha02---年龄---13
名字---haha05---年龄---16
名字---haha04---年龄---15
名字---haha01---年龄---12
 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值