第七章 泛型与集合

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)   HashMapHashSetHashtableLinkedHashMap以及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()可以是truefalse,false将产生更好的效率

(19)   瞬态变量不适合于equals()hashCode()方法

2.集合

(1)       常见集合操作包括:添加对象、删除对象、验证对象内容、检索对象和迭代对象

(2)       “collection”3种含义:A.集合。表示一种数据结构,对象存储在其中;B.Collection.java.util接口,SetList扩展自它;C.Collections。一个类,它拥有静态集合实用工具方法

(3)       集合4种基本形式包括:List(它是ordered,允许重复,带有索引)Set(是也可不是ordered的和/sorted,但不允许重复)Map(具有健,可以是也可以不是ordered的和/sorted,但不允许重复的键)Queue(根据FIFO原则或优先权排序)

(4)       集合的4种基本子类型是:Sorted(sorted的顺序迭代遍历集合)UnsortedOrdered(以一种特定的、非随机的顺序迭代遍历集合)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,TreeSetTreeMap具有新的导航方法,比如floor()higher()

(8)       可以创建/扩展TreeSetTreeMap后备子副本

5.排序和查找数组与List

(1)       排序可以按自然顺序,也可通过一个Comparable或多个Comparator进行

(2)       使用compareTo()实现Comparable,但只提供一种排序顺序

(3)       创建多个Comparator来以多种方式排序类,实现compare()

(4)       要进行排序和查找,List的元素必须是可比较的

(5)       要进行查找,数组和List必须首先进行排序

6.实用工具类:CollectionsArrays

(1)       这两个java.util类都提供:A.sort()方法,使用Comparator或自然顺序进行排序B.binarySearch()方法,查找预先排序的数组或List

(2)       Arrays.asList()根据数组创建List,并将二者链接起来

(3)       Collections.reverse()颠倒List中元素的顺序

(4)       Collections.reverseOrder()返回以反序排序的Comparator

(5)       ListSet具有创建数组的toArray()方法

7.泛型

(1)       泛型在Collections(或用泛型类型参数声明的其它类和方法)上强加编译时类型安全

(2)       一个ArrayList<Animal>讷讷个够接受类型为DogCat或任何其它的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>{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值