集合与泛型
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)