Head First Java笔记(七)

集合与泛型

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值