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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发越来越少怎么办 用什么好呢 头发油掉头发怎么办吃什么药好 生完孩子三个月掉头发很厉害怎么办 电夹板夹头发现在掉头发怎么办 刚剪完的头发前面短后面长怎么办 头发太多太厚怎么办_百度经验 米诺地尔搽剂喷在头皮上痛怎么办 米诺地尔擦了头皮痒怎么办 头发又细又少一天不洗就油怎么办 头又尖头发又细又少不知怎么办 蘑菇头发型留长尴尬期怎么办 月经期间洗了下头量很少了怎么办 宝宝喝了有沐浴露的洗澡水怎么办 4个月宝宝头发长的慢怎么办 宝宝不小心吃了自己拉的屎怎么办 手机不小心弄成耳机模式怎么办 苹果手机不小心按了丢失模式怎么办 苹果手机不小心调成耳机模式怎么办 不小心把图书馆的书弄坏了怎么办 不小心把图书馆书拿出来了怎么办 八个月宝宝吃母乳缺铁怎么办 大头笔写的字褪色了怎么办 小画板用记号笔画了擦不下来怎么办 新换的大灯和原大灯有色差怎么办? 微信信息写好没有发送两字怎么办 3d模型导进去 材质丢失怎么办 3d模型导入材质没了怎么办 淘宝上的电视尺寸与实际不符怎么办 医师面试题号忘了写怎么办 淘宝买东西东西被别人拿走了怎么办 9个月宝宝上肢支撑不好怎么办 宝宝快十一个月了留口水怎么办 两岁宝宝不会自己登着大小便怎么办 小新家的房子被炸了房贷怎么办 怀孕8个月感冒鼻窦炎头疼怎么办 买的全身镜下面的框子坏了怎么办 单位上司姐姐每天要接我上班怎么办 企业微信公众号中的文章边框怎么办 怎么办我在数学答题卡上画了分割线 游泳的时候泳裙飘起来怎么办 两岁宝宝误服了酵素梅怎么办