Head First Java笔记(七)
来源:互联网 发布:php图书管理系统下载 编辑:程序博客网 时间:2024/06/06 00:09
集合与泛型
Treeset:以有序状态保持并可防止重复
HashMap:可用成对的name/value来保存与取出
LinkedList:针对经常插入或删除中间元素所涉及的高效率集合(实际上ArrayList比较实用)
HashSet:防止重复的集合,可快速地找寻相符的元素。
LinkedHashMap:类似HashMap,但可记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序。
泛型:可以写出有类型安全性的集合。
泛型:
1.创建被泛型化类的实例:必须制定他所容许的对象
new ArrayList<Song>()2.声明与指定泛型类型的变量
List<Song> songList = new ArrayList<Song>();3.声明(与调用)取用泛型类型的方法
void foo(List<Song list)x.foo(songList)
使用泛型的类
ArrayList的说明文件
public class ArrayList<E> extends AbstractList<E> implements List<E? ...{ public boolean add(E o)//E用来指示可以加入ArrayList的元素类型...}E会用你所声明与创建的真正类型来取代。
运用泛型的方法
1.使用定义在类声明的类型参数
public class ArrayList<E> extends AbstractList<E>...{ public boolean add(E o)2.使用未定义在类声明的类型参数
public <T extends Animal> void takeThing(ArrayListt<T> list)<T extends Animal>是方法声明的一部分,表示任何被声明为Animal或Animal的子型的ArrayList是合法的。
对泛型来说,extends这个关键词,代表“”“是一个...”,且适用于类和接口。
想把ArrayList<Song>传给sort()方法,Song类要实现Comparable
如果传Comparator给sort()方法,则排序是由Comparator而不是元素的compareTo()方法来决定
对象要怎样才算相等?
1.引用相等性
堆上同一对象的两个引用是相等的。如果对两个引用调用hashCode(),你会得到相同的结果。
如果想要知道两个引用是否相等,可以使用==来比较变量上的字节组合。
2.对象相等性
堆上的两个不同的对象在意义上是相同的。
如果你想要把两个不同的Song对象视为相等的,就必须覆盖过从Object继承下来的hashCode()方法与equals()方法。
要让Set把对象视为重复的,必须使equals方法返回true,hashCode返回相同的值。
HashSet如何检查重复:
1.首先比较加入对象的hashCode与已有对象的hashCode,若相异,则假设对象不可能是相同的
2.若找到相同hashcode的两个对象,会调用其中一个的equals来检查是否真的相同
HashSet使用hashcode来达成存取速度较快的存储方法。
hashCode()与equals()的相关规定
1.如果两个对象相等,则hashcode必须也相等
2.如果两个对象相等,对其中一个对象调用equals()必须返回true,
3.若两个对象与相同的hashcode值,他们也不一定是相等的。但若两个对象相等,则hashcode一定相等
4.若equals()被覆盖过,则hashCode必须被覆盖
5.hashCode()默认行为是对在heap上的对象产生独特的值。若你没有override过hashCode(),则该class的两个对象怎样都不会被认为是相同的
6.equals的默认行为是执行==比较,也就是说回去测试,两个引用是否堆上heap上同一个对象。如果equals()没有被覆盖过,两个对象永远都不会被视为相同的,因为不同的对象有不同的字节组合。
a.equal(b)必须与a.hashCode()==b.hashCode()等值
但a.hashCode()==b.hashCode()不一定要与a.equals()等值。
想要保持有序,使用TreeSet
使用TreeSet条件:
1.集合中的元素必须是有实现Comparable的类型
class Book implements Comparable { String title; public Book(String t) { title = t; } public int compareTo(Object b) { Book book = (Book) b; return (title.compareTo(book.title)); }}
2.或使用重载,取用Comparator参数的构造函数来创建TreeSet
public class BookCompare implements Comparator<Book>{ public int compare(Book one, Book two) { return (one.title.compareTo(two.title)); }}class Test { public void go() { Book b1 = new Book("HOw Cats Work"); Book b2 = new Book("Remix your BOdy"); Book b3 = new Book("Finding Emo"); BookCompare bCompare = new BookCompare(); TreeSet<Book> tree = new TreeSet<Book>(bCompare); tree.add(b1); tree.add(b2); tree.add(b3); system.out.println(tree); }}
使用万用字符:
可以操作集合元素,但不能新增集合元素,如此才能保障执行期间的安全性。
public <T extends Animal > void rakeThing(ArrayList<T> list)public void takeThing(ArrayList<? extends Animal> list)
0 0
- Head First Java笔记(七)
- Head First Java 六 七
- Head First Java笔记(1)基本概念
- Head First Java笔记(一)
- Head First Java笔记(二)
- Head First Java笔记(三)
- Head First Java笔记(四)
- Head First Java笔记(五)
- Head First Java笔记(六)
- Head First Java笔记(八)
- Head First Java笔记(九)
- 《Head First Java》笔记(1)
- 《Head First Java》笔记(2)
- 《Head First JAVA》学习笔记(一)
- 《Head First JAVA》学习笔记(二)
- <<head first java>>学习笔记
- 【note】Head First Java笔记
- head first java学习笔记
- 化简-HDU-5734-Acperience
- 开发调试必备Fiddler
- java中的设计模式学习
- 顺时针打印矩阵
- 7.11 打印以下图案
- Head First Java笔记(七)
- android/widget/EditText : Unsupported major.minor version 52.0
- boost执行http的GET请求
- 几种数据库的分页
- windows安装服务
- Data truncation: Truncated incorrect DOUBLE value
- Linux入门(二)-常用命令
- 1036. 跟奥巴马一起编程(15)
- C++模板定义和实现分离导致的编译错误