1、jdk1.8 HashMap数据结构优化。
hashmap 线程不安全,实现的是map接口,继承了abstract
hashtable线程安全,线程安全肯定是加了锁,继承Dictionary,此类都已经过时不用了
原来 数据结构是哈希表(数组+链表) 1.8后 数组+链表+红黑树 1、hashMap默认大小(数组容量)是16,一个0-15索引的数组
2、存储元素,经过equals方法比较内容,相同的话,会覆盖;不相同,后存储的放在前面,形成了一个链表,(形成碰撞)再某种情况下,如果链表无限下去,效率非常低
3、加载因子:0.75,数组扩容,达到总容量的75%,就进行扩容,但是无法避免碰撞的情况发生
4、在1.8之后,在数组+链表+红黑树来实现hashmap
5、碰撞超过限制(当碰撞的元素个数大于8(链表长度大于8)时 & (数组)总容量大于64),会加入红黑树,效率提高。
6、1.8之后链表新进元素加到末尾,ConcurrentHashMap (锁分段机制),concurrentLevel,jdk1.8采用CAS算法(无锁算法,不再使用锁分段),数组+链表中也引入了红黑树的使用
2、default关键字
接口里面可以写实现方法,不止是抽象类可以写了
public interface NewCharacter { public void test1(); public default void test2(){ System.out.println("我是新特性1"); } }
下面是实现类
public class NewCharacterImpl implements NewCharacter{ @Override public void test1() { } public static void main(String[] args) { NewCharacter nca = new NewCharacterImpl(); nca.test2(); } }
实现类可以直接调用接口中用default修饰的方法,例如上面的main方法;
好处是:default方法是所有的实现类都不需要去实现的就可以直接调用,那么比如说jdk的集合List里面增加了一个sort方法,那么如果定义为一个抽象方法,其所有的实现类如arrayList,LinkedList等都需要对其添加实现,那么现在用default定义一个默认的方法之后,其实现类可以直接使用这个方法了,这样不管是开发还是维护项目,都会大大简化代码量。
2、Lambda 表达式
是jdk1.8很重要的更新,函数式编程
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
3、函数表达式TODO
定义:“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。jdk1.8提供了一个@FunctionalInterface注解来定义函数式接口,如果我们定义的接口不符合函数式的规范便会报错。
@FunctionalInterface public interface MyLamda { public void test1(String y); //这里如果继续加一个抽象方法便会报错 // public void test1(); //default方法可以任意定义 default String test2(){ return "123"; } default String test3(){ return "123"; } //static方法也可以定义 static void test4(){ System.out.println("234"); } }
Lambda的调用
MyLamda m = y -> System.out.println("ss"+y);