1.重写hashCode()和equals()
(1) Equals()、hashCode()和toString()是公共方法
(2) 重写toString(),使System.out.println()或其它方法能够看到一些有用的内容,比如对象的状态
(3) 使用==来判断两个引用变量是否引用了同一个对象
(4) 使用equals()来判断两个对象在意义上是否等价
(5) 如果不重写equals()方法,则对象将不会是有用的哈希键
(6) 如果不重写equals()方法,则不同的对象不能认为是等价的
(7) String和包装器重写了equals(),从而得到了良好的哈希键
(8) 当重写equals()时,应使用instanceof运算符以确保计算适当的类
(9) 当重写equals()时,应比较对象的有意义的属性
(10) equals()规则的重点:A.自反性:x. equals(x)为true;B.对称性:如果x. equals(y)为true,则y. equals(x)一定也为true;C.传递性:如果x. equals(y)为true, y. equals(z)也为true,则z.equals(x)为true;D.一致性:多次调用x.equals(y)将返回同一个结果;E.Null:如果x不为null,则x.equals(null)为false
(11) 如果x.equals(y)为true,则x.hashCode()==y.hashCode()为true
(12) 如果重写equals(),则应该重写hashCode()
(13) HashMap、HashSet、Hashtable、LinkedHashMap以及LinkedHashSet使用了哈希法
(14) 有效的hashCode()重写将键平均分布在它的桶之间
(15) 重写equals()必须至少像它的hashCode()对应部分一样精确
(16) 对于迭代:如果两个对象相等,则它们的哈希码也必须相等
(17) 对于所有实例,hashCode()方法返回同一个值是合法的(实践中效率很低)
(18) hashCode()规则的重点:A. 一致性:多次调用x.hashCode()会返回同一个整数;B. 如果x.equals(y)为true,则x.hashCode()==y.hashCode()为true;C. 如果x.equals(y)为false,则x.hashCode()==y.hashCode()可以是true或false,但false将产生更好的效率
(19) 瞬态变量不适合于equals()和hashCode()方法
2.集合
(1) 常见集合操作包括:添加对象、删除对象、验证对象内容、检索对象和迭代对象
(2) “collection”的3种含义:A.集合。表示一种数据结构,对象存储在其中;B.Collection.java.util接口,Set和List扩展自它;C.Collections。一个类,它拥有静态集合实用工具方法
(3) 集合4种基本形式包括:List(它是ordered的,允许重复,带有索引)、Set(是也可不是ordered的和/或sorted的,但不允许重复)、Map(具有健,可以是也可以不是ordered的和/或sorted的,但不允许重复的键)和Queue(根据FIFO原则或优先权排序)
(4) 集合的4种基本子类型是:Sorted(以sorted的顺序迭代遍历集合)、Unsorted、Ordered(以一种特定的、非随机的顺序迭代遍历集合)和Unordered
(5) 排序可以按字母、数字或程序员定义的标准进行
3.常见集合的主要属性
(1) ArrayList:快速迭代和快速随机访问
(2) Vector:它就像一个稍慢一些的ArrayList,但具有同步方法
(3) LinkedList:适合于向尾部添加元素,包括栈和队列
(4) HashSet:快速访问,保证没有重复,不提供任何顺序
(5) LinkedHashSet:没有重复,按照插入顺序迭代
(6) TreeSet:没有重复,按照排序的顺序迭代
(7) HashMap:最快速的更新键/值对。允许一个null键和多个null值
(8) Hashtable:就像稍慢一些的HashMap(与Vector一样,由于其同步方法)。不允许null键或null值
(9) LinkedHashMap:迭代更快,按照插入顺序或者最后访问的顺序迭代。允许一个null键和多个null值
(10) TreeMap:一种排序映射
(11) PriorityQueue:按照元素的优先级排序的”待执行任务”的列表
4.使用集合类
(1) 集合只能保存对象,但基本类型可以被自动装箱
(2) 用增强型for循环,或通过使用hasNext()和next()的迭代器进行迭代
(3) hasNext()用来判断是否还有更多的元素存在,迭代器不向前移动
(4) next()返回下一个元素并向前移动迭代器
(5) 为了正确的工作,Map的键必须重写equals()和hashCode()方法
(6) 队列使用offer()添加元素,使用poll删除队列头,使用peek()查找队列头
(7) 在java6中,TreeSet和TreeMap具有新的导航方法,比如floor()和higher()
(8) 可以创建/扩展TreeSet和TreeMap的”后备”子副本
5.排序和查找数组与List
(1) 排序可以按自然顺序,也可通过一个Comparable或多个Comparator进行
(2) 使用compareTo()实现Comparable,但只提供一种排序顺序
(3) 创建多个Comparator来以多种方式排序类,实现compare()
(4) 要进行排序和查找,List的元素必须是可比较的
(5) 要进行查找,数组和List必须首先进行排序
6.实用工具类:Collections和Arrays
(1) 这两个java.util类都提供:A.sort()方法,使用Comparator或自然顺序进行排序B.binarySearch()方法,查找预先排序的数组或List
(2) Arrays.asList()根据数组创建List,并将二者链接起来
(3) Collections.reverse()颠倒List中元素的顺序
(4) Collections.reverseOrder()返回以反序排序的Comparator
(5) List和Set具有创建数组的toArray()方法
7.泛型
(1) 泛型在Collections(或用泛型类型参数声明的其它类和方法)上强加编译时类型安全
(2) 一个ArrayList<Animal>讷讷个够接受类型为Dog、Cat或任何其它的Animal子类型(子类,或者如果Animal是一个接口,则为实现)的引用
(3) 当使用泛型集合时,从集合获取(所声明的类型的)元素不需要进行强制装换。而使用非泛型集合时,强制装换是要求的
(4) 可以将泛型集合传递到带有非泛型集合的方法,但结果可能非常糟糕。编译器不能阻止方法将错误的类型插入到以前是类型安全的集合
(5) 如果编译器能够认识到,非类型安全的代码可能会危害原来声明类型安全的东西,就会给出一个编译器错误。
(6) “编译不带错误”与”编译不带警告”是不同的。编译时的警告不被认为是一个编译错误或失败
(7) 泛型类型信息在运行时不存在——它只用于编译时安全。混合泛型与遗留代码所得到的编译后代码,在运行时可能抛出异常
(8) 多态赋值只适合于基本类型,而不是泛型类型参数
(9) 多态赋值规则适合于能够进行赋值的任何地方
(10) 通配符语法允许泛型方法,接受方法变元所声明的类型的子类型/超类型
(11) 通配符关键字extends用于表示”扩展”或”实现”。因此,在<? extends Dog>中,Dog可以是一个类,也可以是一个接口
(12) 当使用通配符时,List<? extends Dog>表示可以访问集合但不能修改它
(13) 当使用通配符时,List<? >表示任何泛型类型都可以赋给引用,但只能访问,不能修改
(14) List<Object>只引用一个List<Object>,而List<? >或List<? extends Object>能保证任何类型的对象,但只能访问
(15) 泛型的声明约定用T代表类型,E代表元素。例:A.public interface List<E> B. boolean add(E o)
(16) 泛型类型标识符可以用在类、方法和变量声明中
(17) 可以在一个声明中使用多个参数化类型
(18) 可以使用不在类中定义的类型声明泛型方法: public <T> void makeList<T t>{}