您的位置:首页 > 编程语言 > Java开发

圣思园-----Java SE Lesson 7

2011-12-30 11:17 225 查看
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. 集成泛型类型,实现泛型接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: