JAVA_(泛型机制、List排序、Set集合)

泛型机制:
(1)jdk1.5版本开始使用的新特性,本质是进行”参数化类型”,在类,接口,方法的定义上都可以使用,用来指定数据类型名的。

(2)集合在定义时,可以用泛型机制来指定元素的类型,这样编译器在编译期间就可以进行检查元素类型是否匹配,避免了程序在运行时出现过多的错误。

(3)集合框架中的所有类型(接口,抽象类,实现类)都使用了泛型机制。

(4)泛型机制的参数只能传引用类型。

List排序
Comparable接口:
如何定义集合中元素之间的大小之分?我们需要在定义元素类型时实现Comparable接口,实现接口内的compareTo(E e)。实现此接口的类型的对象之间可以进行比较。

方法: int compareTo(E e)

比较规则:

(1)this与e比较,this-e,按照升序排序
             如果大于0,返回大于0的一个数
             如果等于0,返回0
             如果小于0,返回小于0的一个数
(2)e-this,降序排序

工具类:Collections
提供了一个sort(Collection c)方法,对集合里的元素进行排序。

Comparator比较器接口:
如果元素类型已经实现了comparable接口,定义了默认的比较规则。之后,再想换其他比较规则时,不修改源码。可以利用比较器接口来重新定义比较规则。

方法: int compare(E o1,E o2)

比较规则:

      升序: o1-o2
      降序: o2-o1

Set接口:

存储时采用了hash算法机制,计算存储位置。

特点1: 无序,存储的元素与添加顺序无关
特点2: 不可重复(使用元素的equals方法来判定是否重复)
特点3: 能存储null元素,只能存储一次。

Hash算法机制:
Set集合设计的初衷时无序不可重复,因此当向集合添加(或检索元素)时我们需要调用equals方法来一一校验。但是当集合的元素过多时,校验的次数明显很多,因此校验效率很低。

那么如何提高效率呢?

我们为元素提供了一个hash算法(哈希),用于返回此元素的一个哈希值(int值)。兵器在集合所占的内存中开辟很多小的区域,每个区域用于存储一定范围的哈希值的元素。在我们添加元素或者是检索元素时,先获取此元素的哈希值,然后去对应的区域内查找遍历(大大降低了比较次数)。

–如果在这个区域没有找到对象,说明集合中可以添加这个对象。
–如果有,然后查看两个对象的equals的返回值:
–如果为true, 不能添加
–如果为false, 可以添加,添加至对应的链表结构中(尽可能的避免发生)

重写HashCode方法:
重写规则:尽可能的让所有的成员变量都参与运算,尽可能的避免出现hash值碰撞。

注意:
重写的必要性:
(1)如果重写了equals(), 有必要重写hashCode方法
(2)如果equals()返回true, hashCode返回值有必要相同
(3)如果equals()返回false,hashCode返回值不一定相同;如果返回值不同,可以提高检索的效率。

反过来就是:
(1)hashCode值相同,equals方法可能不同。
(2)hashCode值不同,equals方法一定不同。

HashCode方法:
Object是引用类型的父类,提供了hashCode()方法以及equals()方法,因此我们在定义类型时,一般都重写hashCode和equals方法。

重写的重要性:
equals方法我们用来判断集合中的元素是否重复。
hashCode方法我们在使用Set集合时,必须要重写,因为我们采用的hash算法计算Set集合元素的存储位置。

int hashCode():
Object提供的方法是通过地址计算hash值,不可控,我们需要在自定义类中重写此方法。
重写原则:尽可能的让所有成员变量都参与运算;尽可能的减少hash值的碰撞。

Set集合的遍历:
因为Set集合是无序的,无下标可言,因此不能使用经典for循环。

可以使用迭代器原理:
(1) 调用集合的iterator()获取迭代器
(2) 使用foreach循环

Set集合的元素:
不能轻易修改参与hash值算法的成员变量,否则容易引起内存溢出。

原因:成员变量修改后,会出现新的hash值,但是存储位置还在原hash值的位置上。因此操作时,找不到具体的存储位置。

Set集合的子类:

HashSet:无序,不重复,底层使用hash算法计算存储位置,增加删除时效率高。

LinkedHashSet: 是HashSet的子类底层使用hash算法计算存储位置,同时使用链表来维护顺序,顺序与添加顺序一致。在查看检索时,效率比较高 。

TreeSet:是SortedSet子接口的实现类,使用二叉树的数据结构维护元素的顺序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值