1. 有这样一个类:

// getter and setter
要求:假如有若干个类 Person 对象存在一个 List 当中,对他们进行排序,分别按照名字、年龄、 id 进行排序(要有正序与倒序两种排序方式)。假如年龄或者姓名重复,按照 id的正序进行排序。 要求使用策略模式进行 。
2. HashSet 底层是使用 HashMap 实现的。当使用 add 方法将对象添加到 Set 当中时,实际上是将该对象作为底层所维护的 Map 对象的 key ,而 value 则都是同一个 Object 对象(该对象我们用不上);
3. HashMap 底层维护一个数组,我们向 HashMap 中所放置的对象实际上是存储在该数组当中;
4. 当向 HashMap 中 put 一对键值时,它会根据 key 的 hashCode 值计算出一个位置,该位置就是此对象准备 往数组中存放的位置。
5. 如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找( Entry 类有一个 Entry 类型的 next 成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用 equals 方法进行比较,如果对此链上的某个对象的 equals 方法比较为 false ,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。
6. HashMap 的内存实现布局:

7. 所谓泛型:就是变量类型的参数化。
8.限制泛型可用类型
在定义泛型类别时,预设可以使用任何的类型来实例化泛型类型中的类型,但是如果想要限制使用泛型类别时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口。
当没有指定泛型继承的类型或接口时,默认使用T extends Object,所以默认情况下任何类型都可以作为参数传入。
9. 类型通配声明:
現在您有這麼一個需求,您希望有一個參考名称foo可以接受所有下面的实例
foo = new GenericFoo<ArrayList>(); foo = new GenericFoo<LinkedList>();
简单的说,实例化类型持有者时,它必須是实现List的类别或其子类别,要定义这样一个名称,您可以使用‘?’通配字元,并使用“extends”关键字限定类型持有者的型态。
GenericFoo<? extends List> foo = null;
foo = new GenericFoo<ArrayList>();
foo = new GenericFoo<LinkedList>();
使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
10. 集成泛型类型,实现泛型接口。