黑马程序员_集合(一)_List、Set

--------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

数组和集合类的区别:

 

 

数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能

 

 

储对象。

 

集合类的特点:


 

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。


 

Collection接口:


 

List接口:可存放重复元素,元素存取是有序的。


 

Set:不可以存放重复元素,元素存取是无序的。

 

 

 

add方法的参数类型是Object,以便于接受任意类型对象。

 

 

集合中存储的都是对象的引用(地址)。

 

 

什么是迭代器:

 

 

其实就是集合的取出元素的方式。

 

 

迭代器的内部实现:

 

 

把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了

 

 

内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容判断和取出。那

 

 

么可以将共性抽取。

 

 

Collection:

 

 

List:元素是有序的,元素可以重复。因为该集合体系有索引。

 

 

ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。当元素

 

 

超过10个,则自动延长,50%延长。

 

 

LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。

 

 

Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。当元素超出10个,100%延长。

 

 

List集合:

 


 1、添加:


 add(index,element);


 addAll(index,Collection);

 

 

2、删除:


 remove(index);

 

 

3、修改:


 set(index,element);

 


4、查询:


 get(index);


 subList(from,to);


 listIterator();


 int indexOf(obj):获取指定元素的位置。


 ListIterator listIterator();

 


List集合特有的迭代器。ListIterator是Iterator的子接口。 

 

 

在迭代时,不可以通过集合对象的方法操作集合中的元素。

 


因为会发生ConcurrentModificationException异常。

 

 

所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取

 

 

出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

 

 

该接口只能通过List集合的listIterator方法获取。

 

 

在迭代过程中,准备添加或者删除元素。

 

 

Java代码   收藏代码
  1. Iterator it = al.iterator();  
  2.   
  3.         while(it.hasNext())  
  4.         {  
  5.             Object obj = it.next();  
  6.   
  7.             if(obj.equals("java02"))  
  8.                 al.add("java008");  
  9.                   
  10.         }  
  11.   
  12. 此时将抛出ConcurrentModificationException异常  

 

 

 枚举就是Vector的特殊取出方式。

 

Java代码   收藏代码
  1. public static void main(String[] args)   
  2.     {  
  3.         Vector v = new Vector();  
  4.   
  5.         v.add("java01");  
  6.         v.add("java02");  
  7.         v.add("java03");  
  8.         v.add("java04");  
  9.   
  10.         Enumeration en = v.elements();  
  11.   
  12.         while(en.hasMoreElements())  
  13.         {  
  14.             System.out.println(en.nextElement());  
  15.         }  
  16.     }  

 

 

LinkedList:

 

 

LinkedList的特有方法:

 

 

addFirst();

 

addLast();

 

getFirst();

 

getLast();获取元素,但不删除元素。如果集合中没有元素,则抛出异常。

 

 

removeFirst();

 

removeLast();获取元素,但是元素被删除,如果集合中没有元素,则抛出异常。

 

 

在JDK 1.6出现了替代方法:

 

 

offerFirst();

 

offerLast();

 

 

peekFirst();

 

peekLast();获取元素,但不删除元素。如果集合中没有元素,返回null。

 

 

pollFirst();

 

pollLast();获取元素,但是元素被删除,如果集合中没有元素,则返回null。

 

 

 练习:使用LinkedList模拟一个堆栈或者队列数据结构。

 

 

Java代码   收藏代码
  1. class DuiLie  
  2. {  
  3.     private LinkedList link;  
  4.   
  5.     DuiLie()  
  6.     {  
  7.         link = new LinkedList();  
  8.     }  
  9.       
  10.     public void myAdd(Object obj)//添加元素进入队列  
  11.     {  
  12.         link.addFirst(obj);  
  13.     }  
  14.     public Object myGet()//拿出元素,并移除这个元素  
  15.     {  
  16.         return link.removeFirst();  
  17.     }  
  18.     public boolean isNull()//判断队列中是否有元素  
  19.     {  
  20.         return link.isEmpty();  
  21.     }  
  22.   
  23. }  
  24.   
  25.   
  26.   
  27. class  LinkedListTest  
  28. {  
  29.     public static void main(String[] args)   
  30.     {  
  31.         DuiLie dl = new DuiLie();//初始化并添加元素  
  32.         dl.myAdd("java01");  
  33.         dl.myAdd("java02");  
  34.         dl.myAdd("java03");  
  35.         dl.myAdd("java04");  
  36.   
  37.         while(!dl.isNull())//如果队列不为空,则取出元素  
  38.         {  
  39.             System.out.println(dl.myGet());  
  40.         }  
  41.     }  
  42. }  

 

 

 练习:去除ArrayList集合中的重复元素。

 

 

Java代码   收藏代码
  1. class ArrayListTest   
  2. {  
  3.   
  4.     public static void sop(Object obj)  
  5.     {  
  6.         System.out.println(obj);  
  7.     }  
  8.     public static void main(String[] args)   
  9.     {  
  10.         ArrayList al = new ArrayList();//初始化一个ArrayList对象  
  11.   
  12.         al.add("java01");//并添加元素  
  13.         al.add("java02");  
  14.         al.add("java01");  
  15.         al.add("java02");  
  16.         al.add("java01");  
  17.   
  18.         sop(al);//打印原集合  
  19.           
  20.         al = singleElement(al);  
  21.   
  22.         sop(al);//打印去掉重复元素的集合  
  23.           
  24.   
  25.     }  
  26.   
  27.     public static ArrayList singleElement(ArrayList al)  
  28.     {  
  29.         //定义一个临时容器。  
  30.         ArrayList newAl = new ArrayList();  
  31.   
  32.         Iterator it = al.iterator();//遍历原集合  
  33.   
  34.         while(it.hasNext())  
  35.         {  
  36.             Object obj = it.next();  
  37.   
  38.             if(!newAl.contains(obj))//如果新集合不包含这个元素则存入新集合  
  39.                 newAl.add(obj);  
  40.   
  41.         }  
  42.   
  43.         return newAl;  
  44.     }  
  45. }  

 

 

 

Set集合:

 

 

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

 


HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

 


   HashSet保证元素的唯一性:

 

 

   1、是通过元素的两个方法,hashCode和equals来完成。

 


   2、如果元素的HashCode值相同,才会判断equals是否为true。

 


   3、如果元素的hashcode值不同,不会调用equals。

 

 

对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

 

 

Set集合的功能和Collection是一致的。

 


练习:往hashSet集合中存入自定对象姓名和年龄相同为同一个人,重复元素。

 

 

Java代码   收藏代码
  1. class HashSetTest   
  2. {  
  3.     public static void sop(Object obj)  
  4.     {  
  5.         System.out.println(obj);  
  6.     }  
  7.     public static void main(String[] args)   
  8.     {  
  9.         HashSet hs = new HashSet();//定义一个HashSet  
  10.           
  11.         //向这个集合中添加自定义元素  
  12.         hs.add(new Person("a1",11));  
  13.         hs.add(new Person("a2",12));  
  14.         hs.add(new Person("a3",13));          
  15.           
  16.         //遍历这个集合  
  17.         Iterator it = hs.iterator();  
  18.   
  19.         //打印集合中的内容  
  20.         while(it.hasNext())  
  21.         {  
  22.             Person p = (Person)it.next();  
  23.             sop(p.getName()+"::"+p.getAge());  
  24.         }  
  25.     }  
  26. }  
  27. class Person  
  28. {  
  29.     private String name;//人的属性  
  30.     private int age;  
  31.     Person(String name,int age)  
  32.     {  
  33.         this.name = name;  
  34.         this.age = age;  
  35.     }  
  36.       
  37.     //覆盖hashCode值和equals方法  
  38.     public int hashCode()  
  39.     {  
  40.         System.out.println(this.name+"....hashCode");  
  41.         return name.hashCode()+age*37;  
  42.     }  
  43.   
  44.     //如果姓名和年龄相同就为同一个人  
  45.     public boolean equals(Object obj)  
  46.     {  
  47.   
  48.         if(!(obj instanceof Person))  
  49.             return false;  
  50.   
  51.         Person p = (Person)obj;  
  52.         System.out.println(this.name+"...equals.."+p.name);  
  53.   
  54.         return this.name.equals(p.name) && this.age == p.age;  
  55.     }  
  56.   
  57.       
  58.     public String getName()  
  59.     {  
  60.         return name;  
  61.     }  
  62.     public int getAge()  
  63.     {  
  64.         return age;  
  65.     }  
  66. }  

 

 

 TreeSet集合:

 

 

 可以对Set集合中的元素进行排序。底层数据结构是二叉树。

 

 

保证元素唯一性的依据:compareTo方法return 0.

 

 

TreeSet排序的第一种方式:让元素自身具备比较性。

 


元素需要实现Comparable接口,覆盖compareTo方法。

 


也种方式也成为元素的自然顺序,或者叫做默认顺序。

 

 

TreeSet的第二种排序方式:

 


当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合

 

 

初始化时,就有了比较方式。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

 

 

 当两种排序都存在时,以比较器排序为主。

 

 

练习:按字符串长度排序

 

Java代码   收藏代码
  1. class  TreeSetTest  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         TreeSet ts = new TreeSet(new StrLenComparator());//创建一个TreeSet,并传入一个比较器  
  6.   
  7.         ts.add("abcd");//添加元素  
  8.         ts.add("cc");  
  9.         ts.add("cba");  
  10.         ts.add("aaa");  
  11.         ts.add("z");  
  12.         ts.add("hahaha");  
  13.   
  14.         Iterator it = ts.iterator();//遍历打印这个集合,查看排序结果  
  15.   
  16.         while(it.hasNext())  
  17.         {  
  18.             System.out.println(it.next());  
  19.         }  
  20.     }  
  21. }  
  22.   
  23. class StrLenComparator implements Comparator  
  24. {  
  25.     public int compare(Object o1,Object o2)//覆盖compare方法  
  26.     {  
  27.         String s1 = (String)o1;  
  28.         String s2 = (String)o2;  
  29.               
  30.         int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//字符串按长度从短到长排序  
  31.         if(num==0)  
  32.             return s1.compareTo(s2);  
  33.   
  34.         return num;  
  35.     }  
  36. }  

--------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值