Offer

Java集合-集合框架/底层原理

两个疑点解决

  1. 接口 A = new 实现类 实现类 B = new 实现类 [接口-接口实现类(只能使用接口方法) 接口实现类-接口实现类(接口和接口实现类方法都能实现)]; 样例: List = Arraylist/Linkdelist
  2. 父类 A = new 子类 子类 B = new 子类() [父类-子类(只能使用继承来的方法并且调用的是子类的方法)]

🐫 😊 😄

常见的ArrayList与LinkedList

  1. ArrayList中的操作:add,get,remove,set,size,toArray,clear等.
ArrayList中的方法
package Collection;

import charactor.Hero;

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

/**
 * @author :Empirefree
 * @description:TODO
 * @date :2020/6/26 10:11
 */
public class testCollection2 {
    public static void main(String[] args) {
        //容器add
        ArrayList<Hero> arrays = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            arrays.add(new Hero("hero" + i, 10, 100));
        }
        arrays.stream().forEach(System.out::println);
        Hero hero = new Hero("test", 10, 30);
        arrays.add(3, hero);
        System.out.println("============Add");
        arrays.stream().forEach(System.out::println);
        System.out.println("============Get");
        System.out.println(arrays.get(3));
        System.out.println("============indexOf");
        //必须要在容器中存在,而不是比较对象中的值
        System.out.println(arrays.indexOf(hero));
        System.out.println("============delete的两种方式-删除对象+删除索引");
        arrays.remove(hero);
        arrays.remove(1);
        arrays.stream().forEach(hero1 -> System.out.println(hero1));
        System.out.println("============set替换元素-返回的是原来的元素");
        System.out.println(arrays.set(0, new Hero("HHH", 10, 100)));
        arrays.stream().forEach(System.out::println);
        System.out.println("============size");
        System.out.println(arrays.size());
        System.out.println("============toArray");
        Hero[] temp = arrays.toArray(new Hero[0]);
//        Hero[] temp = arrays.toArray(new Hero[]{});
        for (Hero hero1 : temp){
            System.out.println(hero1);
        }
        System.out.println("============addAll-添加另一个容器");
        List<Hero> arrays2 = new ArrayList<>();
        arrays2.add(new Hero("asdfa", 123, 123));
        arrays.addAll(arrays2);
        arrays.stream().forEach(System.out::println);
        System.out.println("============clear-清空容器");
        arrays.clear();
        arrays.stream().forEach(hero1 -> System.out.println(hero1));
    }
}

  1. LinkedList:自身函数 + List + Queue等
LinkedList中的方法
package Collection;

import charactor.Hero;

import javax.management.Query;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @author :Empirefree
 * @description:TODO
 * @date :2020/6/26 10:50
 */
public class testCollection3 {
    public static void main(String[] args) {
        //容器add
        Queue<Hero> queue = new LinkedList<Hero>();
        for (int i = 0; i < 10; i++) {
            queue.offer(new Hero("hero" + i, 10, 100));
        }
        System.out.println("============Queue-poll,peek");
        queue.stream().forEach(System.out::println);
        Hero temp = queue.poll();
        queue.stream().forEach(hero -> System.out.println(hero));
        System.out.println(temp);
        System.out.println("============");
        Hero temp2 = queue.peek();
        System.out.println(temp2);
        System.out.println(queue);
    }
}

集合框架

  1. Collection接口----Colections工具类(如同Arrays是数组的工具类),下图是Collection所实现的类
    Collection

  2. ArrayList 与 Hashset
      ArrayList是顺序插入,可以重复的动态数组,而Hashset是无序插入,不能重复的set(不同JVM导致看起来不一样)

  3. Hashset与Hashmap
      hashset底层也是hashmap实现,根据key,查询value非常快(具体可以见下面代码),具体插入是
    先判断hashcode散列值
     hashcode不一样,则不会重复,用数组存储
     hashcode一样
      比较equals一样,则重复数据,Hashmap覆盖
      比较equals不一样,则不同数据,组成链表
    Hashmap底层剖析:hashmap(非线程安全)底层是数组和链表和红黑树(jdk1.8以后)构成,这里就解释了哪里是数组(存储数据),哪里是链表(equals不同),而链表过长(大于8)的时候就要转成红黑树,
    并且扩容(链表太长会导致查询效率过低),所以引出来了负载因子为0.75,hashmap的元素个数 * 0.75就要扩容。

HashMap性能比较
package Collection;

import charactor.Hero;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * @author :Empirefree
 * @description:TODO
 * @date :2020/6/26 14:51
 */
public class testCollection5 {

    private HashMap<String, Hero> heroHashMap;

    public static void main(String[] args) {
        List<Hero> heroes = new ArrayList<>();
        HashMap<String, Hero> heroHashMap = new HashMap<>();
        for (int i = 0; i < 2000000; i++) {
            heroes.add(new Hero("hero" + i, 10, 100));
            heroHashMap.put("hero" + i, new Hero("hero" + i, 10, 100));
        }

/*        for (int i = 0; i < 10; i++) {
            Collections.shuffle(heroes);
            long start = System.currentTimeMillis();
            Hero target = new Hero("hero" + 1000000, 10, 100);
            for (Hero hero : heroes){
                if (hero.getName().equals(target)){
                    System.out.println("成功找到target....");
                    break;
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("=========耗时"+ (end - start) + "毫秒" );
        }*/
        
        for (int i = 0; i < 10; i++) {
            long start = System.currentTimeMillis();
            Hero target = heroHashMap.get("hero" + 1000000);
            if (target != null){
                long end = System.currentTimeMillis();
                System.out.println("=========耗时"+ (end - start) + "毫秒" );
            }
        }
    }
}

posted @ 2020-06-26 15:38  Empirefree  阅读(532)  评论(0编辑  收藏  举报