【Java】-java版本特性

概述和文章大纲表

目的:在了解Java版本特性的同时,学习Java语言封装的类和方法等等,夯实语言基础。

java特性相关设计
特性1查找的快捷设计hashcode,String类两个方法,util工具类库
特性2二进制 0b 字面量,数字分隔符_
特性3try-with-resource解决 内存泄漏和异常屏蔽问题
特性4

Java 7新增特性

switch中添加对String类型的支持

详情见 Java 7~14各个版本新特性详解 ,简单地说:switch有多个case时,先将String转换为hashCode,然后相应的进行处理,JavaCode在底层兼容Java7曾经版本号。

类String
String.hashCode()用于返回字符串的哈希码,计算过程见 Java hashCode() 方法,设计原理见 Java中hashCode的作用,用来在散列存储结构中确定对象的存储地址,主要用于 查找的快捷性

相关String.equals(),String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等,详情参考 Java String equals() 方法

实用工具类库 java.util
在这个包中,Java提供了一些实用的方法和数据结构,详情参考 java.util包详解

java.util 提供的类用途说明
日期(Data)类、日历(Calendar)类来产生和获取日期及时间
随机数(Random)类产生各种类型的随机数
堆栈(Stack)-
向量(Vector)-
位集合(Bitset)-
哈希表(Hashtable)-
等等类来表示相应的数据结构
数字字面量的改进 / 数值可加下划

参考 Java 7~14各个版本新特性详解字面量_百度百科
字面量:在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。

Java7前支持十进制(123)、八进制(0123)、十六进制(0X12AB)。Java7添加二进制表示(0B11110001、0b11110001)。

Java7中支持在数字量中间添加’_'作为分隔符。更直观,如(12_123_456)。下划线仅仅能在数字中间。编译时编译器自己主动删除数字中的下划线。

int one_million = 1_000_000;

异常处理(捕获多个异常) try-with-resources

参考 Java基础之try-with-resource语法糖为什么推荐使用try-with-resources代替try-finally

catch子句能够同一时候捕获多个异常

public void testSequence() { 
	 try { 
		 Integer.parseInt("Hello"); 
	 } catch (NumberFormatException | RuntimeException e) { 
	 //使用'|'切割,多个类型,一个对象e 
	 } 
 } 

try-with-resources,涉及 Java内存管理 和 异常处理 两部分。

在Java使用资源必须手动调用.close()关闭资源,否则会产生 Java内存泄漏问题,可能会严重影响性能。关闭的方法有很多种。比如finalizer、try-catch-finally、try-with-resources等等。

try-catch-finally 语句有两个问题:
在 try 语句中调用资源,就必须在 finally 语句中手动关闭资源,如果使用了多个 try 语句,那么就会导致代码复杂不美观的问题。
如果 catch 语块 和 finally 语块同时发生 exception,那么会产生 异常屏蔽

Java内存泄漏问题:不再会被使用的对象的内存没有回收。
异常屏蔽:由于我们一次只能抛出一个异常,所以在最上层看到的是最后一个抛出的异常,可能会导致某些bug变得极其难以发现。

正题:try-with-resources是jdk1.7引入的语法糖,使用编译器自动关闭资源,使得关闭资源操作无需层层嵌套在finally,同时避免了可能的 Java内存泄漏 问题。并且使用 AutoCloseable接口 解决了异常屏蔽 问题。

语句格式
try-catch-finally语句try {}catch{}finally{}
try-with-resources语句try(资源调用){}
增强泛型推断

参考 什么是Java的泛型Java总结篇系列:Java泛型,讲述特别清晰。

泛型
JDK1.5后出现了泛型,用于解决集合框架的安全问题,泛型是一个类型安全机制。

看一段实例代码,先后向 List 对象插入 String 和 Integer 两种类型,这是完全允许的,因为此时list默认的类型为Object类型。编译阶段正常,但运行时会抛出异常 java.lang.ClassCastException ,导致此类错误编码过程中不易发现。

public class GenericTest {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);

        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i); // 1
            System.out.println("name:" + name);
        }
    }
}

在如上的编码过程中,我们发现主要存在两个问题:

1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。

2.因此,//1处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。

那么有没有什么办法可以使集合能够记住集合内元素各类型,且能够达到只要编译时不出现问题,运行时就不会出现“java.lang.ClassCastException”异常呢?答案就是 使用泛型

泛型,即“参数化类型”。在创建 List 对象时定义元素类型,这样再插入其它类型元素时编译阶段就会报错。

	List<String> list = new ArrayList<String>();
	list.add("qqyumidi");
	list.add("corn");
	//list.add(100);   // 1  提示编译错误

java7之前应用泛型:Map<String, List> map = new HashMap<String, List>();
java7后应用泛型:Map<String, List> anagrams = new HashMap<>();

NIO2.0(AIO)新IO的支持
JSR292与InvokeDynamic
Path接口(重要接口更新)
fork/join计算框架

Java 8新增特性

Java 8可谓是自Java 5以来最具革命性的版本了,它在语言、编译器、类库、开发工具以及Java虚拟机等方面都带来了不少新特性。

参考

Java 7~14各个版本新特性详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值