day_10_java高级编程_集合_List_Map(511~559)

集合

作用(容器):对多个数据存储
数组在存储多个数据的特点:

一旦初始化就定长、定元素类型
方法少,增删改查比较麻烦、效率低
有序可重复、对与无序不可重复的数据无法满足

集合框架:

  • Collection接口:单列数据
  1. List 接口:有序可重复数据 “动态数组” ,主要实现类:Arrylist、linkedlist、vector
  2. Set接口:无序不可重复数据 主要实现类:Hashset Linkedhashset 、treeset
  • Map接口:双列数据(key-value)主要实现类:hashmap linkedhashmap、hashtable properties

Collection 接口

在这里插入图片描述

在这里插入图片描述

**

向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals().

**

  //8.集合转数组:toArray()
        Object[] arr = coll.toArray();
        for(int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }

//数组转集合:调用Arrays类的静态方法asList()
	// 通过包装类 才能将数组元素挨个传入集合中,否则作为一个整体
       List arr2 = Arrays.asList(new int[]{123, 456});
        System.out.println(arr2.size());//1

        List arr3 = Arrays.asList(new Integer[]{123, 456});
        System.out.println(arr3.size());//2 


所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。

  • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
  • 内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
//遍历集合
//System.out.println(iterator.next());打印一个元素 并往后移光标

        while(iterator.hasNext()){
            System.out.println(iterator.next()); //这里并不是iterator().hasNext()
        }
Object obj = iterator.next(); //取出当前元素的值,并光标后移

增强型for循环:
当变量类型出写Object则可以遍历一切

//for 数组/集合类型 + 循环变量 :被循环集合/数组名称
int[] arr = new int[]{1,2,3,4,5,6,7,8,9};
        for (int j: arr){
            System.out.println(j);

int[] arr = new int[]{1,2,3,4,5,6,7,8,9};
        for (Object j: arr){
            System.out.println(j);

List接口

鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。 JDK
API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

/** * 1. List接口框架 * * |----Collection接口:单列集合,用来存储一个一个的对象 *
|----List接口:存储有序的、可重复的数据。 -->“动态”数组,替换原有的数组 *
|----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储,,长度为10的数组
|----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储 *
|----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储 * *

  • 面试题:比较ArrayList、LinkedList、Vector三者的异同? * 同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据 * 不同:见上 * */

void add(intindex, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?

/**
* 请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?
* ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?
*
* ArrayList和LinkedList的异同二者都线程不安全,相对线程安全的Vector,执行效率高。
* 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
* 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
* 对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
*
* ArrayList和Vector的区别Vector和ArrayList几乎是完全相同的,
* 唯一的区别在于Vector是同步类(synchronized),属于强同步类。
* 因此开销就比ArrayList要大,访问要慢。正常情况下,
* 大多数的Java程序员使用ArrayList而不是Vector,
* 因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,
* 而ArrayList是1.5倍。Vector还有一个子类Stack。
*/

Set

Set: 无序不可重复数据 主要实现类:Hashset Linkedhashset 、treeset hashset: 主要的实现对象
线程不安全。 Linkhashset:hashset的子类,添加指针,可以按照添加的顺序遍历set。
treeset:红黑树,存储同一个类的对象。可以按照对象的指定属性排序
无序性:并不是随机性,底层存储根据hash值确定位置
不可重复性:添加元素equals返回值不能为true,前提重写了equals 和hashcode
add():的过程

  1. 调用hashcode 计算哈希值
  2. 根据哈希值 得出存储位置 ,若该位置已经有元素,则比较其哈希值,相同则调用equals方法,true 添加失败,false添加成功。
  3. 若根据哈希值在链表上对应同一位置,且存储成功,则使用链表连接
  4. treeset 则根据compareTo的返回值判断相同

Map

在这里插入图片描述
Hashmap:map的主要实现类,线程不安全,可以存储null的键值对
Linkhashmap:在hashmap的基础上加了两个指针,指向前后添加的元素,用于存储频繁遍历的元素。 继承了HashMap.Node类(包含了before 、next两个属性)
hashtable:线程安全,不能存储null的键值对,按照 key 进行排序,自然排序compareable 或自定排序 compartor,地层红黑树存储。
properties:处理配置文件,key、value都是String类型。

hashmap的底层:

  • 数组+链表 jkd8前
  • 数组+链表+红黑树 jdk8后

key+value—>entry :无序、不可重复:set
key: 无序、不可重复 :set 、重写 equals、hashcode方法
value:无序、可重复:Collection、重写 equals方法

hashmap的底层 (JDK7):

  1. HashMap map = new HashMap();:创建一个长度为16的entry 类型的数组 table
  2. map.put(key,value);:
    1. 调用key中的 HashCode方法,再计算出存储在enytry数组中的索引
    2. 如果已经有数据则比较hashCode ,不同则用链表添加在该索引处
    3. 若 hashCode相同则调用equals比较
    4. 若equals返回true 则使用新的value替换旧equals ,false则用链表添加在该索引处
  3. 扩容:当数组内被使用的索引超出临界值(16*加载因子0.75 = 12) 且此次插入位置不为空时扩容,默认扩容为2倍

JDK8 在HashMap map = new HashMap();时并没有创建Node[ ],在首次调用put方法时创建一个创建一个长度为16的Node类型的数组 table
当一个索引下的链表元素>8个,且数组总长>64时,该索引处改用红黑树存储。

默认容量:16
加载因子:0.75:尽可能的在提高数组利用率时,减少链表。
扩容临界值:16*0.75 = 12
链表转换为红黑树的临界长度:8
链表转换为红黑树的数组临界长度:64

遍历map的key:

      Set set = hm.keySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
         for (Object i: set){   //while 可以换为 foreach
            System.out.println(i);
        }

遍历key – value 先ketSet得到key 再通过get方法,得到对应的value

        Set set1 = hm.keySet();
        Iterator iterator2 = set1.iterator();
        while (iterator2.hasNext()){
            Object key = iterator2.next();
            Object value = hm.get(key);
            System.out.println(key  + " -- " + value);

        }

添:put
删:remove(key)
改:put
查:get(key)
长度:size
遍历:keySet、values

TreeMap:按照key排序,key必须为同一个类,因为要排序 所以要实现compareable接口,重写compareTo方法

定制排序:

        TreeMap treeMap1= new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof  goods && o2 instanceof  goods){
                    goods g1 = (goods) o1;
                    goods g2 = (goods) o2;
                    return Double.compare(g1.getPrice(),g2.getPrice());

                }
                throw new RuntimeException("数据类型错误");
            }
        });

Properties:

  1. 新建一个resource bundle文件
  2. new properties对象
  3. 创建文件输入流
  4. 接收一个InputStream实例
    @Test
    //简洁代码 不考虑close
    public void test2() throws IOException {
        Properties pros = new Properties();
        FileInputStream fils = new FileInputStream("jdbc.properties");
        pros.load(fils);

        String name = pros.getProperty("name");
        System.out.println(name);


    }

Collections

Collections:操作Collection 、map的工具类
Collection:集合类的一个顶级接口

Collections的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值