集合框架 泛型

--< java.util >-- Set接口

|--Set元素是无序(无序是指存入和取出的顺序不一定一致),元素不可以重复。、

         |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步

                    HashSet是如何保证元素唯一性的呢?

                   是通过元素的两个方法,hashCodeequals来完成

                    如果元素的hashCode值相同,才会判断equals是否为true.

                    如果元素的hashCode值不同,不会调用equals.

                   |--LinkedHashSet有序,hashset的子类。

     |--TreeSet:Set集合中的元素的进行指定顺序的排序.不同步.数据结构是二叉树。

黑马程序员_复习_Day11 - 九五二七 - 今天

 

Set集合的方法功能和Collection是一致的。

List因为有索引故多了一些方法,SetCollection一致

 

哈希表的原理:

1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。

2.哈希值就是这个元素的位置。

3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础 +1顺延???

4.存储哈希值的结构,我们称为哈希表。

黑马程序员_复习_Day11 - 九五二七 - 今天

 

注意,HashSet判断元素是否存在,及删除等操作,依赖的方法是元素的hashcodeequals

ArrayList中判断元素,删除元素只依赖equals方法,HashSet依赖两个方法,而且二次判断时才有equals

TreeSet:

黑马程序员_复习_Day11 - 九五二七 - 今天

 

黑马程序员_复习_Day11 - 九五二七 - 今天

Person实现Comparable,覆写compareTo方法

黑马程序员_复习_Day11 - 九五二七 - 今天

当主要条件相同时,比较次要条件.

完善程序:当年龄相等时,比较姓名

黑马程序员_复习_Day11 - 九五二七 - 今天

二叉树

黑马程序员_复习_Day11 - 九五二七 - 今天

 

TreeSet集合排序有两种方式,ComparableComparator区别:

1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法.

2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数.

第二种方式较为灵活。

若元素不具备比较性---自定义元素 Person类对象

或具备的比较性不是所需要的---可以让Person实现Comparable,定义age具有比较性,但现在需要不想用age排序,修改源代码风险太大

此时就需要让集合自身具备比较性

好比让集合有个刻度尺,元素A进来与集合比较一下,元素B进来与集合比较一下。

在集合初始化时,就让其具有比较方式.

定义了比较器,比较器对象作为参数传递给TreeSet集合的构造函数.

黑马程序员_复习_Day11 - 九五二七 - 今天

根据字符串长度排序

黑马程序员_复习_Day11 - 九五二七 - 今天

泛型Genericjdk1.5版本以后出现的一个安全机制。表现格式:< >

黑马程序员_复习_Day11 - 九五二七 - 今天

泛型好处

1.运行时期出现问题ClassCastException,转移到了编译时期.

  方便于程序员解决问题,让运行时问题减少,更加安全.

2.避免了强制转换麻烦。

何时写泛型呢?

  通常在集合框架中很常见.

  只要见到<>就要定义泛型.

  当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可.

泛型类:

黑马程序员_复习_Day11 - 九五二七 - 今天

何时定义泛型类?

当类中要操作的引用数据类型不确定的时候

只能是引用类型,基本类型泛型定义不了.

早期定义Object来完成扩展.现在定义泛型来完成扩展.

泛型方法:

泛型类定义的泛型,在整个类中有效.

为了让不同方法可以操作不同类型,而且类型还不确定.

那么可以将泛型定义在方法上.

黑马程序员_复习_Day11 - 九五二七 - 今天

特殊之处:

黑马程序员_复习_Day11 - 九五二七 - 今天

静态方法不可以访问类上定义的泛型.

若静态方法操作的应用数据类型不确定,可以将泛型定义在方法上.

泛型接口

黑马程序员_复习_Day11 - 九五二七 - 今天

通配符<?>

黑马程序员_复习_Day11 - 九五二七 - 今天

泛型限定:

通配符.也可以理解为占位符。

泛型的限定;

上限:<? extends E> 可以接收E类型或者E的子类型.

下限:<? super E>   可以接收E类型或者E的父类型.

黑马程序员_复习_Day11 - 九五二七 - 今天

 

上限什么时候用

往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象.

取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象.

下限什么时候用

    当从集合获取元素进行操作时,可用当前元素类型接收,也可用当前元素父类型接收.

黑马程序员_复习_Day11 - 九五二七 - 今天

 

泛型的细节:

1)、泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型;

2)、使用带泛型的类创建对象时,等式两边指定的泛型必须一致;

    原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了;

3)、等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);

ArrayList<String> al = new ArrayList<Object>();  //错

//要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。

ArrayList<? extends Object> al = new ArrayList<String>();

al.add("aa");  //错

//因为集合具体对象中既可存储String,也可以存储Object的其他子类,所以添加具体的类型对象不合适,类型检查会出现安全问题。 ?extends Object 代表Object的子类型不确定,怎么能添加具体类型的对象呢?

public static void method(ArrayList<? extends Object> al) {

al.add("abc");  //错

  //只能对al集合中的元素调用Object类中的方法,具体子类型的方法都不能用,因为子类型不确定。

}

自己的一些错误总结

黑马程序员_复习_Day11 - 九五二七 - 今天
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值