Java基础08集合

集合

一,集合Collection< E >

1,定义

​ 数据存储的容器,大小不固定。

​ Collection集合层次的顶级接口。

​ < E >表示泛型—用于限定元素的数据类型的—而且由于泛型的限定,集合只能存储引用类型的数据。

2、集合中的成员

1)List< E >—有序列表

​ 有序集合—指的是保证元素的存入顺序,可以添加重复元素。

​ 1.1)常用直接子类
​ 1-顺序表 ArrayList< E >
​ 特点:基于数组。默认初始容量为10,每次扩容是在原数组的基础上增加一半。
​ 基于右移运算 10 -> 15 -> 22.内存空间连续。插入或者删除一个元素相对效率较低,
​ 查询元素相对效率比较高。是一个线程不安全的集合.

​ 常用方法:
​ add() //向列表中添加一个元素
​ size() //获取列表元素个数
​ get() //从列表中获取指定下标的元素
​ toArray() //将列表转化为数组
​ remove() //从列表中删除元素
​ set() //修改指定位置的元素

2-链表 LinkedList

​ 特点:
​ 基于链表。用节点(Node)来存储元素。内存空间不连续。插入或者删除元素的
​ 效率相对较快,
​ 查询元素效率相对较低。是一个线程不安全的集合
​ (双端队列) Deque< E > extends Queue< E > (队列)

​ 区别:
​ 不同点:
​ -底层的数据结构不同,ArrayList(基于数组),LinkedList(基于链表)
​ -读数据:某些场景下ArrayList效率高于LinkedList
​ -写(添加/删除)数据: LinkedList效率高于ArrayList
​ 相同点:
​ -都实现List接口
​ -线程不安全的集合

3-Vector向量

​ 特点:是Java中最早的集合。底层是基于数组的。默认初始容量是10,每次扩容一倍。
​ 基于三元运算。是一个线程安全的集合

4-Stack 栈

​ 特点:遵循先进后出的原则。向栈中添加元素—入栈/压栈,
​ 将元素从栈中取出—出栈/弹栈,
​ 最先放入栈中的元素—栈底元素,最后放入栈中的元素—栈顶元素—底层
​ 是用的Vector实现的

​ 2)Set 无序集合
​ 不包含重复元素的集合。

​ 2.1)常用直接子类
​ HashSet
​ 特点:不保证元素的存入顺序
​ 默认初始容量是16,加载因子是0.75f,默认扩容一倍。是一个线程不安全的集合
​ 底层基于HashMap(映射)。

3、迭代器

Iterator
迭代器,用于迭代遍历集合—在迭代过程中“不允许增删原集合”
Iterable提供了一个iterator方法来产生一个Iterator对象。
增强for循环本质上在迭代遍历。—如果一个对象允许使用增强for循环遍历,
则这个对象对应的类必须实现Iterable接口。—JDK1.5的特性之一

案例:利用迭代器遍历set
HashSet< String > names = new HashSet<>();
names.add(“张三”);
names.add(“李四”);
names.add(“王五”);

​ //迭代器
​ //1-先将集合转化为迭代器对象
​ Iterator< String > iterator = names.iterator();
​ //2-利用迭代器的方法实现遍历
​ while (iterator.hasNext()){
​ String next = iterator.next();
​ System.out.println(next);
​ }

4、Collections集合工具类

​ sort() //默认将原集合按照从小到大排序
​ reverse() //集合翻转
​ shuffle() //打乱原集合的存入顺序(洗牌)

5、Comparator 比较器

​ 比较器。重写compare方法,将比较规则写到compare方法中。
​ 如果返回一个正数,则意味着第一个参数要排在第二个参数后边;如果返回一个负数,
​ 则意味着第一个参数要排在第二个参数前边。
​ 如果在排序的时候没有指定比较规则,那么这个时候要求排序的元素所对应的类必须实现
​ Comparable接口,重写接口中compareTo方法

​ 1)
​ Comparator< T >是一个接口,上面有一个注解@FunctionalInterface,表示当前接口是一个
​ 函数式接口。

​ – lambda表达式

​ 比较器接口对比:
​ Comparator: 既可以独立开发比较器,也可以与参与比较的类结合使用(弱耦合) ---- 策略模式
​ 需要实现:int compare(Object o1, Object o2)

​ Comparable: 只能在参与比较的类中使用(强耦合)
​ 需要实现:int compareTo(Object o)

练习:通过比较器Comparator实现将商品按照点击量从大到小排序
商品类 Product
属性: name 商品名
num 商品数量
hot 商品热度(点击量)

商品列表:
	笔记本电脑	200   3600
	电视机		120	  700
	手机		1600  4500
static class Product {
    String name;
    int num;
    int hot;

    public Product(String name,int num,int hot){
        this.name=name;
        this.num=num;
        this.hot=hot;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", num=" + num +
                ", hot=" + hot +
                '}';
    }
}
public static class ProductSorting{
    public static void main(String[] args) {
        List<Product> products = new ArrayList<>();
        products.add(new Product("笔记本电脑", 100, 2000));
        products.add(new Product("电视机", 200, 1500));
        products.add(new Product("手机", 300, 2500));

        products.sort(new Comparator<Product>() {
            @Override
            public int compare(Product o1, Product o2) {
                return o1.hot - o2.hot;
            }
        });
        for (Product product : products){
            System.out.println(product);
        }
    }
}

二、泛型

​ 对数据类型的泛型化;(数据类型不确定)
​ 泛型的定义方式: <大写字母> — < T > < E >; 单个字母大写是规范,字母可以自定义

位置:
泛型定义出现在类上----泛型类 ArrayList< E >
泛型定义出现在方法上----泛型方法
泛型定义出现在接口上----泛型接口 List< E >

类/接口: 泛型定义应写到名称后
方法: 泛型定义应写到 返回值类型前。

泛型被具体类型的替换的过程—泛型的擦除—发生在编译期

? extends 类/接口 — 表示这个类/接口及其子类/子接口(上限)
? super 类/接口 — 表示这个类/接口及其父类/父接口(下限)
? 表示通配符 — List<?>

三、映射—Map<K,V>

1、HashMap

在jdk1.8中底层是通过数组+链表+红黑树实现;
当链表个数达到8个时,链表转为红黑树: TREEIFY_THRESHOLD = 8;
红黑树节点个数小于等于6时,红黑树转为链表: UNTREEIFY_THRESHOLD = 6;

在HashMap中由键的哈希值确定放入哪个桶中—允许键或者值为null,默认初始容量是16,
加载因子是0.75f,每次扩容一倍。是一个异步式线程不安全的映射。

常用方法:
put() //將鍵值對添加到映射中
get() //根据key获取对应的value
keySet() //将映射中的所有key以set集合进行返回
entrySet() //将键值对包装到Entry中

2、HashTable

​ 不允许键或者值为null,默认初始容量是11,加载因子是0.75f。
​ 是一个同步式线程安全的映射

3、ConcurrentHashMap

​ 异步式线程安全的映射

JDK1.5:
JUC-> Java Util Concurrent

点个赞鼓励一下谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值