Java语法糖

Java语法糖

Switch支持String与枚举

Java的switch自身支持int和char进行,int进行数值比较,char是比较ascii码。在Java7中支持String ,是通过switch 是通过equals()hashCode()方法来实现的,它比较的是哈希值,通过equals进行安全检查,会发生碰撞

泛型

参数类型用其左边界类型替换,移除所有的参数类型

泛型类型参数在编译时会被擦除,泛型类没有自己的List.class类对象,只有List.class

可变长参数

可变长参数在被使用时,其实是创建一个数组,数组的长度就是调用该方法的参数个数,再把参数放进数组中进行传递

枚举

使用enum来定义一个枚举类型,编译器会创建一个final类型继承Enum,该类是继承Enum类,同时final类修饰不能被继承

内部类

一旦编译成功,是两个不同的class文件

条件编译

在代码中,根据if判断条件真假,编译器直接将else代码块抹除

断言

public class AssertTest {
    public static void main(String args[]) {
        int a = 1;
        int b = 1;
        assert a == b;
        System.out.println("公众号:Hollis");
        assert a != b : "Hollis";
        System.out.println("博客:www.hollischuang.com");
    }
}

断言底层就是if语言,结果为true就什么都不做,为false就是抛出 AssertError 来打断程序的执行

数值字面量

在 java 7 中,数值字面量,不管是整数还是浮点数,都允许在数字之间插入任意多个下划线

反编译后就是把_删除了。也就是说 编译器并不认识在数字字面量中的_,需要在编译阶段把他去掉

public class Test {
    public static void main(String... args) {
        int i = 10_000;
        System.out.println(i);
    }
}

For-each

内部使用了普通的for循环和迭代器

try-with-resource

在finally中关闭资源的操作,编译器帮我们做了

可能遇到的坑

泛型

1.泛型遇到重载
public class GenericTypes {

    public static void method(List<String> list) {
        System.out.println("invoke method(List<String> list)");
    }

    public static void method(List<Integer> list) {
        System.out.println("invoke method(List<Integer> list)");
    }
}

编译是通过不了的,因为编译时泛型擦除,导致两个List集合参数

2.泛型遇到catch

因为泛型擦除的原因,JVM 是无法区分两个异常类型MyException<String>MyException<Integer>的,所以不能再catch块中使用泛型

3.泛型内包含静态变量
public class StaticTest{
    public static void main(String[] args){
        GT<Integer> gti = new GT<Integer>();
        gti.var=1;
        GT<String> gts = new GT<String>();
        gts.var=2;
        System.out.println(gti.var);
    }
}
class GT<T>{
    public static int var=0;
    public void nothing(T x){}
}

输出是2,经过泛型擦除后,对应到一份class文件gti.var和gts.var是一个变量

自动装箱和拆箱

public static void main(String[] args) {
    Integer a = 1000;
    Integer b = 1000;
    Integer c = 100;
    Integer d = 100;
    System.out.println("a == b is " + (a == b));
    System.out.println(("c == d is " + (c == d)));
}
a == b is false
c == d is true

==在比较引用类型,比较的是地址,但是有常量池,在-128~127之间的引用是相同的

增强for

for (Student stu : students) {
    if (stu.getId() == 2)
        students.remove(stu);
}
会抛出ConcurrentModificationException异常。

内部只能使用迭代器本身的方法进行修改不然会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值