Java学习 DAY17 无序集合,泛型,映射

2 篇文章 0 订阅
1 篇文章 0 订阅

Set(散列)

无序
不能存储重复元素
实现类:HasSet、LinkedHashSet、TreeSet

HashSet
底层基于HashMap(基于数组+链表)实现数组存储,不能存储重复元素,不能保证元素存储的顺序恒久不变。默认的初始容量为16,默认加载因子为0.75,每次扩容是在原来的基础上增加一倍。线程不安全的集合。
加载因子越大,某个桶中的节点数越多导致查询效率降低
加载因子越小,进行频繁的扩容与rehash操作,导致大量的内存在浪费。

当某个链表的长度大于8个时,在jdk1.8时会把链表扭转成二叉树进行存储

在这里插入图片描述

LinkedHashSet
记录下存储元素对象的位置(LinkedHashMap)

package cn.tedu.collection.set;

import java.util.LinkedHashSet;
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        //创建对象
        LinkedHashSet<String> set=new LinkedHashSet<>();
        //添加元素
        set.add("bc");
        set.add("ac");
        set.add("bc");
        set.add("1abc");
        set.add("a2bc");
        set.add("abc3");
        //
        System.out.println(set);
    }
}

TreeSet
默认给存储元素对象进行排序
类实现Comparable接口产生对象才能存储到TreeSet中,需要指定排序规则(重写compareTo方法),才能进行排序

package cn.tedu.collection.set;

import java.io.Serializable;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        /*//创建集合对象
        TreeSet<String> t=new TreeSet<>();
        //添加元素
        t.add("abc");
        t.add("bc");
        t.add("ac");
        t.add("ab");
        t.add("1abc");
        t.add("a2bc");
        //默认给存储元素对象进行排序---升序排序
        System.out.println(t);*/


        //创建对象
        TreeSet<Hero> t=new TreeSet<>();
        //添加元素
        t.add(new Hero("鲁班",'男',18888));
        t.add(new Hero("后羿",'男',28888));
        t.add(new Hero("妲己",'女',19888));
        t.add(new Hero("明世隐",'男',18000));
        t.add(new Hero("瑶",'女',38000));

        //ClassCastException---类型转换异常
        //System.out.println(t);
        //遍历输出---集合对象
        for (Hero s:t) {
            System.out.println(s);
        }
        /*Iterator<Hero> s=t.iterator();
        while (s.hasNext()){
            String
        }*/
    }
}

//代表英雄的类
//只有类实现了Comparable接口产生对象才能存储到TreeSet集合中
class Hero implements Serializable,Comparable<Hero> {
    //属性
    String name;
    char gender;
    //英雄熟练度---分数
    int score;

    //有参构造
    public Hero(String name,char gender,int score){
        this.name=name;
        this.gender=gender;
        this.score=score;
    }

    //重写toString方法
    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", score=" + score +
                '}';
    }

    //指定排序规则
    //如果返回值是整数表面前面对象大于后面对象
    //如果返回值是整数表面前面对象小于后面对象
    //如果返回值是0表面前面对象等于后面对象
    @Override
    public int compareTo(Hero o) {//重写的方法
        //根据英雄的分数来给对象进行排序---降序
        return o.score-this.score;
    }
}

Queue(队列)
遵循先进先出的原则
队头元素—第一个存放元素
队尾元素—最后一个存放元素

package cn.tedu.collection.queue;
import java.util.LinkedList;
import java.util.Queue;

public class QueueDemo {
    public static void main(String[] args) {
        //创建队列对象
        Queue<String> q=new LinkedList<>();
        //
        //获取队头元素但是并不删除
        //没有元素(报错)---NoSuchElementException
        //System.out.println(q.element());
        //获取队头元素但是并不删除
        //没有元素---返回null
        System.out.println(q.peek());
    }
}

泛型

参数化类型,jdk1.5新特性
当泛型指定成确切类型时后续只能操作对应类型数据—泛型擦除(编译时期)
泛型的上下限
上限<? extends 类/接口>—可以接收类以及子类/接口以及子接口
下限<? super 类/接口>—可以接收类以及父类/接口以及父接口

package cn.tedu.type;

import com.sun.org.apache.xerces.internal.xs.StringList;

import java.util.ArrayList;
import java.util.List;

public class TypeDemo1 {
    public static void main(String[] args) {
        //创建集合对象
        //当不使用泛型时存储数据很方便但是获取数据进行操作时就很复杂
        List list=new ArrayList();
        //三种效果一样,推荐使用方式---jdk1.7
        List<String> list1=new ArrayList<>();
        List list2=new ArrayList<String>();
        List<String> list3=new ArrayList<String>();


        //泛型指定元素类型(默认可以指定成所有的引用类型)
        //当泛型类型指定之后后续操作时都是使用指定类型---泛型擦除(编译时期)

        list1.add("abc");
        list1.add("");
        list1.add("");
        list1.add("");
        list1.add("");
        list1.add("");




        //添加元素
        //没有泛型的指定---可以存储任意类型的数据
        //存储数据很灵活
        list.add(123);
        list.add(true);
        list.add("abc");
        list.add('a');

        //获取集合元素对象
        //Object所有数据类型
        //取出数据时需要确定具体类型---操作复杂
        for (Object s:list) {
            //判断元素对象具体是哪个类型
            if (s instanceof Integer) {
                Integer in= (Integer) s;
            }else if(s instanceof Boolean){
                Boolean b= (Boolean) s;
            }else if(s instanceof String){
                String b= (String) s;
            }else {
                Character c= (Character) s;
            }
            System.out.println(s);
        }
    }
}
package cn.tedu.type;

import java.util.ArrayList;
import java.util.List;

public class TypeDemo2 {
    public static void main(String[] args) {
        //List<Number> list=new ArrayList<Integer>();
        //泛型没有向上造型
        List<Integer> list1=new ArrayList<>();

        list1.add(123);
        list1.add(23);
        list1.add(13);
        list1.add(12);
        list1.add(1233);
        List<Double> list2=new ArrayList<>();
        list2.add(12.45);
        list2.add(1.245);
        list2.add(2.415);
        list2.add(2.4);
        list2.add(2.451);
        List<String> list3=new ArrayList<>();
        list3.add("abc");
        list3.add("bc");
        list3.add("ac");
        list3.add("ab");

        //调用方法
        m(list1);
        m(list2);
        //m(list3);
    }
    //定义方法来遍历所有元素类型时数值类型集合对象
    //?代表泛型可以指定的类
    //<? extends Number>---可以接受Number类以及子类
    //<? extends 类/接口>---可以接收类以及子类/接口以及子接口
    //泛型的上限
    public static void m(List<? extends Number> list){//=new ArrayList<Integer>()
        for (Object i:list) {
            System.out.println(i);

        }
    }

    //List<? super String>---可以接受String类以及父类
    //List<? super 类/接口>---可以接收类以及父类/接口以及父接口
    //泛型的下限
    public static void n(List<? super String> list){
        for (Object i:list) {
            System.out.println(i);

        }
    }
}

映射(Map<K,V>)

存储有关系(映射关系)的数据的容器
K代表键,V代表值,键不能重复,值可以重复,由键得到对应值,映射是由多个键和多个值来组成
可以把键和值看成键值对,就可以把每个键值对看做成对象,可以把键值对抽取成类(Entry)来表示,Entry产生的每个对象就是一个具体键值对,映射由多个键值对来组成

package cn.tedu.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo1 {
    public static void main(String[] args) {
        //创建映射对象
        Map<String,Integer> map=new HashMap<>();
        //添加元素
        map.put("abc",123);
        map.put("bc",23);
        map.put("ac",13);
        map.put("ab",12);
        map.put("1abc",1123);
        map.put("a2bc",1223);
        map.put("ab3c",1233);
        //键不能重复,会舍弃掉新的键更新为新的值
        map.put("ab3c",1333);

        //清空映射
        //map.clear();

        //判断是否包含键/值
        //System.out.println(map.containsKey("abc"));
        //System.out.println(map.containsValue(456));

        //把映射中所有键值对放到Set集合中
        //Map.Entry<String,Integer>---代表键值对类型
        //Set<Map.Entry<String,Integer>> S=map.entrySet();

        //由键来获取值
        //System.out.println(map.get("abc"));

        //判断映射是否为空
        //System.out.println(map.isEmpty());

        //把映射中所有的键放到Set集合中
        //Set<String> set=map.keySet();

        //删除元素
        //根据键来删除值对
        //map.remove("abc");
        //保证键和值存在才能删除键值对
        //map.remove("abc",1223);

        //返回键值对的个数
        //System.out.println(map.size());

        //把映射中所有的值放到集合中
        //Collection<Integer> c=map.values();

        //无序
        //底层由键来确定存储位置,键无序的导致键值也是无序的
        System.out.println(map);
    }
}

映射遍历
1.获取所有的键再获取对应的值
2.获取所有的键值对再获取键和值

package cn.tedu.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo2 {
    public static void main(String[] args) {
        //创建映射对象
        Map<String,Integer> map=new HashMap<>();
        //添加元素
        map.put("abc",123);
        map.put("bc",23);
        map.put("ac",13);
        map.put("ab",12);
        map.put("1abc",1123);
        map.put("a2bc",1223);
        map.put("ab3c",1233);

        //获取所有的键
        Set<String> set=map.keySet();
        //遍历Set集合
        for (String s:set) {
            //由键获取值
            System.out.println(s+"="+map.get(s));
        }
    }
}
package cn.tedu.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo3 {
    public static void main(String[] args) {
        //创建映射对象
        Map<String,Integer> map=new HashMap<>();
        //添加元素
        map.put("abc",123);
        map.put("bc",23);
        map.put("ac",13);
        map.put("ab",12);
        map.put("1abc",1123);
        map.put("a2bc",1223);
        map.put("ab3c",1233);

       /* //获取所有的键值对
        Set<Map.Entry<String,Integer>> set=map.entrySet();
        //遍历Set集合
        for (Map.Entry<String,Integer> m:set) {
            //获取键和值
            //System.out.println(m);
            System.out.println(m.getKey()+"="+m.getValue());
        }*/

        //常用
        for (Map.Entry<String,Integer> m: map.entrySet()) {
            //获取键和值
            //System.out.println(m);
            System.out.println(m.getKey()+"="+m.getValue());

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值