码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员__集合_List_Set_泛型

时间:2015-05-12 09:23:57      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:黑马程序员   编程   java   集合   



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



<集合>


1.集合:集合可以理解为一种容器, 长度可变, 可以存储任意类型的对象。

2.集合的分类:

   集合框架的构成及分类:

技术分享

   单列集合:Collection,双列集合:Map。

        1).Collection有两个子接口分别是List、Set。
        List: 可重复, 有存储顺序,有索引
               ArrayList
               LinkedList
               Vector 

         Set: 不可重复, 没索引,存取无序
                HashSet  
                TreeSet   
                LinkedHashSet HashSet的子类

           2).Map双列集合
                HashMap
                TreeMap
                Hashtable
                LinkedHashMap

3.数组和集合的区别
            1).数组既可以存储基本数据类型,也可以存储引用数据类型,存储基本数据类型存储值,存储引用数据类型存储的是地址值,集合只能存储引用数据类型。
            2).数组的长度一旦初始化就不可以改变
                集合的长度是可变的。

4.集合的常用方法
  add(Object obj)    向集合中添加一个元素到最后的位置 
  get(int index)        获取集合中指定位置的元素
  size()                    获取集合的长度
  add(int index, Object obj)  向集合中添加一个元素到指定位置
  set(int index, Object obj)   把集合中指定位置的元素替换
  remove(int index)               删除集合中指定位置的元素
  remove(Object obj)            删除集合中包含的obj对象
 

<List>

1.List有三个子类:ArrayList,LinkedList,Vector。
   1).ArrayList
       底层数据结构是数组,查询和修改快,增删慢,线程不安全,效率高。
       Vector
       底层数据结构是数组,与ArrayList相比线程安全,效率低。
       LinkedList
      底层数据结构是链表,查询和修改慢,增删快,线程不安全,效率高。
      LinkedList
可以很方便的操作头和尾。

2.迭代集合
      for循环:  从0循环到集合的size()-1, 每次获取其中一个
      迭代器:    调用iterator()方法获取迭代器, 使用hasNext()判断是否包含下一个元素, 使用next()获取下一个元素
      增强for循环:  for (类型 变量名 : 容器) { 循环体 } 容器中有多少个元素就执行多少次循环体, 每次循环变量指向容器中不同的元素(1.5新特性)。

[java] view plaincopy
  1. <span style="font-size:18px;">class Demo{ </span>  
[java] view plaincopy
  1. <span style="font-size:18px;">        public static void main(String[] args) {  
  2.         ArrayList list = new ArrayList();  
  3.         list.add("a");  
  4.         list.add("b");  
  5.         list.add("c");  
  6.         list.add("d");  
  7.         list.add("e");  
  8.             for(int i=0;i<list.size();i++){</span>  
[java] view plaincopy
  1. <span style="font-size:18px;">                  System.out.println(list.get(i));} </span>  
[java] view plaincopy
  1. <span style="font-size:18px;">  
  2.         ListIterator lit = list.listIterator();  
  3.                 while(lit.hasNext()) {  
  4.             System.out.println(lit.next());  
  5.         }}</span>  
[java] view plaincopy
  1. <span style="font-size:18px;">           for(Object obj : list){</span>  
[java] view plaincopy
  1. <span style="font-size:18px;">                System.out.println(obj);}  
  2.         }}</span>  

3.删除

[java] view plaincopy
  1. public class Demo7_Delete {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         //demo1();  
  8.         ArrayList list = new ArrayList();  
  9.         list.add("a");  
  10.         list.add("a");  
  11.         list.add("b");  
  12.         list.add("b");  
  13.         list.add("c");  
  14.         list.add("d");  
  15.           
  16.         /*for(int i = 0; i < list.size(); i++) { //普通for循环可以删除,删除的时候索引要--         
  17.             Object obj = list.get(i); 
  18.             if(obj.equals("a")) { 
  19.                 list.remove(i--); 
  20.             } 
  21.         }*/  
  22.         Iterator it = list.iterator();  
  23.         while(it.hasNext()) {           //迭代可以删除,但是必须用迭代器的删除方法  
  24.             Object obj = it.next();     //如果用集合的删除方法,会出现并发修改异常ConcurrentModificationException  
  25.             if(obj.equals("b")) {  
  26.                 //list.remove("b");    //错误  
  27.                 it.remove();  
  28.             }  
  29.         }  
  30. }  

普通for删除

技术分享



<泛型>(1.5版本的新特性)



 1.泛型能将运行时期的错误,转移到了编译时期,去除黄色警告提示,但是只能放该类型或该类型的子类型对象,其他的都不允许放
  

[java] view plaincopy
  1. public static void main(String[] args) {  
  2.         demo1();  
  3.         ArrayList<Integer> list = new ArrayList<>();        //1.7新特性,菱形泛型  
  4.         list.add(123);  
  5.           
  6.         System.out.println(list);  
  7.     }  
  8.   
  9.     private static void demo1() {  
  10.         ArrayList<Person> list = new ArrayList<Person>();  
  11.         list.add("a");  
  12.         list.add(123);  
  13.         Iterator<Person> it = list.iterator();  
  14.         while(it.hasNext()) {  
  15.             Person p = it.next();  
  16.             System.out.println(p.getName() + "..." + p.getAge());  
  17.         }  
  18.     }  
  19.   
  20. }  

<Set>

1.Set      不可重复, 没索引,无序
         HashSet               使用哈希算法去重复, 效率高, 但元素无序
         TreeSet                TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
         LinkedHashSet HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序

2.HashSet(LinkedHashSet)
 1).HashSet原理
  我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数。当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象。如果没有哈希值相同的对象就直接存入集合。 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。
 2).将自定义类的对象存入HashSet去重复
     类中必须重写hashCode()和equals()方法。hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)。 equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。

[java] view plaincopy
  1. ublic class Person implements Comparable<Person> {   //往TreeSet集合添加自定义类,自定义类需实现Comparable接口  
  2.   
  3.     private String name;  
  4.     private int age;  
  5.     public Person(){  
  6.         super();  
  7.     }  
  8.     public Person(String name, int age) {  
  9.         super();  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.     @Override  
  26.     public String toString() {  
  27.         return "Person [name=" + name + ", age=" + age + "]";  
  28.     }  
  29.     @Override  
  30.     public int hashCode() {                   //重写hashCode的方法  
  31.         final int prime = 31;  
  32.         int result = 1;  
  33.         result = prime * result + age;  
  34.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  35.         return result;  
  36.     }  
  37.     @Override  
  38.     public boolean equals(Object obj) {         //重写equals的方法  
  39.         if (this == obj)  
  40.             return true;  
  41.         if (obj == null)  
  42.             return false;  
  43.         if (getClass() != obj.getClass())  
  44.             return false;  
  45.         Person other = (Person) obj;  
  46.         if (age != other.age)  
  47.             return false;  
  48.         if (name == null) {  
  49.             if (other.name != null)  
  50.                 return false;  
  51.         } else if (!name.equals(other.name))  
  52.             return false;  
  53.         return true;  
  54.     }  
  55.     @Override  
  56.     public int compareTo(Person o){            //重写compareTo方法  
  57.         int num=this.age-o.age;  
  58.         return num==0?this.name.compareTo(o.name):num;  
  59.           
  60.           
  61.     }  


  3).迭代
    调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    增强for循环, 只要可以使用Iterator的类都可以用

[java] view plaincopy
  1. class Demo{  
  2. public static void main(System[] args){  
  3. HashSet<Person> hs = new HashSet<>()  
  4. hs.add(new Person("张三"),23);  
  5. hs.add(new Person("李四"),24);  
  6. hs.add(new Person("王五"),25);  
  7. hs.add(new Person("赵六"),26);  
  8. Iterator<Person> it = hs.iterator();  
  9. while(it.hasNext()){  
  10. System.out.println(it.next());}  
  11. }  
  12. }  
  13. for(Person p : hs){           //增强for循环  
  14. System.out.println(p);  
  15. }  



4.TreeSet
 1).TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列.
 2).使用方式
     自然顺序(Comparable)
      TreeSet类的add()方法中会把存入的对象提升为Comparable类型,调用对象的compareTo()方法和集合中的对象比较,根据compareTo()方法返回的结果进行存储。
    比较器顺序(Comparator)
    创建TreeSet的时候可以制定 一个Comparator,如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
   add()方法内部会自动调用Comparator接口中compare()方法排序
    两种方式的区别
   TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序,TreeSet如果传入Comparator, 就优先按照Comparator

[java] view plaincopy
  1. class Demo{  
  2. TreeSet<Person> ts = new TreeSet<>(new Comparator(){  
  3. public int compare(Person p1 , Person p2){  
  4. int num = p1.name.compare(p2.namm);  
  5. return num==0?p1.age-p2.age:num}});  
  6. ts.add("张三"23);  
  7. ts.add("李四"24);  
  8. ts.add("王五"25);  
  9. ts.add("赵六"26);  
  10. System.out.println(ts);}  

黑马程序员__集合_List_Set_泛型

标签:黑马程序员   编程   java   集合   

原文地址:http://blog.csdn.net/haojude/article/details/45654605

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!