Updated 2014/04/09 P518--P581

<数据结构>

ArrayList不能排序;TreeSet以有序状态保持并可防止重复。HashMap可用成对的name/value来保存与取出。LinkedList是针对经常插入或删除中间元素所设计的高效率集合。HashSet是防止重复的集合,可快速地寻找相符的元素。LinkedHashMap:类似HashMap,但可记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序。

Collections类: public static void sort(List list)  =====可以传ArrayList进去

泛型意味着更好的类型安全性。

一般都是集合用到泛型,e.g 用到泛型的类(ArrayList)

public class ArrayList<E> extends AbstractList<E> implements List<E> …{

public Boolean add( E o)   à这里的E用来指示可以加入ArrayList的元素类型

}

E部分会用你所声明与创建的真正类型来取代。ArrayList是AbstractList的子类,所以指定给ArrayList的类型会自动地用在AbstractList上。E类型也会用在List这个借口上。

以泛型的观点来说,extends这个关键词代表”是一个……”;extend代表extend或implement.

让对象实现Comparable类,就可以将该对象的集合传入Collection.sort()方法中。

Comparable类:

public interface Comparable<T>{    int compareTo(T o);}

Sort的另外一个重载方法:

Sort(List<T> list, Comparator<? super T> e)

public interface Comparator<T> { int compare(T o1, T o2);  }

使用compareTo()方法时,List中的元素只能有一种将自己与同类型的另一个元素作比较的方法,但Comparator是独立于所比较元素类型之外的—它是独立的类

调用单一参数的sort(List o)方法代表由list元素上的compareTo()方法来决定顺序。因此元素必须要实现Comparable这个接口。   调用sort(List o, Coparator c)方法代表不会调用list元素的compareTo()方法,而会使用Comparator的compare()方法。这意味着list元素不需要实现Comparable。

从Collection的API说明文件中我们发现3个主要的接口:List/Set/Map

1)  List是一种知道索引位置的集合。知道某物在系列集合中的位置。可以有多个元素引用相同的对象。

2)  Set不允许重复的集合。知道某物是否已经存在于集合中。不会有多个元素引用相同的对象(被认为相等的两个对象也不行)

3)  Map使用成对的键值和数据值。Map会维护与key有关联的值。两个key可以引用相同的对象,但key不能重复,典型的key会是String,但也可以是任何对象。

HashSet如何检查重复: equals()和hashCode()。默认情况下为引用相等性。如果想把两个不同的对象视为相等的,就必须覆盖从Object继承下来的hashCode()与equals()方法。

对象的状态制定规则

1)  如果两个对象相等,则a.equals(b) && a.hashCode() == b.hashCode()

2)  若两个对象有相同hash值,他们不一定相等

3)  若equals()被覆盖过,则hashCode()也必须被覆盖。

4)  hashCode()的默认行为是对在heap上的对象产生独特的值,如果你没有override过hashCode(),则该class的两个对象怎样都不会被认为是相同的。

5)  equals()的默认行为是执行==的比较。也就是说会去测试两个引用是否对上heap上同一个对象。如果equals()没有被覆盖过,两个对象永远都不会被视为相同的,因为不同的对象有不同的字节组合。

6)  hashCode是用来缩小寻找成本,最后还是要用equals()才能认定是否真的找到相同的项目。

如果想要保持元素不重复且有序,使用TreeSet

要使用TreeSet,下列其中一项必须为真。

  1. 集合中的元素必须是要实现Comparable的类型。
  2. 使用重载,取用Comparator参数的构造函数来创建TreeSet。

HashMap<String, Integer> scores = new HashMap<String, Integer>();

scores.put(“Kathy”,42);

如果把方法声明成取用ArrayList<Animal>,它就只会取用ArrayList<Animal>参数,ArrayList<Dog>与ArrayList<Cat>都不行。但是当参数为普通的数组时,e.g Animal[] animal,传入dog数组编译却能通过,这是因为数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间,所以在以下情况下编译不会出错,但是运行时会报错。

public void go(){

Dog[] dogs = {new Dog(), new Dog(), new Dog()};

takeAnimals(dogs);

}

public void takeAnimals(Animal[] animals){

animals[0] = new Cat();

}

如何才能传入Animal子型参数呢??使用万用字符

public void takeAnimals(ArrayList<? extends Animal> animals){

for(Animal a: animals){

a.eat();

}

}

这里的extends同时代表继承和实现。

在方法参数中使用万用字符时,编译器会阻止任何可能破坏引用参数所指集合的行为。你能够调用list中任何元素的方法,但不能加入元素。也就是说,你可以操作集合元素,但不能新增集合元素,如此才能保障执行期间的安全性,因为编译器会阻止执行期的恐怖行动。所以下面这个程序是可以的:

for(Animal a: animals){             a.eat();     }

但这个就过不了编译: animals.add(new Cat());

与万用字符等价的另一方法:

public <T extends Animal> void takeThing(ArrayList<T> list);

《head first java 》读书笔记(四)的更多相关文章

  1. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  2. JAVA编程思想读书笔记(五)--多线程

    接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...

  3. JAVA编程思想读书笔记(二)--容器

    接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...

  4. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  5. Java编程思想读书笔记之内部类

    现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...

  6. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  7. <Java编程思想>读书笔记(1)-对象导论、一切都是对象

    1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...

  8. Java编程思想读书笔记(二)【一切都是对象】

    begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...

  9. Java编程思想读书笔记

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. java编程思想读书笔记三(11-21)

    十一:持有对象 >持有对象实例 ●数组将数字与对象联系起来.它保存类型明确的对象,查询对象时,不需要对结果做类型转换.他可以是多维的. 可以保存基本的数据类型.但是,数组一旦生成,容量就不会在变 ...

随机推荐

  1. php面向对象的基础:创建OOP的类和字段

    类的创建 class Computer{ //类的字段(成员) //类的方法 } 对象的声明 $computer = new Computer(); new标识符是为了在内存中创建一个对象(实例),而 ...

  2. WCF之绑定

    NameSpace+Name作为服务元数据的唯一标示.BindingElement描述Binding的特征. 绑定表示通信信道的配置,定义C/S间的协议. 分为:传输信道(TCP,HTTP…),消息编 ...

  3. 一个简单的Spring测试的例子

    在做测试的时候我们用到Junit Case,当我们的项目中使用了Sring的时候,我们应该怎么使用spring容器去管理我的测试用例呢?现在我们用一个简单的例子来展示这个过程. 1 首先我们新建一个普 ...

  4. Codevs 2837 考前复习

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Aiden马上要考试了,可他还没怎么复习,于是他 ...

  5. Template_17_metaprogram

    1,模板实例化机制是一种基本的递归语言机制,可以用于在编译期执行复杂计算.2,枚举值和静态常量在原来的C++编译器中,在类声明的内部,枚举值是声明"真常值"(常量表达式)的唯一方法 ...

  6. iPhone Tableview分批显示数据

    //非原创   iPhone Tableview分批显示数据是本文要介绍的内容,主要讲解的是数据的显示.iPhone屏幕尺寸是有限的,如果需要显示的数据很多,可以先数据放到一个table中,先显示10 ...

  7. 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

    下载2007 Office system 驱动程序:数据连接组件安装 http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b ...

  8. DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了. 一.GlobVar.pas单元,定义应用系统全局数据类型及变量: unit GlobVar; interface uses System ...

  9. Django模版进阶

    # -*- coding: utf-8 -*-from django.shortcuts import renderdef home(request): string = "测试" ...

  10. [转]init.d解析

    本文为转载,放在这里以备忘. init.d指的是/etc/rc.d/init.d目录.本文包括3部分内容1. Linux的引导过程2. 运行级别3. /etc/rc.d/ 与/etc/rc.d/ini ...