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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王文辉 中级黑马   /  2015-7-22 18:55  /  305 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Set集合中没有特有的方法,所有的方法直接继承自Collection
Set集合组成:HashSetTreeSet
1, HashSet:底层数据结构是哈希表,线程不同步,存取速度快。判断元素唯一方式:先判断元素的hashCode值是否相同,若相同,再判断元素的equals方法是否为true
注意:子类LinkedHashSet基于哈希表,又融入了链表,可以对Set集合进行增删提高效率。
示例:
  1. /*
  2. * 在hashSet集合中存入自定义对象,去除重复的元素,并取出元素
  3. * 思路:
  4. * 1,描述手机,对手机的一些属性进行封装
  5. * 2,定义容器,存入手机对象
  6. * 3,使用迭代器取出容器内的对象
  7. * 4,打印结果
  8. *
  9. * */
  10. import java.util.HashSet;
  11. import java.util.Iterator;
  12. public class HashSet1 {
  13. public static void main(String[] args) {
  14. // TODO Auto-generated method stub
  15. HashSet<Phone> h = new HashSet<Phone>();
  16. h.add(new Phone("魅族", 5));
  17. h.add(new Phone("苹果", 4));
  18. h.add(new Phone("小米", 3));
  19. h.add(new Phone("华为", 4));
  20. h.add(new Phone("华为", 4));
  21. Iterator<Phone> it = h.iterator();
  22. while(it.hasNext()){
  23. Phone p = (Phone) it.next();
  24. System.out.println(p.getBRAND()+"---"+p.getSIZE());
  25. }
  26. }
  27. }
  28. class Phone{
  29. private String BRAND;
  30. private int SIZE;
  31. public Phone(String brand,int size) {
  32. // TODO Auto-generated constructor stub
  33. this.BRAND = brand;
  34. this.SIZE = size;
  35. }
  36. public String getBRAND() {
  37. return BRAND;
  38. }
  39. public void setBRAND(String bRAND) {
  40. BRAND = bRAND;
  41. }
  42. public int getSIZE() {
  43. return SIZE;
  44. }
  45. public void setSIZE(int sIZE) {
  46. SIZE = sIZE;
  47. }
  48. @Override
  49. public boolean equals(Object obj) {
  50. // TODO Auto-generated method stub
  51. if(!(obj instanceof Phone)){
  52. return false;
  53. }   
  54. Phone p=(Phone)obj;  
  55.         return this.BRAND.equals(p.BRAND)&&this.SIZE==p.SIZE;
  56. }
  57. @Override
  58. public int hashCode() {
  59. // TODO Auto-generated method stub
  60. return this.BRAND.hashCode()+this.SIZE;
  61. }
  62. }
复制代码
2, TreeSet:底层数据结构是二叉树结构。判断元素唯一方式:通过比较方法的return 0来判断元素是否相同。
treeSet可以对Set集合中的元素进行排序,原因是TreeSet类实现了Comparable接口,强制对元素进行比较。
两种排序方式:
1, 让元素自身具有比较性。也就是实现Comparable接口,覆盖compareTo方法,这种方式作为元素的自然排序,也可以说是默认排序。
示例:
  1. import java.util.Iterator;  
  2. import java.util.TreeSet;  
  3.   
  4. public class TreeSet1 {  
  5.   
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         TreeSet<Person1> t = new TreeSet<Person1>();  
  9.         t.add(new Person1("小明", 21));  
  10.         t.add(new Person1("小明", 21));  
  11.         t.add(new Person1("小明", 22));  
  12.         t.add(new Person1("小红", 21));  
  13.         t.add(new Person1("小刚", 23));  
  14.          
  15.         Iterator<Person1> it = t.iterator();  
  16.         while(it.hasNext()){  
  17.             Person1 p = it.next();  
  18.             System.out.println(p.getName()+"---"+p.getAge());  
  19.         }  
  20.     }  
  21.   
  22. }  
  23.   
  24. class Person1 implements Comparable{  
  25.     private String name;  
  26.     private int age;  
  27.       
  28.     public Person1(String name,int age) {  
  29.         // TODO Auto-generated constructor stub  
  30.         this.name = name;  
  31.         this.age = age;  
  32.     }  
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.     public String getName()   
  40.     {   
  41.         return name;   
  42.     }   
  43.    
  44.     public int getAge()   
  45.     {   
  46.         return age;   
  47.     }   
  48.       
  49.     @Override  
  50.     public int compareTo(Object o) {  
  51.         // TODO Auto-generated method stub  
  52.         Person1 p = (Person1) o;  
  53.         if(this.age==p.age)   
  54.             return this.name.compareTo(p.name);   
  55.         return this.age-p.age;   
  56.     }  
  57. }  
复制代码

2,自定义比较器。若元素自身不具有比较性,或者元素自身具有的比较性不是自己所需要的,这时只能让容器自身具备。
示例:
  1. import java.util.Comparator;  
  2. import java.util.Iterator;  
  3. import java.util.TreeSet;  
  4.   
  5. public class TreeSet2 {  
  6.   
  7.     public static void main(String[] args) {  
  8.         // TODO Auto-generated method stub  
  9.         TreeSet<Person2> t = new TreeSet<Person2>(new CompareTest());  
  10.         t.add(new Person2("小明", 21));  
  11.         t.add(new Person2("小明", 21));  
  12.         t.add(new Person2("小明", 22));  
  13.         t.add(new Person2("小红", 21));  
  14.         t.add(new Person2("小刚", 23));  
  15.          
  16.         Iterator<Person2> it = t.iterator();  
  17.         while(it.hasNext()){  
  18.             Person2 p = it.next();  
  19.             System.out.println(p.getName()+"---"+p.getAge());  
  20.         }  
  21.     }  
  22.   
  23. }  
  24.   
  25. class Person2 implements Comparable{  
  26.     private String name;  
  27.     private int age;  
  28.       
  29.     public Person2(String name,int age) {  
  30.         // TODO Auto-generated constructor stub  
  31.         this.name = name;  
  32.         this.age = age;  
  33.     }  
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.     public void setAge(int age) {  
  38.         this.age = age;  
  39.     }  
  40.     public String getName()   
  41.     {   
  42.         return name;   
  43.     }   
  44.    
  45.     public int getAge()   
  46.     {   
  47.         return age;   
  48.     }   
  49.   
  50.     @Override  
  51.     public int compareTo(Object o) {  
  52.         // TODO Auto-generated method stub  
  53.         Person2 p = (Person2) o;  
  54.         if(this.age==p.age)   
  55.             return this.name.compareTo(p.name);   
  56.         return this.age-p.age;   
  57.     }  
  58. }  
  59.   
  60. //定义一个比较器,以姓名长度(name)和年龄(age)比较  
  61. class CompareTest implements Comparator<Person2>{  
  62.   
  63.     @Override  
  64.     public int compare(Person2 o1, Person2 o2) {  
  65.         // TODO Auto-generated method stub  
  66.         int res=new Integer(o1.getName().length()).compareTo(new Integer(o2.getName().length()));   
  67.         if (res==0)   
  68.         {   
  69.             return new Integer(o1.getAge()).compareTo(o2.getAge());   
  70.         }   
  71.         return res;   
  72.     }  
  73.       
  74. }  
复制代码

那么多容器,如何判断容器的数据结构?
可以通过容器的命名就可以明确其数据结构:
ArrayList:数组Array
LinkedList:链表link
HashSetHashMap:哈希表hash
TreeSetTreeMap:二叉树tree


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马