面试题首页 > Java基础面试题

Java语法面试题

001一个“.java”源文件中是否可以包含多个类(不是内部类)有什么限制?

可以;必须只有一个类名与文件名相同。

002byte的取值范围是多少,怎么计算出来的?

byte 的取值范围是 -128 -> 127 之间,一共是 256 位。一个 byte 类型在计算机中占据一个字节,那么就是 8 bit,所以最大就是 2^7 = 1111 1111。
Java 中用补码来表示二进制数,补码的最高位是符号位,最高位用 0 表示正数,最高位 1 表示负数,正数的补码就是其本身,由于最高位是符号位,所以正数表示的就是 0111 1111 ,也就是 127。最大负数就是 1111 1111,这其中会涉及到两个 0 ,一个 +0 ,一个 -0 ,+0 归为正数,也就是 0 ,-0 归为负数,也就是 -128,所以 byte 的范围就是 -128 – 127。

003在 Java 中,如何跳出当前的多重嵌套循环?

在最外层循环前加一个标记如outfor,然后用break outfor;可以跳出多重循环。例如以下代码:

public class TestBreak {
    public static void main(String[] args) {
        outfor: for (int i = 0; i < 10; i++){
            for (int j = 0; j < 10; j++){
                if (j == 5){
                    break outfor;
                }
                System.out.println("j = " + j);
            }
        }
    }
}

运行结果如下所示:

j = 0
j = 1
j = 2
j = 3
j = 4

004switch 是否能作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

早期的 JDK 中,switch(expr)中,expr 可以是 byte、short、char、int。从 1.5 版开始,Java 中引入了枚举类型(enum),expr 也可以是枚举,从 JDK 1.7 版开始,还可以是字符串(String)。长整型(long)是不可以的。

005 & 和 && 的区别?

&运算符是:逻辑与;&&运算符是:短路与。
1)&和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达式是一定会执行的。当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象,也就是说&&会更加的智能。这就是他们俩的本质区别。
2)当然,&运算符还可以使用在二进制位运算上,例如按位与操作。

006char 型变量中能不能存储一个中文汉字,为什么?

char 类型可以存储一个中文汉字,因为Java中使用的编码是Unicode编码,一个char 类型占2个字节(16 比特),所以放一个中文是没问题的。
补充:使用Unicode 意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是 Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。

007break ,continue ,return 的区别及作用

break 跳出总上一层循环,不再执行循环(结束当前的循环体) continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件) return 程序返回,不再执行下面的代码(结束当前的方法 直接返回) 另外在switch...case语句中,break不是必须的,但是会较大影响到运行结果。如果没有break,后面的一旦有case匹配成功,后面的case将无条件的向下执行其它的case。

008switch 是否能作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

早期的 JDK 中,switch(expr)中,expr 可以是 byte、short、char、int。从 1.5 版开始,Java 中引入了枚举类型(enum),expr 也可以是枚举,从 JDK 1.7 版开始,还可以是字符串(String)。长整型(long)是不可以的。

009Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?

Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行取整。

010short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗?

前者不正确,后者正确。
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

011数组有没有length()方法?String有没有length()方法?

Java中的数组没有length()方法,但是有length属性。String有length()方法。

012用最有效率的方法计算2乘以8?

2 << 3,将2左移3位

013下面 Integer 类型的数值比较输出的结果为?

public class Test{
    public static void main(String[] args) {
       Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2);
       System.out.println(f3 == f4);
    }
}

f1==f2的结果是 true,而f3==f4 的结果是false。为什么呢?先来说说装箱的本质。当我们给一个Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf,如果看看valueOf的源代码就知道发生了什么。如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer 对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是 true,而f3==f4 的结果是false。

014int 和 Integer 有什么区别?

Java 的JDK从 1.5 开始引入了自动装箱/拆箱机制。它为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是 Integer,其它基本类型对应的包装类如下:
原始类型: boolean,char,byte,short,int,long,float,double包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

015什么是方法的返回值?返回值的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能 产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

016如何将数值型字符转换为数字?

调用数值类型相应包装类中的方法 parse***(String)或 valueOf(String) 即可返回相应基本类型或包装类型数值;

017如何将数字转换为字符?

将数字与空字符串相加即可获得其所对应的字符串;另外对于基本类型 数字还可调用 String 类中的 valueOf(…)方法返回相应字符串,而对于包装类型数字则可调用其 toString()方法获得相应字符串;

018如何取小数点前两位并四舍五入?

可用该数字构造一 java.math.BigDecimal 对象,再利用其 round()方法 进行四舍五入到保留小数点后两位,再将其转换为字符串截取最后两位。

0193*0.1 == 0.3 将会返回什么? true 还是 false?

false,因为有些浮点数不能完全精确的表示出来。

020Java移位运算符?

java中有三种移位运算符 
<< :左移运算符,x << 1,相当于x乘以2(不溢出的情况下),低位补0 
>> :带符号右移,x >> 1,相当于x除以2,正数高位补0,负数高位补1 
>>> :无符号右移,忽略符号位,空位都以0补齐

021如何理解Java中的泛型是伪泛型?

泛型中类型擦除 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。

022注解的作用?

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面: 生成文档,通过代码里标识的元数据生成javadoc文档。 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

023注解的常见分类?

Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。 
元注解:元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented @Retention用于标明注解被保留的阶段 @Target用于标明注解使用的范围 @Inherited用于标明注解可继承 @Documented用于标明是否生成javadoc文档 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

目录

返回顶部