Java集合-集合框架/底层原理
两个疑点解决
- 接口 A = new 实现类 实现类 B = new 实现类 [接口-接口实现类(只能使用接口方法) 接口实现类-接口实现类(接口和接口实现类方法都能实现)]; 样例: List = Arraylist/Linkdelist
- 父类 A = new 子类 子类 B = new 子类() [父类-子类(只能使用继承来的方法并且调用的是子类的方法)]
🐫 😊 😄
常见的ArrayList与LinkedList
- 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));
}
}
- 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);
}
}
集合框架
-
Collection接口----Colections工具类(如同Arrays是数组的工具类),下图是Collection所实现的类
-
ArrayList 与 Hashset
ArrayList是顺序插入,可以重复的动态数组,而Hashset是无序插入,不能重复的set(不同JVM导致看起来不一样) -
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) + "毫秒" );
}
}
}
}
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。