Java集合进阶

集合体系结构:

1、单列集合:一次添加一个数据

List系列:添加元素有序、可重复、有索引

有序:存取顺序一致

可重复:元素可重复

有索引:可通过索引获取每一个元素

Set系列:添加元素无序,不重复,无索引

无序:存取顺序可能不一致

不重复:集合中元素不能重复(数据去重)

无索引:不能通过索引获取元素

Collection:单列集合最高接口,所有单列集合都能继承使用方法

方法:

conntains方法:

Collection的遍历:

1、迭代器遍历

迭代器:在Java中的类是Iterator,集合专用遍历方式

相关方法

注意事项:

1、迭代器遍历完成不会复位,重新遍历必须重新创建一个迭代器对象

2、一次循环只能用一次next

3、迭代器遍历时(过程中)不能用集合的方法进行添加或删除,若要删除,则需要用迭代器的remove方法删除

2、增强for遍历

单列集合和数组才能用增强for遍历

格式:

for(元素数据类型 变量名:遍历的集合或数组){

}

括号里的变量用来储存数据的临时变量

快速生成方式:集合名字.for

3、lambda表达式遍历

匿名内部类表示方法:

lambda表达式表示方法:

Collection总结:

List:

继承了Collection所有方法

新增索引操作方法:

list的独有遍历方式:

1、迭代器遍历
2、增强for遍历
3、lambda遍历

前三者与Collection的遍历方式一致

4、列表迭代器遍历

ListIterator:获取列表迭代器对象

迭代器.add()可在遍历过程中添加元素

5、普通for循环

利用size和get方法以及循环,通过索引把所有元素获取出来

五种遍历方式总结

LinkedList

即为一个双向链表

方法(用的不多)

Set

HashSet

底层采用哈希表存储数据,总体方法与Collection相差不多

哈希表:增删改查性能较好

哈希值:对象的整数表现形式

属性值相同,对应的哈希值就相同

对象的哈希值特点:

HashSet存储原理:

加载因:存储元素个数等于数组长度乘以加载因时,数组自动扩容一倍

链表长度大于8且数组长度大于等于64时,链表自动转为红黑树

存储数据:

存储数据顺序不确定,因此按数组和链表顺序取数据时无法按照存入对象的顺序读取数据

去重机制:

通过HashCode与equals方法进行去重验证

LinkedHashSet:

有序,底层仍为哈希表,每个元素新增了一个双向链表机制,记录了储存的顺序,因此可以从头结点开始遍历至尾结点

TreeSet:

总体方法与Collection相差不多

可排序:底层基于红黑树实现,增删改查性能较好

排序:

数字:按从小到大排序

字符、字符串:按ASCII码升序排列(字符串从首字母开始比较,与字符数字无关)

两种比较方式:
方式一:默认排序/自然排序

Javabean类实现comparable接口指定比较规则

方式二:

创建TreeSet对象时,传递比较器Comparator指定规则(compareTo无法实现时使用,如对字符串、整数等Java已定义排序规则的数据类型时指定特定的排序规则)

实际应用举例

单列集合使用场景

2、双列集合:一次添加一对数据(键值对)

特点:

1、一次添加一对数据(键值对)

2、键不可重复,值可重复

3、键值一一对应

4、键值对称为键值对对象,Java中称为Entry对象

Map:双列集合顶层接口

方法:

put(添加/覆盖):

添加对象时,若键不存在,则直接添加到map集合中,并返回null;若键存在,则会覆盖原有的键值对对象,并将原来的元素返回

remove:

删除整个键值对,并把值返回

map的遍历:

1、键找值:

keySet:把键存入一个单列集合

get(Key):通过键得到值

import java.util.*;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("A", "B");
        map.put("C", "D");
        map.put("E", "F");
        Set<String> strings = map.keySet();
//增强for遍历
        for(String s : strings) {
            System.out.println(s+" : "+map.get(s));
        }
//迭代器遍历
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()) {
            String key = iterator.next();
            String value = map.get(key);
            System.out.println(key+" : "+value);
        }
//lambda表达式遍历
        strings.forEach(s -> System.out.println(s+" : "+map.get(s)));
    }
}
2、键值对获取

entrySet:将键值对存入单列集合中

import javax.print.DocFlavor;
import java.util.*;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("A", "B");
        map.put("C", "D");
        map.put("E", "F");
        Set<Map.Entry<String,String>> strings = map.entrySet();
//增强for遍历
        for(Map.Entry<String,String> s: strings) {
            System.out.println(s.getKey() + " " + s.getValue());
        }
//迭代器遍历
        Iterator<Map.Entry<String,String>> iterator = strings.iterator();
        while(iterator.hasNext()) {
            Map.Entry<String,String> m = iterator.next();
            String value = m.getValue();
            String key = m.getKey();
            System.out.println(key+" : "+value);
        }
//lambda表达式遍历
        strings.forEach(s -> System.out.println(s.getKey()+" : "+s.getValue()));
    }
}
3、lambda表达式遍历

import javax.print.DocFlavor;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("A", "B");
        map.put("C", "D");
        map.put("E", "F");
        Set<Map.Entry<String, String>> strings = map.entrySet();
        map.forEach((String string, String string2) -> System.out.println(string + ": " + string2));
    }
}

HashMap

特点:

底层为哈希表结构,对比键的属性值

方法:

与Map一致

LinkedHashMap

特点:

有序,不重复,无索引,存取顺序一致

方法:

与Map一致

TreeMap:

特点:

增删改查性能较好

统计思想:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值