Java是一种宽泛应用的计算机编程语言、面向对象、泛型编程的个性,广泛应用于企业级Web利用开发和挪动利用开发。
1995年3月23日Sun公司公布了Java,至今已有近26年,能够说是一门非常成熟的开发语言了,但在某些鲜为人知的中央存在着一些意料之外的个性。
Java的保留关键字 goto和const
在Java外面没有goto
这个性能,但它作为保留字是无奈当做变量来应用的,const
也是同样。
int goto = 0;int const = 0;
下面这两行代码的写法存在问题,无奈失常编译通过。
Java标签Label
下面说了在Java外面没有goto
这个性能,但为了解决多重循环引入了Label,目标是为了在多重循环中不便的应用 break 和coutinue ,但如同在其余中央也能够用。
outerLoop:while (true) { System.out.println("I'm the outer loop"); int i = 0; while (true) { System.out.println("I am the inner loop"); i++; if (i >= 3) { break outerLoop; } }}System.out.println("Complete the loop");// 输入I'm the outer loopI am the inner loopI am the inner loopI am the inner loopComplete the loop
test:{ System.out.println("hello"); if (true) { break test; // works } System.out.println("world");}// 输入hello
test:if (true) { System.out.println("hello"); if (true) { break test; // works } System.out.println("world");}// 输入hello
test:try { System.out.println("hello"); if (true) { break test; // works } System.out.println("world");} finally {}// 输入hello
Integer的是否相等问题
日常开发应用到Java根本数据类型是不可避免的一件事,但它却蕴含了一些很容易犯错的点,踩过一些坑的同学可能理解Java根本包装类型的常量池技术,例如Integer
就具备数值[-128,127]
的相应类型的缓存数据,但上面定义的4个变量是否相等你是否能说的进去呢?
Integer i1 = 127;Integer i2 = Integer.valueOf(127);Integer i3 = Integer.parseInt("127");Integer i4 = new Integer(127);System.out.println(i1 == i2);// trueSystem.out.println(i1 == i3);// trueSystem.out.println(i2 == i3);// trueSystem.out.println(i4 == i1);// falseSystem.out.println(i4 == i2);// falseSystem.out.println(i4 == i3);// false
Integer i1 = 127;
Java 在编译的时候会间接将代码优化为Integer i1=Integer.valueOf(127);
,从而应用常量池中的对象。Integer i2 = Integer.valueOf(127);
会从Integer缓存中获取。Integer.valueOf
源码如下。/** * 会从缓存数组中获取范畴为[-128, 127]的值,如果没有就创立一个新的对象。 */public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
Integer.parseInt("127");
返回值是 int数字,在[-128, 127]
范畴的会从常量池中获取。new Integer(127);
创立一个新的对象。
Integer对象的缓存值的大小范畴是在[-128 127]
区间。这意味着当咱们在此数值范畴内操作时,“==”
比拟能失常返回后果。但当数值不在此范畴,对象相等的比拟是否失常返回后果就很难说了。所以为了平安,在应用对象数值进行比拟相等时,请应用“.equals()”
,而不是依赖于“==”
比拟相等,除非你十分必定这种做法没有谬误。
思考一个问题,当变量的数值均为128
时会输入什么后果呢?
Double.MIN_VALUE 居然不是正数?
咱们可能是受了太多Integer
和Long
的影响,天经地义的认为Double.MIN_VALUE
应该是一个正数,但实际上Double.MIN_VALUE
是非0非负的最小值4.9E-324,Float
也是同样。如果你想要最小的Double类型的数字,请应用-Double.MAX_VALUE
。
System.out.println(Double.MAX_VALUE);// 1.7976931348623157E308System.out.println(Double.MIN_VALUE);// 4.9E-324System.out.println(Float.MAX_VALUE);// 3.4028235E38System.out.println(Float.MIN_VALUE);// 1.4E-45
应用 for 做死循环?
提到死循环大家都会想到while(true)
,但还有另一种写法 for(;;)
,在字节码层面他们会被编译为同样的内容,一些上古C/C++
程序员写Java的时候还会应用for(;;)
做死循环,遇到这样的敌人肯定要珍惜哦。
while (true){ // do something}
for(;;){ // do something}
下划线也能当做变量?
Object _ = new Object();System.out.println(_.toString());
在Java8中还能应用下划线当做变量,但在Java9之后就标记为不再反对,请珍惜和它的最初这段时光吧。
WTF!!! finally还能返回内容?
public class Finally { public int fun() { try { return 0; } finally { return 1; } } public static void main(String[] args) { Finally aFinally = new Finally(); System.out.println(aFinally.fun()); // 1 }}
面试的时候finally返回值坑了多少英雄好汉?
一个类能够有几个static代码块?
public class Static { static { System.out.println("hello"); } static { System.out.println("world"); } static { System.out.println("java"); } public static void main(String[] args) { }}// 输入helloworldjava
Java????????
final 类型肯定要申明的时候进行初始化吗?
对于final类型的变量不可批改是每一个Java开发的常识,申明变量的时候就要对其进行初始化,但真的是这样的吗?
public class Final { public static void main(String[] args) { final int a; if (args != null) { a = 0; } else { a = 1; } System.out.println(a); // 0 }}
是否有点违反认知了?