java_关于集合(泛型机制,排序,Set接口及Map接口)

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

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

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

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

方法:
    int compareTo(E e);
        比较规则:
        (1)this与e比较,this-e,若>0,返回>0的一个数;
                              若=0,返回0;
                              若<0,返回<0的一个数;
        按照升序排序
        (2)this与e比较,e-this,若>0,返回>0的一个数;
                              若=0,返回0;
                              若<0,返回<0的一个数;
        按照降序排序

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

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

方法:
    int compare(E o1,E o2)
比较规则:
升序:o1-o2
降序:o2-o1

=================================================
Set接口:
特点:
(1)无序,存储的元素与添加顺序无关
(2)不可重复,使用元素的equals()来判定是否重复
(3)能存null,但只能有一个

Hash算法机制:
Set在添加或查看元素时,当集合中的元素过多时,就会进行多次的比较,效率变低.
为了提高效率,在设计元素类型时,提供hash算法
用于返回对象的一个哈希值(int类型的值)
在集合所在的内存中开辟了很多小的区域,用于存储一定范围哈希值的元素(对象),当我们想添加或查看元素时,先计算此元素的哈希值,然后去相应的区域查找遍历(极大提高了效率)
—若没有找到,则没有这个元素(对象);
—若有,则查看两个对象的equals返回值
—true就不能添加,或查找到该元素
—false可以添加,添加到相应的链表结构中(尽可能避免发生),或没有找到该元素

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

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

反过来说:
(1)hashCode值相同时,equals()可能不同
(2)hashCode值不同时,equals()一定不同

Set集合的遍历:
因为Set集合时无需的,无下标,因此不能使用经典for循环,可以使用迭代器原理

(1)调用集合的iterator()获取迭代器
(2)使用foreach循环

Set集合的元素:
不能轻易修改参与hash值算法的成员变量
否则容易引起内存溢出
原因:成员变量修改后,会出现新的hash值,存储位置不变,所以,操作时,找不到该元素
Set接口派生出的子类:

HashSet:通过实现hash算法的一种数据结构
    无序,不重复
LinkedHashSet:通过实现hash算法的一种数据结构,通过链表来维持顺序,
    顺序与添加顺序一致
TreeSet:使用了二叉树的一种数据结构,顺序与自然顺序一致,支持定制排序

=================================================
Map接口:
集合框架中的另一个父接口

Map集合用于存储一一对应的元素数据,第一个对象可以作为索引,第二个对象作为值.
我们称之为key-value 键值对

存储数据的特点:
    (1)以key-value形式进行存储
    (2)key和value都是引用类型
    (3)key可以为null
    (4)key对value是单向一对一映射
    (5)key不能重复

存储机制:
Map是基于数组和链表的数据结构进行存储数据的
作为key的对象采用了散列算法计算存储在数组(即散列数组,散列桶)的位置上,如果计算出来的位置上没有元素,就存入,若有元素,equals方法比较,false就存入对应位置的单向链表中,true就进行替换
PS:使用Map集合时,作为key的数据类型,应该重写hashCode和equals方法

常用方法:

    V put(K k,V v);
        存储一对key-value,返回被替换掉的value值,未发生替换就返回null
    V get(K k);
        通过key对象获取对应的value对象;若集合中没有此key对象,返回null

Map集合的遍历:

    Set<K> keySet();
        用于获取Map中所有的Key对象,返回一个Set集合
    Set<Map.Entry<K,V>> entrySet();
        将key-value封装成内部类对象,返回对象的Set集合
    Collection<V> values();
        将Map中的所有value封装到一个Collection集合中

装载因子和HashMap的优化:
装载因子:DEFAULT_LOAD_FACTOR = 0.75f;
默认容量:DEFAULT_INITIAL_CAPACITY = 1 << 4;//16 数组的容量
元素个数:size()

当我们创建一个HashMap对象时,底层数组的初始容量为16,当存储的数据的个数(size)/DEFAULT_INITIAL_CAPACITY==DEFAULT_LOAD_FACTOR时,数组开始扩容
如果<0.75扩容,比较占内存
如果>0.75扩容,操作的元素比较多

=================================================
Map接口的子类:

HashMap与HashTable的区别:
(1)HashTable是一个古老的类,不建议使用
(2)HashTable是一个线程安全的类
(3)HashTable的key不能是null,HashMap可以是null
LinkedHashMap:
是HashMap的子类,使用链表来维护Key-value的顺序,在迭代是顺序与添加顺序一致
TreeMap:

    (1)自然排序:
        往TreeMap添加的Key对象,可以实现Comparable接口,重写compareTo方法
    (2)定制排序:
        作为key对象的数据类型,可以不实现Comparable接口,需要创建一个比较器Comparator对象,实现compare方法

Properties:
是HashTable的子类型,用于封装属性文件的key-value信息
因为在文件里写的都是字符串,因此Properties与value都是字符串类型

javaBean规范:
程序开发者默认遵循的一种规范

(1)提供两个构造器
(2)提供成员变量get/set方法
    bean:豆子,get/set方法名的后续叫做bean,命名时,bean的首字母大写,成员变量尽可能与bean名一致(首字母小写)
(3)重写hashCode和equals方法
(4)重写toString方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值