java面试张怡

Java基础部分

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

可以有多个类,但是只有一个public类,并且public的类名必须和文件名相一致

2. java中有没有goto

java中的goto作为保留字,现在没有在java中使用,在c++中goto是用来跳出多层循环的,以后java也可能会使用goto作为关键字,所以现在先将其保留。

3. 说说&(逻辑与)和&&(简洁与)的区别

相同点:

都可以用作逻辑与的运算符,表示当符号两边的表达式的值都为true时,结果才为true,否则结果为false。

不同点:

  1. &&具有短路功能,当&&的左边表达式的值为为false时,右边的表达式不执行,例如:if(str != null && str.equals(“”)),当str为null时,左边为false,那么右边不执行,不会报出NullPointerExcepetion,如果将&&改为&,那么就会抛出NullPointerExcepetion

  2. 当&左右两边的表达式的值不是boolean类型时,那么&表示的是按位与操作

4. 在java中如何跳出当前的多重嵌套循环?

  1. 在java中,要想跳出多重循环,可以在外面循环语句前面定义一个标号,然后再里层的代码中使用带标号的break语句,既可以跳出外层循环,例如:
ok:
for(int x = 0; x < 10; x++){
    for(int y = 5; y++){
        System.out.println("x:" + x + "," + "y:" + y);
        if(y == 3){
            break ok;
        }
    }
}

2.另外我个人不使用这种方式,而是让外层的循环表达式的结果可以受到内层循环的控制,例如要在二维数组中查询某个数

int arr[][] = {{123},{4567},{9}};
boolean found = false;
for(int i = 0; i < arr.length && !found;i++){
    for(int j = 0; j < arr[i].length; j++){
        System.out.println("i=" + i + "," + "j=" + j);
        if(arr[i][j] == 5){
            found = true;
            break;
        }
    }
}

5.switch语句能否作用于byte上,能否作用于long上,能否作用于String上?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达是可以是int基本类型或者interger包装类型,而char,short,byte类型及其包装类型可以隐性的转换成int类型,所以可以作用于这些类型,而long,String类型是不符合switch的语法的。

6.short s1 = 1; short s1 = s1 +1;有什么错?short s1 = 1; short s1 += 1;有什么错?

第一个s1 + 1,表达式的值得类型从short类型自动转换成了int类型,然后把一个int类型的值赋值给short类型的变量,编译器会报需要强制类型转换的错。
第二个s1 += 1,+=号是java定义的运算符号,会自动的进行类型转化,所以不报错。

7.char类型的变量能不能储存汉字,为什么?

char类型的变量可以储存汉子,char类型变量是用来储存Unicode编码的字符的,而Unicode字符集中包含了汉字,不过如果某个特殊的汉字没有被包含在Unicode字符集中,那么就不能用char类型变量来储存这个汉字。
值得一提的是:Unicode编码的字符集占用两个字节,所以char类型的变量也占用两个字节

扩展:java中基本类型占用的字节数

1个字节 byte boolean类型
2个字节 short char类型
4个字节 int float类型
8个字节 long double类型

扩展:编码与中文

Unicode/GBK 中文两个字节
UTF-8 中文通常3个字节,在扩展b区之后为4个字节
综上中文在编码中一般是2-4个字节

8.用最有效的方法计算出2乘以8的值?

2<<3,将一个数左移n位的运算规则是,将这个数乘以2的n次方。

扩展:移位运算符

“<<”:从左边最高位开始舍弃,右边补0
“>>”:从右边最低位开始舍弃,左边最高为0补0,最高位为1补1
“>>>”:无论左边最高为几,都补0

值得注意的是
当某类型的数移动的位数大于该类型数的类数的位数总数,那么java编译器会对移动位数取模,如int类型的数移动33位,则实际移动了一位,如果移动32位,那么就没有移动。

9.请设计一个100亿的计算机

10.使用final关键字修饰一个变量的时候,是引用不能变还是引用的对象不能变?

是指引用不能变,引用所指向的对象是可以改变的
例如:
final StringBuffer a = new StringBuffer(“abc”);
a = new StringBuffer(“def”);
这样编译报错,这个引用被final定义,那么他所代表的指向的内存中地址值是不能改变的。
而a.append(“def”);是可以的
可以说final修饰引用变量是限定引用变量所指向的内存中地址值不能改变

11.==和equals方法有什么区别

==号运算符

是用来比较两个变量的值是不是相等,如果变量是引用变量,那么比较的就是变量所指向的地址值是不是相同。

而equals方法

常常用于比较两个对象的内容是不是相同,如两个字符串变量用equals方法比较,比较的就是两个字符串的内容是不是相同,如:
String a = new String(“foo”);
String b = new String(“foo”);
a == b false
a.equals(b) true
不过equals能够比较字符串内容的原理是因为String类中重写了equals方法,使得字符串类型的比较是比较其内容是不是相同所以如果一个类没用重写equals方法,那么他将继承Object类中的equals方法,Object类中的equals方法源码是将两个变量==比较,这时候equals和==的作用一样

12.静态变量和实例变量的区别?

13.是否可以从一个static方法内部发出对非static方法的调用?

不可以,因为非static方法是和对象相关联的,必须创建一个对象,然后通过这个对象调用非static的方法,而static方法是和类相关联的,在调用时不需要创建对象,可以直接调用,也就是说一个static方法被调用的时候,可能还没有创建任何实例对象,所以从static方法中调用一个非static方法在逻辑上是无法成立的,编译时也会报错。

14.Integer和int的区别?

1.int是java提供的8种原始的数据类型之一。而Integer是java为int提供的封装类。
2.int的默认值为0,而integer的默认值为null,即Integer可以区分未赋值和赋值为0的区别,而int无法表达出为赋值的情况,例如想要表达出没有参加考试和考试成绩为0分的情况,要使用Interger。
3.在jsp开发中,Interger的默认为null,所以用el表达式在文本框中显示的时候,值为空白字符串,而int的默认值为0,所以用el表达式在文本框中显示的时候,结果为0,所以int不适合作为web层的表单数据的类型。
4.在Hibernate中,如果将OID定义为Interger类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,那么还需要在hbm映射文件中设置器unsaved—value属性为0。
5.另外,Interger提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Interger中还定义了表示整数的最大值和最小值的常量。

15.Math.round(11.5)等于?Math.round(-11.5)等于?

Math.ceil()

ceil的意思是天花板,所以该方法就表示向上(向上向下结合数轴联想)取整。如Math.ceil(11.3) = 12;Math.ceil(-11.7) = -11.

Math.floor()

floor的意思是地板,所以该方法的就表示向下取整。如Math.floor(11.7) = 11;
Math.floor(-11.3) = -12.

Math.round()

round的意思表示圆,这个方法表示4舍5入,算法为Math.round(x) = Math.floor(x + 0.5),即原来的数字加上0.5再向下取整。如Math.round(11.5) = 12:Math.round(-11.5) = -11.

16.下面的代码有何不妥之处?

1.if(username.equals(“zzx”)){}

username可能为Null,会报空指针异常,改为zzx.equals(username);

2.int x = 0; return x == 0 ! true:false

直接返回x==0即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值