Java8新特性 有更新!

  |   0 评论   |   399 浏览

1.Java8对HashMap的更改

Java中的HashMap底层是一个数组,数组的每一项是一个Entry结构,其中存放了4个值,分别是key,value,hashcode和链表的next指针。在放入元素的时候会根据key对象的hashcode进行哈希运算,得到相应的数组的下标,如果运算出来的结果相同,则会调用对象的equals方法进行比较,如果比较的结果仍相同,则在数组的那一项的链表中会生成新的元素,原来数组那一项元素的next指针会指向新的Entry。

在Java8中,当HashMap的数组的链表中有长度大于8的并且数组的总长度大于64的,则对链表进行改造,变成红黑树。在添加元素的时候会进行比较,再根据比较的结果决定元素添加的位置。大的在右边。除了添加的时候效率稍微低一些,其他的操作效率都非常高。因为它不需要像链表那样挨个的去比较元素的大小,而是直接通过二叉树节点找出较大的元素。

2.撤销永久代,引入元空间

在 JDK 1.8 中,HotSpot 已经没有PermGen(永久代)这个空间了,取而代之是一个叫做 Metaspace(元空间) 的东西。

Java7中已经将字符串常量池从永久代移除,在Java 堆(Heap)中开辟了一块区域存放字符串常量池。而在Java8中,已经彻底没有了永久代,将方法区直接放在一个与堆不相连的本地内存区域,这个区域被叫做元空间。

移除永久代后,不会遇到永久代存在的内存溢出错误,也不会出现泄漏的数据移到交换区这样的事情。最终用户可以为元空间设置一个可用空间最大值,如果不进行设置,JVM会自动根据类的元数据大小动态增加元空间的容量。

这项改动是很有必要的,因为对永久代进行调优是很困难的。永久代中的元数据可能会随着每一次Full GC发生而进行移动。

1.Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

1.1.替代匿名内部类

public void test01(){
	Comparator<Integer> com = new Comparator<Integer>(){
		@Override
		public int compare(Integer o1, Integer o2) {
			return Integer.compare(o1, o2);
		}
	};
		
	TreeSet<Integer> ts = new TreeSet<Integer>(com);
}

public void test02(){
	Comparator<Integer> com = (x,y) -> Integer.compare(x, y);
	TreeSet<Integer> ts = new TreeSet<Integer>(com);
}

评论

发表评论