黑马程序员_Java基础_集合框架2

来源:互联网 发布:java高级架构师视频 编辑:程序博客网 时间:2024/04/25 12:28

一、集合框架(TreeSet)

[java] view plaincopy
  1. /* 
  2. Set:无序,不可重复元素。 
  3.     |--HashSet:数据结构是哈希表。线程是非同步的。 
  4.                保证元素唯一性的原理:判断元素的hashCode值是否相同。 
  5.                如果相同,还会继续判断元素的equals方法,是否为true。 
  6.     |--TreeSet:可以对Set集合中的元素进行排序。 
  7. */  
  8. import java.util.*;  
  9. class TreeSetDemo   
  10. {  
  11.     public static void main(String[] args)   
  12.     {  
  13.         TreeSet ts=new TreeSet();  
  14.         ts.add("cba");  
  15.         ts.add("abcd");  
  16.         ts.add("aaa");  
  17.         ts.add("bca");  
  18.   
  19.         Iterator it=ts.iterator();  
  20.         while(it.hasNext())  
  21.         {  
  22.             System.out.println(it.next());  
  23.         }  
  24.     }  
  25. }  


 

二、集合框架(TreeSet存储自定义对象)

[java] view plaincopy
  1. /* 
  2. Set:无序,不可重复元素。 
  3.     |--HashSet:数据结构是哈希表。线程是非同步的。 
  4.                保证元素唯一性的原理:判断元素的hashCode值是否相同。 
  5.                如果相同,还会继续判断元素的equals方法,是否为true。 
  6.     |--TreeSet:可以对Set集合中的元素进行排序。 
  7.  
  8. 需求: 
  9. 往TreeSet集合中存储自定义对象,按照学生的年龄进行排序。 
  10.  
  11. 注意:排序时。当主要条件相同时,一定要再判断次要条件。 
  12. */  
  13. import java.util.*;  
  14. class Student implements Comparable//该接口强制让学生具备比较性  
  15. {  
  16.     private String name;  
  17.     private int age;  
  18.     public int compareTo(Object obj)//覆盖compateTo  
  19.     {  
  20.         if(!(obj instanceof Student))  
  21.             throw new RuntimeException("不是学生对象");  
  22.         Student s=(Student)obj;  
  23.           
  24.         System.out.println(this.name+"...compateTo...."+s.name);  
  25.         if(this.age>s.age)  
  26.             return 1;//返回正数  
  27.   
  28.         if(this.age==s.age)  
  29.         {  
  30.             return this.name.compareTo(s.name);//判断次要条件。调用String类compareTo  
  31.         }  
  32.         return -1;  
  33.     }  
  34.     Student(String name,int age)  
  35.     {  
  36.         this.name=name;  
  37.         this.age=age;  
  38.     }  
  39.     public String getName()  
  40.     {  
  41.         return name;  
  42.     }  
  43.     public int getAge()  
  44.     {  
  45.         return age;  
  46.     }  
  47. }  
  48. class TreeSetDemo   
  49. {  
  50.     public static void main(String[] args)   
  51.     {  
  52.         TreeSet ts=new TreeSet();  
  53.         ts.add(new Student("lisi02",22));  
  54.         ts.add(new Student("lisi007",19));  
  55.         ts.add(new Student("lisi09",19));  
  56.         ts.add(new Student("lisi01",40));  
  57.   
  58.         Iterator it=ts.iterator();  
  59.         while(it.hasNext())  
  60.         {  
  61.             Student st=(Student)it.next();  
  62.             System.out.println("姓名:"+st.getName()+"\t年龄:"+st.getAge());  
  63.         }  
  64.     }  
  65. }  


三、集合框架(二叉树)

 

 

[java] view plaincopy
  1. /* 
  2. Set:无序,不可重复元素。 
  3.     |--HashSet:数据结构是哈希表。线程是非同步的。 
  4.                保证元素唯一性的原理:判断元素的hashCode值是否相同。 
  5.                如果相同,还会继续判断元素的equals方法,是否为true。 
  6.     |--TreeSet:可以对Set集合中的元素进行排序。 
  7.                 底层数据结构是二叉树。 
  8.                 保证元素唯一性的依据: 
  9.                 compareTo方法 return 0; 
  10.  
  11.                 TreeSet排序的第一种方式: 
  12.                 让元素自身具有比较性。元素需要实现compareTo方法,这种方式也成为 
  13.                 元素的自然顺序,也叫默认顺序。 
  14.   TreeSet排序的第二种方式: 
  15.   当元素自身不具有比较性,或者具备的比较性不是所需要的。这时就需要 
  16.   让集合自身具有比较性。就是在集合初始化时就有了比较方式。 
  17.  
  18. 需求: 
  19. 往TreeSet集合中存储自定义对象,按照学生的年龄进行排序。 
  20.  
  21. 注意:排序时。当主要条件相同时,一定要再判断次要条件。 
  22. */  
  23. import java.util.*;  
  24. class Student implements Comparable//该接口强制让学生具备比较性  
  25. {  
  26.     private String name;  
  27.     private int age;  
  28.     public int compareTo(Object obj)//覆盖compateTo  
  29.     {  
  30.         return 1;//怎么存怎么取。保证始终存入的要比前一个大。  
  31.     }  
  32.     Student(String name,int age)  
  33.     {  
  34.         this.name=name;  
  35.         this.age=age;  
  36.     }  
  37.     public String getName()  
  38.     {  
  39.         return name;  
  40.     }  
  41.     public int getAge()  
  42.     {  
  43.         return age;  
  44.     }  
  45. }  
  46. class TreeSetDemo   
  47. {  
  48.     public static void main(String[] args)   
  49.     {  
  50.         TreeSet ts=new TreeSet();  
  51.         ts.add(new Student("lisi02",22));  
  52.         ts.add(new Student("lisi007",19));  
  53.         ts.add(new Student("lisi09",19));  
  54.         ts.add(new Student("lisi01",40));  
  55.   
  56.         Iterator it=ts.iterator();  
  57.         while(it.hasNext())  
  58.         {  
  59.             Student st=(Student)it.next();  
  60.             System.out.println("姓名:"+st.getName()+"\t年龄:"+st.getAge());  
  61.         }  
  62.     }  
  63. }  


 

四、集合框架(实现Comparator方式排序)

[java] view plaincopy
  1. /* 
  2. 当元素自身不具有比较性,或者具备的比较性不是所需要的。这时就需要 
  3. 让集合自身具有比较性。就是在集合初始化时就有了比较方式。 
  4. 定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 
  5.  
  6. 当两种排序都存在时,以比较器为主。 
  7.  
  8. 定义一个类,实现Comparator接口,覆盖compare方法。 
  9. */  
  10. import java.util.*;  
  11. class Mycompare implements Comparator  
  12. {  
  13.     public int compare(Object o1,Object o2)  
  14.     {  
  15.         Student s1=(Student)o1;  
  16.         Student s2=(Student)o2;  
  17.   
  18.         int num=s1.getName().compareTo(s2.getName());  
  19.   
  20.         if(num==0)  
  21.             //return s1.getAge()-s2.getAge();  
  22.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  23.           
  24.         return num;  
  25.     }  
  26. }  
  27. class Student implements Comparable//该接口强制让学生具备比较性  
  28. {  
  29.     private String name;  
  30.     private int age;  
  31.     public int compareTo(Object obj)//覆盖compateTo  
  32.     {  
  33.         if(!(obj instanceof Student))  
  34.             throw new RuntimeException("不是学生对象");  
  35.         Student s=(Student)obj;  
  36.           
  37.         System.out.println(this.name+"...compateTo...."+s.name);  
  38.         if(this.age>s.age)  
  39.             return 1;//返回正数  
  40.   
  41.         if(this.age==s.age)  
  42.         {  
  43.             return this.name.compareTo(s.name);//判断次要条件。调用String类compareTo  
  44.         }  
  45.         return -1;  
  46.     }  
  47.     Student(String name,int age)  
  48.     {  
  49.         this.name=name;  
  50.         this.age=age;  
  51.     }  
  52.     public String getName()  
  53.     {  
  54.         return name;  
  55.     }  
  56.     public int getAge()  
  57.     {  
  58.         return age;  
  59.     }  
  60. }  
  61.   
  62. class TreeSetDemo2   
  63. {  
  64.     public static void main(String[] args)   
  65.     {  
  66.         TreeSet ts=new TreeSet(new Mycompare());  
  67.         ts.add(new Student("lisi02",22));  
  68.         ts.add(new Student("lisi007",19));  
  69.         ts.add(new Student("lisi09",19));  
  70.         ts.add(new Student("lisi01",40));  
  71.         ts.add(new Student("lisi007",18));  
  72.         ts.add(new Student("lisi02",12));  
  73.   
  74.         Iterator it=ts.iterator();  
  75.         while(it.hasNext())  
  76.         {  
  77.             Student st=(Student)it.next();  
  78.             System.out.println("姓名:"+st.getName()+"\t年龄:"+st.getAge());  
  79.         }  
  80.     }  
  81. }  



 

五、集合框架(TreeSet练习)

[java] view plaincopy
  1. /* 
  2. 练习:按照字符串长度排序。 
  3.  
  4. 字符串本身具有比较性,但是它的比较方式不是所需要的。 
  5. 这是就需要比较器。 
  6.  
  7. */  
  8. import java.util.*;  
  9. class StringLenthComparator implements Comparator  
  10. {  
  11.     public int compare(Object o1,Object o2)  
  12.     {  
  13.         String s1=(String)o1;  
  14.         String s2=(String)o2;  
  15.         /* 
  16.         if(s1.length()>s2.length()) 
  17.             return 1; 
  18.         if(s1.length()==s2.length()) 
  19.             return 0; 
  20.         */  
  21.   
  22.         //主要条件  
  23.         int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));  
  24.           
  25.   
  26.         //次要条件  
  27.         if(num==0)  
  28.             return s1.compareTo(s2);  
  29.   
  30.         return num;  
  31.     }  
  32. }  
  33. class TreeSetTest   
  34. {  
  35.     public static void main(String[] args)   
  36.     {  
  37.         TreeSet ts=new TreeSet(new StringLenthComparator());  
  38.         ts.add("abcd");  
  39.         ts.add("cc");  
  40.         ts.add("cba");  
  41.         ts.add("aaa");  
  42.         ts.add("z");  
  43.         ts.add("hahaha");  
  44.   
  45.         Iterator it=ts.iterator();  
  46.         while(it.hasNext())  
  47.         {  
  48.             System.out.println(it.next());  
  49.         }  
  50.   
  51.     }  
  52. }  


六、集合框架(泛型概述)

泛型:JDK1.5版本以后出现的新特性,用于解决安全问题。

泛型的格式:通过<>来定义要操作的引用数据类型。

在使用Java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型。

其实<>就是用来接受类型的。

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

好处:

1.将运行时期出现的问题ClassCactException转移到了编译时期,方便于程序员解决问题,让运行时期问题减少,安全。

2.避免了强制转换的麻烦。

[java] view plaincopy
  1. /* 
  2. 泛型: 
  3. */  
  4.   
  5. import java.util.*;  
  6. class GenericDemo   
  7. {  
  8.     public static void main(String[] args)   
  9.     {  
  10.         ArrayList<String> a1=new ArrayList<String>();  
  11.   
  12.         a1.add("abc01");  
  13.         a1.add("abc099");  
  14.         a1.add("abc0134");  
  15.         /* 
  16.         a1.add(4);//a1.add(new Integer(4)); 
  17.  
  18.         //出现异常。java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 
  19.          
  20.         */  
  21.         Iterator<String> it=a1.iterator();  
  22.         while(it.hasNext())  
  23.         {  
  24.             String s=it.next();  
  25.   
  26.             System.out.println(s+":"+s.length());  
  27.         }  
  28.   
  29.     }  
  30. }  


七、集合框架(泛型使用)

[java] view plaincopy
  1. /* 
  2. 泛型使用: 
  3. */  
  4. import java.util.*;  
  5. class LenComperator implements Comparator<String>  
  6. {  
  7.     public int compare(String o1,String o2)  
  8.     {  
  9.         int num=new Integer(o1.length()).compareTo(new Integer(o2.length()));  
  10.   
  11.         if(num==0)  
  12.             return o1.compareTo(o2);  
  13.   
  14.         return num;  
  15.     }  
  16. }  
  17. class GenericDemo2   
  18. {  
  19.     public static void main(String[] args)   
  20.     {  
  21.         TreeSet<String> ts=new TreeSet<String>(new LenComperator());  
  22.         ts.add("asd");  
  23.         ts.add("gfh");  
  24.         ts.add("ghkl");  
  25.         ts.add("vb");  
  26.         ts.add("wegt");  
  27.   
  28.         Iterator<String> it=ts.iterator();  
  29.   
  30.         while(it.hasNext())  
  31.         {  
  32.             String s=it.next();  
  33.             System.out.println(s);  
  34.         }  
  35.   
  36.     }  
  37. }  


八、集合框架(泛型类)

[java] view plaincopy
  1. /* 
  2. 什么时候定义泛型类? 
  3. 当类中的要操作的引用数据类型不确定时,早期定义Object来完成扩展。 
  4. 现在定义泛型类来完成扩展。 
  5. */  
  6. class Worker  
  7. {  
  8. }  
  9. class Student  
  10. {  
  11. }  
  12.   
  13. class Tool//没有泛型前的做法  
  14. {  
  15.     private Object obj;  
  16.     public void setObject(Object obj)  
  17.     {  
  18.         this.obj=obj;  
  19.     }  
  20.     public Object getObject()  
  21.     {  
  22.         return obj;  
  23.     }  
  24. }  
  25. class Utils<QQ>//泛型类  
  26. {  
  27.     private QQ q;  
  28.     public void setObject(QQ q)  
  29.     {  
  30.         this.q=q;  
  31.     }  
  32.     public QQ getObject()  
  33.     {  
  34.         return q;  
  35.     }  
  36. }  
  37. /* 
  38. class Tool 
  39. { 
  40.     private Worker w; 
  41.     public void setWorker(Worker w) 
  42.     { 
  43.         this.w=w; 
  44.     } 
  45.     public Work getWorker() 
  46.     { 
  47.         return w; 
  48.     } 
  49. } 
  50. */  
  51. class GenericDemo3   
  52. {  
  53.     public static void main(String[] args)   
  54.     {  
  55.         Utils<Worker> u=new Utils<Worker>();  
  56.   
  57.         u.setObject(new Worker());  
  58.         Worker w=u.getObject();  
  59.   
  60.         /* 
  61.         Tool t=new Tool(); 
  62.         t.setObject(new Worker()); 
  63.         Worker w=(Worker)t.getObject(); 
  64.         */  
  65.     }  
  66. }  


九、集合框架(泛型方法)

[java] view plaincopy
  1. /* 
  2. 泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象 
  3. 明确要操作的具体类型后,所有方法要操作的类型就已经固定了。 
  4.  
  5. 为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定 
  6. 义在方法上。 
  7.  
  8. */  
  9.   
  10. /* 
  11. class Demo<T> 
  12. { 
  13.     public void show(T t) 
  14.     { 
  15.         System.out.println("show:"+t); 
  16.     } 
  17.     public void print(T t) 
  18.     { 
  19.         System.out.println("print:"+t); 
  20.     } 
  21.  
  22. } 
  23. */  
  24. class Demo  
  25. {  
  26.     public <T> void show(T t)  
  27.     {  
  28.         System.out.println("show:"+t);  
  29.     }  
  30.     public <Q> void print(Q q)  
  31.     {  
  32.         System.out.println("print:"+q);  
  33.     }  
  34.   
  35. }  
  36. class GenericDemo4   
  37. {  
  38.     public static void main(String[] args)   
  39.     {  
  40.         Demo d=new Demo();  
  41.   
  42.         d.show("haha");  
  43.         d.show(new Integer(4));  
  44.         d.print("hehe");  
  45.     }  
  46. }  


十、集合框架(静态方法泛型)

[java] view plaincopy
  1. /* 
  2. 特殊之处: 
  3. 静态方法不可以访问类上定义的泛型。 
  4. 如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。 
  5.  
  6. */  
  7.   
  8. class Demo<T>  
  9. {  
  10.     public void show(T t)  
  11.     {  
  12.         System.out.println("show:"+t);  
  13.     }  
  14.     public <Q> void print(Q q)  
  15.     {  
  16.         System.out.println("print:"+q);  
  17.     }  
  18.     public static <W> void method(W t)  
  19.     {  
  20.         System.out.println("method:"+t);  
  21.     }  
  22.   
  23. }  
  24. class GenericDemo4   
  25. {  
  26.     public static void main(String[] args)   
  27.     {  
  28.         Demo<String> d=new Demo<String>();  
  29.   
  30.         d.show("haha");  
  31.         //d.show(new Integer(4));  
  32.         d.print(1234);  
  33.         Demo.method("123456");  
  34.     }  
  35. }  


十一、集合框架(泛型接口)

[java] view plaincopy
  1. /* 
  2. 泛型定义在接口上: 
  3. */  
  4. interface Inter<T>  
  5. {  
  6.     void show(T t);  
  7. }  
  8. /* 
  9. class InterImpl implements Inter<String> 
  10. { 
  11.     public void show(String t) 
  12.     { 
  13.         System.out.println("show:"+t); 
  14.     } 
  15. } 
  16. */  
  17. class InterImpl<T> implements Inter<T>  
  18. {  
  19.     public void show(T t)  
  20.     {  
  21.         System.out.println("show:"+t);  
  22.     }  
  23. }  
  24. class GenericDemo5   
  25. {  
  26.     public static void main(String[] args)   
  27.     {  
  28.         InterImpl<Integer> i=new InterImpl<Integer>();  
  29.         i.show(15);  
  30.   
  31.         /* 
  32.         InterImpl i=new InterImpl(); 
  33.         i.show("hehe"); 
  34.         */  
  35.     }  
  36. }  


十二、集合框架(泛型限定)

[java] view plaincopy
  1. /* 
  2.  
  3. ?   通配符。也可以理解为占位符。 
  4.  
  5. 泛型的限定: 
  6. ? extends E: 可以接受E类型或E的子类型。上限。 
  7. ? super E:可以接受E类型或E的父类型。 下限。 
  8.  
  9.  
  10. */  
  11. import java.util.*;  
  12. class Person  
  13. {  
  14.     private String name;  
  15.     Person(String name)  
  16.     {  
  17.         this.name=name;  
  18.     }  
  19.     public String getName()  
  20.     {  
  21.         return name;  
  22.     }  
  23. }  
  24. class Student extends Person  
  25. {  
  26.     Student(String name)  
  27.     {  
  28.         super(name);  
  29.     }  
  30.   
  31. }  
  32. class GenericDemo6   
  33. {  
  34.     public static void main(String[] args)   
  35.     {  
  36.           
  37.         ArrayList<Person> a1=new ArrayList<Person>();  
  38.         a1.add(new Person("abc1"));  
  39.         a1.add(new Person("abc2"));  
  40.         a1.add(new Person("abc3"));  
  41.         printColl(a1);  
  42.   
  43.         ArrayList<Student> a2=new ArrayList<Student>();  
  44.         a2.add(new Student("abc4"));  
  45.         a2.add(new Student("abc5"));  
  46.         a2.add(new Student("abc6"));  
  47.         printColl(a2);//ArrayList<Person> a1=new ArrayList<student>(); error  
  48.   
  49.         /* 
  50.         ArrayList<String> a1=new ArrayList<String>(); 
  51.  
  52.         a1.add("abc1"); 
  53.         a1.add("abc2"); 
  54.         a1.add("abc3"); 
  55.  
  56.         ArrayList<Integer> a2=new ArrayList<Integer>(); 
  57.  
  58.         a2.add(4); 
  59.         a2.add(5); 
  60.         a2.add(6); 
  61.          
  62.         printColl(a1); 
  63.         printColl(a2); 
  64.         */  
  65.     }  
  66.     public static void printColl(ArrayList<? extends Person> a1)//   下限:<? super Student>   
  67.     {  
  68.         Iterator<? extends Person> it=a1.iterator();  
  69.         while(it.hasNext())  
  70.         {  
  71.             System.out.println(it.next().getName());  
  72.         }  
  73.     }  
  74.   
  75.     /* 
  76.     public static void printColl(ArrayList<?> a1) 
  77.     { 
  78.         Iterator<?> it=a1.iterator(); 
  79.         while(it.hasNext()) 
  80.         { 
  81.             System.out.println(it.next()); 
  82.         } 
  83.     } 
  84.  
  85.     */  
  86.   
  87.     /* 
  88.     public static <T> void printColl(ArrayList<T> a1) 
  89.     { 
  90.         Iterator<T> it=a1.iterator(); 
  91.         while(it.hasNext()) 
  92.         { 
  93.             System.out.println(it.next()); 
  94.         } 
  95.     } 
  96.     */  
  97. }  


十三、集合框架(泛型限定2)

[java] view plaincopy
  1. /* 
  2. 集合框架(泛型限定2): 
  3. */  
  4. import java.util.*;  
  5. class Person  
  6. {  
  7.     private String name;  
  8.   
  9.     Person(String name)  
  10.     {  
  11.         this.name=name;  
  12.     }  
  13.     public String getName()  
  14.     {  
  15.         return name;  
  16.     }  
  17.     public String toString()  
  18.     {  
  19.         return "person:"+name;  
  20.     }  
  21. }  
  22. class Student extends Person  
  23. {  
  24.     Student(String name)  
  25.     {  
  26.         super(name);  
  27.     }  
  28.   
  29. }  
  30. class Worker extends Person  
  31. {  
  32.     Worker(String name)  
  33.     {  
  34.         super(name);  
  35.     }  
  36. }  
  37. class Comp implements Comparator<Person>  
  38. {  
  39.     public int compare(Person s1,Person s2)  
  40.     {  
  41.         return s1.getName().compareTo(s2.getName());  
  42.     }  
  43. }  
  44.   
  45. /* 
  46. class StuComp implements Comparator<Student> 
  47. { 
  48.     public int compare(Student s1,Student s2) 
  49.     { 
  50.         return s1.getName().compareTo(s2.getName()); 
  51.     } 
  52. } 
  53. class WorkerComp implements Comparator<Worker> 
  54. { 
  55.     public int compare(Worker s1,Worker s2) 
  56.     { 
  57.         return s1.getName().compareTo(s2.getName()); 
  58.     } 
  59. } 
  60.  
  61. */  
  62. class GenericDemo7  
  63. {  
  64.     public static void main(String[] args)   
  65.     {  
  66.           
  67.         TreeSet<Student> ts=new TreeSet<Student>(new Comp());  
  68.           
  69.         ts.add(new Student("abc03"));  
  70.         ts.add(new Student("abc02"));  
  71.         ts.add(new Student("abc09"));  
  72.         ts.add(new Student("abc07"));  
  73.   
  74.         Iterator<Student> it=ts.iterator();  
  75.           
  76.         while(it.hasNext())  
  77.         {  
  78.             System.out.println(it.next().getName());  
  79.         }  
  80.   
  81.           
  82.   
  83.   
  84.         TreeSet<Worker> ts1=new TreeSet<Worker>(new Comp());  
  85.           
  86.         ts1.add(new Worker("abc..19"));  
  87.         ts1.add(new Worker("abc..17"));  
  88.         ts1.add(new Worker("abc..13"));  
  89.         ts1.add(new Worker("abc..15"));  
  90.           
  91.         Iterator<Worker> it1=ts1.iterator();  
  92.           
  93.         while(it1.hasNext())  
  94.         {  
  95.             System.out.println(it1.next().getName());  
  96.         }  
  97.     }  
  98. }  
0 0
原创粉丝点击