- Java基础部分
- 1.一个”java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
- 2. java中有没有goto
- 3. 说说&(逻辑与)和&&(简洁与)的区别
- 4. 在java中如何跳出当前的多重嵌套循环?
- 5.switch语句能否作用于byte上,能否作用于long上,能否作用于String上?
- 6.short s1 = 1; short s1 = s1 +1;有什么错?short s1 = 1; short s1 += 1;有什么错?
- 7.char类型的变量能不能储存汉字,为什么?
- 8.用最有效的方法计算出2乘以8的值?
- 9.请设计一个100亿的计算机
- 10.使用final关键字修饰一个变量的时候,是引用不能变还是引用的对象不能变?
- 11.==和equals方法有什么区别
- 12.静态变量和实例变量的区别?
- 13.是否可以从一个static方法内部发出对非static方法的调用?
- 14.Integer和int的区别?
- 15.Math.round(11.5)等于?Math.round(-11.5)等于?
- 16.下面的代码有何不妥之处?
Java基础部分
1.一个”java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以有多个类,但是只有一个public类,并且public的类名必须和文件名相一致
2. java中有没有goto
java中的goto作为保留字,现在没有在java中使用,在c++中goto是用来跳出多层循环的,以后java也可能会使用goto作为关键字,所以现在先将其保留。
3. 说说&(逻辑与)和&&(简洁与)的区别
相同点:
都可以用作逻辑与的运算符,表示当符号两边的表达式的值都为true时,结果才为true,否则结果为false。
不同点:
&&具有短路功能,当&&的左边表达式的值为为false时,右边的表达式不执行,例如:if(str != null && str.equals(“”)),当str为null时,左边为false,那么右边不执行,不会报出NullPointerExcepetion,如果将&&改为&,那么就会抛出NullPointerExcepetion
当&左右两边的表达式的值不是boolean类型时,那么&表示的是按位与操作
4. 在java中如何跳出当前的多重嵌套循环?
- 在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即可