本文写给正在努力的自己,努力的补基础知识,五道题一篇
- 整数类型奇怪的127和128
以下输出结果为true还是false
public static void main(String[] args) {
Integer n1 = new Integer(2);
Integer n2 = new Integer(2);
Integer n3 = 127;
Integer n4 = 127;
Integer n5 = 128;
Integer n6 = 128;
System.out.println(n1 == n2);
System.out.println(n3 == n4);
System.out.println(n5 == n6);
}
解析
实际上在-128到127之间只要不new对象数值一样就不会产生新的地址值,通过debug运行可看到当数值超过127时将会有新的地址值
以下是我找到其他博主的解释
自动装箱:就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。
Java自动装箱的优点:对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回这个对象(地址),不需要再创建一个新的Integer对象,否则创建新的Integer对象
Java自动装箱的缺点:因为自动装箱会隐式地创建对象,像前面提到的那样,如果在一个循环体中,会创建无用的中间对象,这样会增加GC压力,拉低程序的性能。所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作
- 不同数据类型相加
//若有定义语句
int a = 1;
double b = 2.33;
char c = 'a';
那么a+b得到什么数据类型,那么a+c得到什么数据类型,那么b+c得到什么数据类型,那么a+b+c得到什么数据类型?
double v = a + b;
int i = a + c;
double v1 = b + c;
double v2 = a + b + c;
这道题跟数据类型的等级有关,总结了一下,char<short<int<float<double,当低级的跟高级的相加,将会变成高级的数据类型
- 以下哪行代码会报空指针异常
String s = null;
if ((s!= null)&(s.length()>0));
if ((s!=null)&&(s.length()>0));
if ((s!=null)|(s.length()==0));
if ((s!=null)||(s.length()==0));
做这道题之前,我们先了解一下&和&&的区别还有|和||的区别:
一 , &的可以作为位运算符和判断条件使用,而&&只能作为判断条件使用
二, 当他们均作为判断条件使用时,&&:若前错则短路跳过此次判断直接返回false,而&则会将前后都判断一次
我们知道2/0时一定会报ArithmeticException错, 但是当我们使用&&时,前半段为false,所以跳过后半段直接判定为false。
|和||也是一样的道理,总结一下,当作为判断符号使用时,一个老头就要挑两桶水,两个老头就开始偷懒了,只看前面的条件,如果前面是对的才看后面的条件
- 关于异常处理的描述中,错误的是()。
A:程序运行时异常又java虚拟机自动进行处理
B:使用try-catch-finally 语句捕获异常
C:可使用throw语句抛出异常
D:捕获的异常只能在当前方法中处理,不能在其他方法中处理
解析:编译时异常必须显示处理,运行时异常交给虚拟机。
运行时异常可以不处理。当出现这样的异常时,总是由虚拟机接管。比如我们从来没有人去处理过Null Pointer Exception异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往不对它处理罢了。也就是说,如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
- 当不告诉你a,b的数据类型时分析其数据类型是以及他们的数值是否相等
a = Integer.parseInt("1024");
b = Integer.valueOf("1024").intValue();
答案:a和b都是整数类型变量并且他们的值相等
解析:intValue()是把Integer对象类型变成int的基础数据类型;
parseInt()是把String变成int的基础数据类型;
Valueof()是把String转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)
本题:parseInt得到的是基础数据类型int,valueof得到的是装箱数据类型Integer,然后再通过valueInt转换成int