java中语法糖特性

在java中很多语法使用方式让人感觉都特别的奇怪。
下面就来介绍以下在java中一些比较 “调皮” 的使用方式,我们称之为语法糖。

静态引入:

     学过java的同学都知道,使用一个外部类,之前需要导入包。
一般我们导入的方式是,例如: import java.lang.Math*。之后我们就可以使用Math对象去调用该类的方法了,当然这里因为Math对象是java.lang包的类,所以我们不导入也是可以使用的。
     但是这种引入方式你是否使用过呢?例如:import static java.lang.Math.*; 这种引入方式你就在需要使用Math.abs(-324)了,而是直接使用abs(-324);是不是就是特别方便呢。
注意:但是这种方式有一个特别不好的地方就是,如果你自己也定义了一个同名的方法,这时候就会混淆了。因此虽然有这种方式但是并不推荐使用。



可变参数:

一般我们声明一个方法,形参中有数组类型是这样声明的。

public void test (String[] arr){

}

你是否使用过以下这种方式呢?

public void test(String . .  . arr){

}

总结:其上以上String…arr这种方式和String[ ] arr的效果是一样的,因为String …arr的的底层就是使用String[ ] arr。通过反编译课验证。



for-each:

for-each操作数组修改数组数据为什么不会影响元数据?
意思就是通过for-each的方式去修改数组中的元素,例如:

	int arr[]= {2,3,4};
		
		for(int t:arr) {
			t=232222;
			System.out.println(t);
		}
		
		//通过t修改之后,再遍历arr
		for(int tmp:arr) {
			System.out.println(tmp);
		}

输出结果:
232222
232222
232222
2
3
4

为什么这里修改tmp的值,arr数组中的值不会被修改呢?
让我们来看看与之相对应反编译后的代码:

int[] arr = new int[]{2, 3, 4};
		int[] var5 = arr;
		int var4 = arr.length;

		int t;
		int var3;
		for (var3 = 0; var3 < var4; ++var3) {
			int var10000 = var5[var3];
			t= 232222;
			System.out.println(t);
		}
		
		//通过t修改之后,再遍历arr
		var5 = arr;
		var4 = arr.length;

		for (var3 = 0; var3 < var4; ++var3) {
			tmp = var5[var3];
			System.out.println(tmp);
		}

结论:原来for-each内部使用的还是普通的for循环遍历的,至于为什么我们修改了t的值,对arr数组的元素没有影响。我们从反编译的代码可以看出,t是另外再声明出来的变量,而且这里又是基本数据类型,因此这里并不是修改的数组中的元素,因此是不会修改到元数据的。



java中的基本数据类型的包装数据类型的缓存机制

这个语法糖就比较有意思了,相信对于刚开始学java的同学来说,也是百思不得其解的地方。
举个例子:

	Integer a=100;
	Integer b=100;
		
	Integer c=200;
	Integer d=200;
		
	System.out.println(a==b);
	System.out.println(c==d);

输出结果:
true
false

相信很多同学在看到这个结果的时候,忍不住爆一句粗口了。

别急为什么会造成这种情况呢?这就是因为 java中包装数据类型的缓存机制 造成的。

Integer的部分源码:

 private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

结论: 从上面的源码可以看出在对于-128到127范围的数字,java对其作了优化,在该范围中包装类型Integer创建出来的对象指向的是同一个对象。

注意:除了Integer类,Byte、Short、Long、Character。包装类也有缓存机制,需要注意的是只有Character的缓存范围是在0到128。





以上就是对java中一些常见的语法糖的介绍了,希望对你有所帮助。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java语法糖是指Java语言为了更方便开发者使用而提供的一些特性,这些特性本质上并不会改变Java语言的运行机制,而是通过编译器或运行时库等方式将这些语法糖转换为Java语言本身能够识别的代码。这些语法糖的目的是为了简化代码的写法,让代码更易于理解和维护。 一些典型的Java语法糖包括: - 自动装箱与拆箱:可以在Java代码直接使用基本数据类型,而无需手动创建对应的包装类对象。 - for-each循环:可以直接遍历数组或集合的所有元素,而无需使用下标或迭代器。 - 可变参数列表:可以将一组参数封装为数组传递给方法,而无需手动创建数组。 - Lambda表达式:可以创建简单的匿名函数,而无需定义单独的函数对象。 这些语法糖都是在编译期间转换为Java语言本身的特性,因此不会对程序的性能造成影响。 ### 回答2: Java语法糖是指在Java编程语言的一些语法上的改进和简化,它使得代码更加易读、简洁和易于理解。语法糖不是新增加的语言功能,而是对现有功能的语法上的改良。 一个常见的Java语法糖是自动装箱和拆箱。在Java 1.5之前,基本类型(如int、float等)和它们对应的包装类(如Integer、Float等)之间不能直接进行赋值或比较操作,需要通过手动装箱和拆箱的方式。但通过语法糖的改进,现在可以直接在基本类型和对应的包装类之间进行自动转换,使得代码更加简洁和优雅。 另一个例子是增强的for循环。在Java 1.5之前,遍历数组或集合需要使用传统的for循环,并且需要手动获取和指定迭代器。而通过语法糖的改进,现在可以使用更加简洁的增强的for循环,将原始的方法调用、初始化和变量声明过程都隐藏在背后,使得代码更加易读和简洁。 还有一些其他的语法糖,如可变参数、枚举类型、Lambda表达式等,它们都是通过简化和优化语法上的表示方式,提高代码的可读性和可维护性。 需要注意的是,尽管语法糖使得代码更加简洁,但底层执行的逻辑并没有改变。编译器会将语法糖转换为等价的原始代码,然后再进行编译和执行。所以在阅读和理解代码时,还是需要了解底层的语言特性和实现细节。 ### 回答3: Java语法糖是一种语法的简化形式,它能够使得代码更加易读易写,并且不会增加程序的运行效率。 在Java语言,有些常见的操作会使用较为繁琐的语法去实现,为了简化这些操作的写法,Java引入了语法糖语法糖并不是一种新的特性或者语法规则,而是一种编译器提供的功能,可以将一些常见的代码模式转化为更简洁的语法结构。 常见的Java语法糖包括自动拆装箱、泛型、枚举类型、增强的for循环以及可变参数等。通过使用这些语法糖,可以使得代码更加简洁易读,并且减少了一些常见错误的发生。 比如,自动拆装箱允许我们在基本类型和包装类型之间进行自动的转换,不需要手动进行转换操作。使用泛型可以在编译时进行类型检查,避免了类型转换的错误。枚举类型提供了更好的可读性和类型安全性。增强的for循环可以简化对数组和集合的迭代操作。可变参数允许我们以更方便的方式传递不定数量的参数。 尽管语法糖提供了更加简洁的写法,但是在编译过程,这些语法糖都会被转化为等价的标准Java代码,所以对于程序的运行效率没有实质的影响。 总的来说,Java语法糖使得代码更加易读易写,并且减少了一些常见错误的发生,提高了程序的可维护性和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值