Java 集合

Java 集合


1.

2. Collection 接口存储一组不唯一,无序的对象;

3. List 接口存储一组不唯一,有序(插入顺序)的对象

4. Set 接口存储一组唯一,无序的对象

5. 所有放到List中的都是Object,取出时必须强制类型转换(强转时记得判断instanceof).

6. List中有许多方法是unchecked异常,可能抛出,使用时一定要记得提前判断传入参数,尽量try…catch,捕获到异常时输出异常信息.

7. List中的add()方法返回是boolean,在内存不够用时会返回失败false.

8. List避免重复,插入之前判断contains().

9. Set无法随机访问,必须使用迭代器遍历.

10. Set使用对象equals()方法判断两个对象是不是同一个对象;如果你重写了equals()方法,那么一定要记得重写hashCode()方法!
两对象的hashcode相等不一定两个对象equals;但是如果两个对象equals,那么两个对象的hashcode一定相等;

11. equals()方法注意事项


a. 自反性:对于任何值x, x.equals(x) 都应返回 true。

b. 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

c. 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

d. 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

e. 对于任何值x ,x.equals(null) 都应返回 false。

12. 另外一个常用的列表类是Vector类,它也实现了List接口,可以实现ArrayList的所有操作


Vector和ArrayList的异同:

1.实现原理、功能相同,可以互用

2.主要区别:

Vector线程安全操作相对较慢

ArrayList重速度轻安全,线程非安全

长度需增长时,Vector默认增长一倍,ArrayList增长50%

Vector可以使用capacity()方法获取实际的空间



13. 当我们在使用形如HashMap、HashSet、HashTable等以Hash开头的集合类时,hashCode()会被隐式调用以来创建哈希映射关系。

14. 所有用于判断相等的字段在hashCode中都要使用

15. hashCode方法的模板:


public int hashCode() {
    final int PRIME1 = 13; //这里最好是定义成类的属性,最好是素数
    final int PRIME2 = 17;
    …
    int result= 1;
    result = PRIME1 * property1;
    result += PRIMER2 * property2;
    return result;
}
  1. equals重写的模板:(这里引用:http://blog.csdn.net/min123456520/article/details/5194030)

    /*
     * 重写equals必须注意:
      *   1 自反性:对于任意的引用值x,x.equals(x)一定为true
      *   2  对称性:对于任意的引用值x 和 y,当x.equals(y)返回true,y.equals(x)也一定返回true
      *   3 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也一定返   回 true
       *  4 一致性:对于任意的引用值x 和 y,如果用于equals比较的对象信息没有被修改,
       *           多次调用x.equals(y)要么一致地返回true,要么一致地返回false
       *  5 非空性:对于任意的非空引用值x,x.equals(null)一定返回false
       * 
       * 请注意:
       * 重写equals方法后最好重写hashCode方法,否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
      */
    
    
     /*
      *  1.重写equals方法修饰符必须是public,因为是重写的Object的方法.
         *  2.参数类型必须是Object.
      */ 
     public boolean equals(Object other){   //重写equals方法,后面最好重写hashCode方法
    
      if(this == other)    //先检查是否其自反性,后比较other是否为空。这样效率高
       return true;
      if(other == null)         
       return false;
      if( !(other instanceof Cat))
       return false;
    
      final Cat cat = (Cat)other;
    
      if( !getName().equals(cat.getName()))
       return false;
      if( !getBirthday().equals(cat.getBirthday()))
       return false;
      return true;
     }
    
  2. hashCode()方法重写的模板:(这里引用:http://blog.csdn.net/min123456520/article/details/5194030)

     public int hashCode(){                 //hashCode主要是用来提高hash系统的
    //查询效率。当hashCode中不进行任何操作时,可以直接让其返回 一常数,或者不进行重写。
      int result = getName().hashCode();
      result = 29 * result +getBirthday().hashCode();
      return result;
      //return 0;
     }
    

posted @ 2016-12-29 15:09  潇风寒月  阅读(7)  评论(0)    收藏  举报