黑马程序员_集合

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

集合的特点:

1:对象封装数据,对象多了也需要存储。集合用于存储对象。
2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可变长度的。

集合和数组的区别:
1:数组是固定长度的;集合可变长度的。
2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
 数据结构:就是容器中存储数据的方式。
对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个容器的内部数据结构不同。
集合容器在不断向上抽取过程中。出现了集合体系。

collection接口的两个子接口:
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。

List接口:
      List本身是Collection接口的子接口,具备了Collection的所有方法。
List的三个实现类
ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。

Set接口:
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
  HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
  HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
                当元素的hashCode值相同时,才继续判断元素的equals是否为true。
                如果为true,那么视为相同元素,不存。如果为false,那么存储。
                如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
 TreeSet用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
               如果元素不具备比较性,在运行时会发生ClassCastException异常。
               所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
              依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。

Map接口:
HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
Map集合存储和Collection有着很大不同:
           Collection一次存一个元素;Map一次存一对元素。
           Collection是单列集合;Map是双列集合。
Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。

框架结构:


HashSet集合:

 

[java]  view plain copy
  1. package cn.jiava.basic.collection;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5.   
  6. //Set集合演示  
  7. public class SetDemo {  
  8.     @SuppressWarnings("unchecked")  
  9.     public static void main(String[] args) {  
  10.         HashSet set=new HashSet();  
  11.         set.add("aaa");  
  12.         set.add("bbb");  
  13.         set.add("ccc");  
  14.         set.add("ccc");  
  15.         set.add("ddd");  
  16.         //我们应该考虑最小内存开销,保证循环结束后迭代器被释放。  
  17.       for( Iterator it=set.iterator();it.hasNext();){  
  18.           System.out.println(it.next());  
  19.       }  
  20.     }  
  21. }  


运行结果:
aaa
ddd
ccc
bbb

得出HashSet集合内部是哈希表,在存入对象时会先调用hashCode方法算哈希值,如果哈希值相同,则会调用对象的eqauls方法继续判断,如果返回true则认为对象重复,则不存入。同时存入的对象元素都是无序的。

TreeSet集合:

[java]  view plain copy
  1. //如果TreeSet容器没有比较器,那么存入的对象具有自然顺序,否则报错。  
  2. public class Person implements Comparable{  
  3.     private int age;  
  4.     private String name;  
  5.   
  6.     public Person() {  
  7.         super();  
  8.     }  
  9.   
  10.     public Person(String name,int age ) {  
  11.         super();  
  12.         this.age = age;  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     public int getAge() {  
  17.         return age;  
  18.     }  
  19.   
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.   
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.   
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.   //在TreeSet容器没有比较器时,会调用此方法进行比较再存入容器。  
  32.  //在这里按照人的年龄进行比较  
  33.     @Override  
  34.     public int compareTo(Object o) {  
  35.         if(!(o instanceof Person)){  
  36.             throw new ClassCastException("类型不合法");  
  37.         }  
  38.         Person p=(Person) o;  
  39.         int temp=this.age-p.age;  
  40.         return temp==0?this.name.compareTo(p.name):temp;  
  41.     }  
  42.   
  43. }  
[java]  view plain copy
  1. /TreeSet集合存入元素时根据元素自然顺序存入  
  2. public class TreeSetDemo {  
  3.     @SuppressWarnings("unchecked")  
  4.     public static void main(String[] args) {  
  5.         TreeSet ts=new TreeSet();  
  6.         ts.add(new Person("zhangsan",22));  
  7.         ts.add(new Person("lishi",21));  
  8.         ts.add(new Person("wangwu",23));  
  9.         ts.add(new Person("wbngwu",23));//如果年龄相同,则按次要条件年龄进行比较存入  
  10.         ts.add(new Person("zhaoliu",20));  
  11.         Iterator it=ts.iterator();  
  12.         while(it.hasNext()){  
  13.             Person person=(Person) it.next();  
  14.             System.out.println(person.getName()+":::"+person.getAge());  
  15.         }  
  16.     }  
  17. }  
[java]  view plain copy
  1. <p> </p>  

运行结果:

zhaoliu:::20
lishi:::21
zhangsan:::22
wangwu:::23
wbngwu:::23

TreeMap集合:

[java]  view plain copy
  1. //TreeMap和TreeSet存入元素一样,根据自然顺序和集合的比较器进行存入。  
  2. public class TreeMapDemo {  
  3.   
  4.     @SuppressWarnings("unchecked")  
  5.     public static void main(String[] args) {  
  6.         TreeMap<Person, String> hm=new TreeMap<Person, String>(new ComparatorByName());//传入集合比较器  
  7.         hm.put(new Person("zhangsan",22), "北京");  
  8.         hm.put(new Person("lishi",20), "深圳");  
  9.         hm.put(new Person("wangwu",21), "上海");  
  10.         hm.put(new Person("zhaoliu",25), "天津");  
  11.         hm.put(new Person("wangwu",21), "重庆");  
  12.         //Map.Entry为内部类,通过该内部类的getKey和getValue方法可获得键和值。  
  13.         for(Map.Entry<Person, String> me:hm.entrySet()){  
  14.             System.out.println(me.getKey().getName()+":::"+me.getKey().getAge()+"..."+me.getValue());  
  15.         }   
  16.   
  17.     }  
  18.   
  19. }  


运行结果:

lishi:::20...深圳
wangwu:::21...重庆
zhangsan:::22...北京
zhaoliu:::25...天津

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值