Java 面试中你最易忽略9道的程序题
来源:互联网 发布:网易云音乐 知乎 编辑:程序博客网 时间:2024/05/17 11:34
1.理解int型取值范围
public class INTVALUE { public static void main(String[] args) { long max = Integer.MAX_VALUE + 1; long min = Integer.MIN_VALUE - 1; System.out.println("int型最大值加1:"+max); System.out.println("int型最小值减1:"+min); }}
程序运行结果:
int型最大值加1:-2147483648
int型最小值减1:2147483647
可以发现最大值加上1,结果变成了最小值;当最小值减去1,结果变成了最大值;以上情况就是数据类型的溢出。
2.得到精确结果
public class Rigorous { public static void main(String[] args) { double d = 10.00; double f = 9.30; System.out.println(d-f); }}
结果不是0.7哟,而是0.6999999999999993
要想得到准确的结果可以使用BigDecimal类
import java.math.BigDecimal;public class BigDecimalDemo { public static void main(String[] args) { BigDecimal d = new BigDecimal("10.0"); BigDecimal f = new BigDecimal("9.3"); BigDecimal sub = d.subtract(f); double ret = sub.doubleValue(); System.out.println(ret); }}
此时结果为0.7,但是此方法复杂且运行速度慢。
public class SwitchLong { public static void main(String[] args) { double d = 10.00 ; double f = 9.30 ; long d1 = (long) (d*100); long f1 = (long) (f*100); double ret = (d1-f1)/100.0; System.out.println(ret); }}
答案同样是0.7,此方法是先将浮点型转换为整型计算后,再将整型转换为浮点型。
3.请写出以下代码运行结果
public class LongDemo { public static void main(String[] args) { long l = 2147283640 * 10; System.out.println(l); }}
答案是-2000080 而不是 21472836400 。这是因为在
long l = 2147283640 * 10; 中2147283640还在int型的取值范围内,所以不加L是不会出编译错误的,但*10后的结果早早就超出了int型的取值范围,造成了数据类型的溢出。以后要声明一个long型变量,最好在其值后加上L。
4.关于if语句
public class TestIf { public static void main(String[] args) { int a=3,b=4,c=7; if (a+b>c) if(++a==b) System.out.println(++a); else System.out.println(a++); }}
答案是没有任何输出,这是因为if(a+b>c) //a+b>c返回的是false,所以后面的所有语句都不会执行。
public class TestIf2 { public static void main(String[] args) { int i=1; double j=1.0; float k=1.0f; if (i==j && i==k && j==k) { System.out.println("i=j=k"); } }}
输出结果i=j=k.对于基本数据类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
5.使用foreach循环输出时的注意事项
public class TestForEach { public static void main(String[] args) { String language[] = new String[] {"aaaa","bbbb","cccc","dddd"}; for (String lang : language) { lang = "abcd"; } for (String lang : language) { System.out.print(lang+" "); } }}
程序输出结果:aaaa bbbb cccc dddd
使用foreach语句循环时,不能通过循环变量来改变数组或者集合元素的值。
6.形参个数可变的方法
public class ChangeArgs { public static void main(String[] args) { System.out.println("传入一个参数:"); print("Java"); System.out.println("\n传入两个参数:"); print("Java","C"); System.out.println("\n传入三个参数:"); print("Java","C","C++"); } //定义可变参数的方法 public static void print(String ... str){ for (String string : str) { System.out.print(string+" "); } }}
程序结果:
传入一个参数:
Java
传入两个参数:
Java C
传入三个参数:
Java C C++
在JDK1.5之后Java语言提供一个新的概念——可变参数。可变参数是允许为方法指定不再固定数目的参数,可以根据需要传入多个参数。
7.关于字符串
public class TestString { public static void main(String[] args) { String str1 = "Hello"; String str2 = "World"; String str3 = "HelloWorld"; //str1+str2 两个变量相加,相当于//(newStringBuilder(String.valueOf(s1))).append(s2).toString(); //运行时会有新的地址空间的分配。为false System.out.println(str3==str1+str2); //和上面是相同的原理,会有新的地址空间的分配 System.out.println(str3==str1+"World"); //+两边都是字符串常量,Java系统先把两个字符串拼接起来, //然后到常量池中去找是否有相同内容的字符串 //上面str3内容即为HelloWorld,找到后就把str3的地址返回。结果为true。 System.out.println(str3=="Hello"+"World"); }}
8.静态成员的调用
下面两个程序可以编译并运行的是
public class TestStatic01 { public static int add(int x){ int y; if(x>0){ y=10; } return x+y; } public static void main(String[] args) { System.out.println(add(5)); }}
public class TestStatic02 { public static int add(int x){ int y; if(x>0){ y=10; }else { y=0; } return x+y; } public static void main(String[] args) { System.out.println(add(5)); }}
第一个在编译时会报错,局部变量必须经过初始化后才能使用,第二个程序y在使用前已经确保会被初始化。
9.普通代码块
下面代码能够正常编译?
public class CodeBlock { public static void main(String[] args) { int x=5; System.out.println(x); { int x=3; System.out.println(x); } }}
直接在一个方法或语句中出现的{ }就称为普通代码块。
此程序中代码块是在main()方法的作用域内定义的,在同一个作用域中,一个变量只能定义一次。
- Java 面试中你最易忽略9道的程序题
- Java编程中最容易忽略的10个问题
- Java编程中最容易忽略的10个问题
- java.lang.NoSuchMethodException:最易忽略的地方
- java学习中易忽略的知识
- 最容易忽略的的前端面试基础题目
- java--你可能忽略的细节(一)
- java--你可能忽略的细节(二)
- 程序中可能忽略了你,并不是我不在乎!
- java 中你可能忽略或者还不是很明白的== 和 .equals()
- JAVA WEB面试中最常见的面试题解答
- java中最常见的面试问题<1>
- Java中一些易忽略方法的使用技巧
- 最基础的java面试
- Java常容易忽略的知识点面试点
- SEO优化中站长最容易忽略的地方
- java中容易忽略的shuffle用法
- java中容易忽略的shuffle用法
- 关于Designated, Convenience 和 Required 区别
- 取每个组中的单条数据
- 消息的传输控制拒绝和英达
- java获取选中月份的最后一天!
- Java笔记整理:对象
- Java 面试中你最易忽略9道的程序题
- spring 如何决定使用jdk动态代理和cglib(网易面试题)
- C++ Primer(一)
- AnyRTC : 这一次我们重新定义连麦直播
- linux 下如何添加快捷键
- excle表格导出-MVC
- editplus连接服务器530错误
- linux(arm架构)内存管理学习(1)
- table复选框全选功能