java 5新特性_java5新特性简单介绍

新特性介绍

java5是2004年9月份发布的,主要特性有泛型,枚举,可变参数,注解等。

泛型

先看一下泛型的简单使用

public class Client {

public static void main(String[] args) {

List names = new ArrayList();

names.add("lisi");

String name = names.get(0);

System.out.println(name);

}

}

在java5之前的使用形式为

public class Client {

public static void main(String[] args) {

List names = new ArrayList();

names.add("lisi");

String name = (String) names.get(0);

System.out.println(name);

}

}

我们不能确定List集合中可以放什么类型的元素,在类型转换时就可能出错。

我们看一下java5版本例子反编译的结果

public class Client {

public static void main(String[] args) {

List names = new ArrayList();

names.add("lisi");

String name = (String)names.get(0);

System.out.println(name);

}

}

可以看到反编译之后就没有泛型了,这个就是类型擦除,泛型信息只会在编译期存在,编译后的字节码中不会保存。

枚举

public enum UserGenderEnum {

MALE("0", "男"),

FEMALE("1", "女"),

NOT_KNOWN("2", "未知");

private final String code;

private final String info;

UserGenderEnum(String code, String info) {

this.code = code;

this.info = info;

}

public String getCode() {

return code;

}

public String getInfo() {

return info;

}

}

public class Client {

public static void main(String[] args) {

EnumMap enumMap = new EnumMap<>(UserGenderEnum.class);

enumMap.put(UserGenderEnum.MALE, "male");

System.out.println(enumMap.get(UserGenderEnum.MALE));

UserGenderEnum male = UserGenderEnum.MALE;

switch (male) {

case MALE:

System.out.println("male");

break;

case FEMALE:

System.out.println("female");

break;

case NOT_KNOWN:

System.out.println("not_known");

break;

}

}

}

枚举的使用还是很简单的,Enum是所有枚举都会继承的抽象类,EnumMap,EnumSet是java提供的工具类,java也提供了对枚举的switch的支持,关于枚举的更多原理,请看枚举这篇博客。

自动装箱和拆箱

装箱就是primitive类型转成对应的wrapper类型,拆箱就是反过来,Boolean,Byte,Character,Integer,Short,Long,Double,Float

下面以int和Integer来演示

public class Client {

public static void main(String[] args) {

Integer score = 98;//自动装箱

System.out.println(score);

int newScore = score + 2;//自动拆箱

System.out.println(newScore);

}

}

看一下反编译结果

public class Client {

public static void main(String[] args) {

Integer score = Integer.valueOf((int)98);

System.out.println((Object)score);

int newScore = score.intValue() + 2;

System.out.println((int)newScore);

}

}

可以看到自动装箱就是编译器帮我们调用了valueOf方法,拆箱就是调用了intValue方法。

可变参数

public class Client {

public static void main(String[] args) {

System.out.println(sum(1, 2, 3));

}

private static int sum(int... nums) {

int sum = 0;

for (int i = 0; i < nums.length; i++) {

sum += nums[i];

}

return sum;

}

}

反编译结果

public class Client{

public Client(){

}

public static void main(String args[]){

System.out.println(sum(new int[] {

1, 2, 3

}));

}

private static transient int sum(int nums[]){

int sum = 0;

for(int i = 0; i < nums.length; i++)

sum += nums[i];

return sum;

}

}

可以看到可变参数的本质就是数组。

增强for循环

public class Client {

public static void main(String[] args) {

int[] nums = {1, 2, 3, 4};

for (int num : nums) {

System.out.println(num);

}

List nameList = new ArrayList<>();

nameList.add("lisi");

nameList.add("zhangsan");

nameList.add("wangwu");

for (String name : nameList) {

System.out.println(name);

}

}

}

反编译结果为

public class Client{

public Client(){

}

public static void main(String args[]){

int nums[] = {

1, 2, 3, 4

};

int ai[] = nums;

int i = ai.length;

for(int j = 0; j < i; j++){

int num = ai[j];

System.out.println(num);

}

List nameList = new ArrayList();

nameList.add("lisi");

nameList.add("zhangsan");

nameList.add("wangwu");

String name;

for(Iterator iterator = nameList.iterator(); iterator.hasNext(); System.out.println(name))

name = (String)iterator.next();

}

}

可以看到增强for循环也是语法糖。

注解

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Log {

String value();

}

@Log("hello")

public class User {

}

public class Client {

public static void main(String[] args) {

Log log = User.class.getAnnotation(Log.class);

System.out.println(log.value());

}

}

结果为

hello

静态导入

import static java.lang.Math.PI;

import static java.lang.Math.max;

public class Client {

public static void main(String[] args) {

System.out.println(max(2, 5));

System.out.println(PI);

}

}

反编译结果为

public class Client{

public Client(){

}

public static void main(String args[]){

System.out.println(Math.max(2, 5));

System.out.println(3.1415926535897931D);

}

}

还是语法糖。

并发支持(JUC类库)

提供了一些原子类如AtomicInteger,线程池工具Executors,线程安全的容器ConcurrentHashMap等。

java.lang.instrument类库

具体可以看这篇这篇

StringBuilder

非线程安全的字符串连接工具

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值