java复习-集合

Collection架构

List 的特点是元素有序、元素可重复。 Set 的特点是元素无
序,而且不可重复
附:集合未指定泛型时,默认为object。

List 接口

public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

实现类分为ArrayList和LinkedList

ArrayList是一个具有索引的集合,通过add()增加元素,
也可以通过get(int i)方法来取元素,底层实现原理是数组
而LinkedList类底层实现原理是双向链表

Set接口

Set 接口中元素放入顺序,并且都会以某种规则保证存入的元素不出现重复
元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的。

实现类分为HashSet和LinkedHashSet

HashSet是通过比较Hash值的方式保证存入的元素不出现重复
Hash值则是通过ObjectCode()方法计算得出
哈希值是虚拟的
是经过一个特定的算法计算出来的,形象上代表了地址,但还是不一样的
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
源码:

public int hashCode()

    {
    int h = hash;
    if (h == 0 && !hashIsZero) {
        h = isLatin1() ? StringLatin1.hashCode(value)
                       : StringUTF16.hashCode(value);
        if (h == 0) {
            hashIsZero = true;
        } else {
            hash = h;
        }
    }
    return h;
}

————————————————

Java中未重写的对象的toString()打印的地址值实际上是哈希值的16进制,对象名中保存的真实地址值无法打印。
附:而对于对象的==(或equals)比较的是引用类型变量真实地址值,不是hashCode()计算的值。
在集合中,之所以要重写hashCode方法,就是加快速度。
首先比较hash值,hash不同,对象一定不同,hash值相同,比较对象内容
String也重写了hashcode()方法和equals()方法,(不重写则比较的是地址值)
hash值相同,对象不同,这就是hash冲突
比如:


> public class son {
>     public static void main(String[] args) {
>         HashSet<String> x=new HashSet<>();
>         System.out.println("aaa".hashCode());
>         System.out.println("aaa".hashCode());
>     } }

这是相同的情况,输出结果为

96321
96321
public class son {
    public static void main(String[] args) {
        HashSet<String> x=new HashSet<>();
        System.out.println("重地".hashCode());
        System.out.println("通话".hashCode());
    }
}

这是不同情况,但哈希值相同

运行结果为:
1179395
1179395

HashSet就是先把hash值不同的进行分组,放到数组中,然后再把相同的进行内容比较,如果不一样则把他挂到链表上
黑马程序员
而LinkedHashSet是在HashSet的基础上保证了其有放入顺序(即存进去什么样,取出来就什么样)

public class file {
    public static void main(String[] args){
        Set<Integer> x=new HashSet<>();
        x.add(2);
        x.add(5);
        x.add(4);
        System.out.println(x);
    }
}//结果为 [2, 4,5]
public class file {
    public static void main(String[] args){
        Set<Integer> x=new LinkedHashSet<>();
        x.add(2);
        x.add(5);
        x.add(4);
        System.out.println(x);
    }
}//[2, 5, 4]

Map

Map<Key(健),Value(值)>
与Collection集合相比多了一个泛型,Collection相当于是单身而map则是夫妻。
健是唯一的,而值可以重复,健和值的数据类型可以相同也可以不同,

实现类

HashMap 不保证映射有序 底层实现跟HashSet一样,都是数组+单向链表/红黑树,也需要重写Hashcode和equrals()
LinkedHashMap 保证映射有序,相较于HashMap多了一个链表
HashMap集合在放入时也会根据Key的Hashcode排序放入,即,无放入顺序

public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到
集合中;
若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的
值,替换成指定的新值。

遍历方式

一、键找值方式:即通过元素中的键,获取键所对应的值
分析步骤:

  1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
  2. 遍历键的Set集合,得到每一个键。
  3. 根据键,获取键所对应的值。方法提示: get(K key)
    二、键值对方式
    键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
    操作步骤与图解:
  4. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。
  5. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

LinkedHashMap

是在HashMap的基础上使其有放入顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值