JAVA面试基础知识(一)总结
JAVA基础
请你比较一下JAVA和JavaScript?
参考回答:
- JAVA是一种半编译半解释的完全面向对象的程序设计语言,JavaScript是解释性的基于对象的脚本语言。
- JAVA诞生于Sun公司,后被Oracle收购;JavaScripty是由NetSpace网景公司开发
- JAVA源代码在执行前必须经过编译后才能执行;JavaScript是一种解释性编程语言,其源代码不需要经过编译,由浏览器解释执行。
- JAVA采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不做声明,JavaScript的解释器在运行时检查推断其数据类型。
- 代码格式不一样。
为什么说JAVA是一种半编译半解释的程序设计语言呢?
什么是编译型语言,什么又是解释型语言?
- 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,就可以直接运行这个程序。执行速度快,效率高,依靠编译器,跨平台性稍差。
- 解释性语言:把已经做好的源程序,翻译一句,执行一句,直到结束。执行速度慢,效率低,依靠编译器,跨平台性较好。
那么为什么说JAVA是编译型语言呢?
第一个观点认为JAVA是编译型语言,因为JAVA程序想要运行,那么第一步就是要使用javac进行编译。没有经过编译的java文件,是没办法运行。
那么为什么又说JAVA是解释性语言呢?
那么第二个观点则是认为JAVA是解释型语言,JAVA经过编译后,仍然需要JVM的解释执行,javac将JAVA源文件编译成**.class文件,然后通过**JVM的解释执行。
综合上面两个观点来看,JAVA似乎既有编译型语言的特点,又有解释型语言的特点。
请你讲讲&和&&的区别?
参考回答:
&(与)
运算符有两种用法:
-
&
按位与-
&
按位与底层操作的是二进制数字,在JDK源码中常见,例如HashMap底层定位槽位的方式就是通过下面的公式实现:(tab.length-1)&hash
:即,数组长度-1按位与上hash值
-
&
按位与操作两个数是如何实现的呢?我们来举一个简单实例:3 & 2 结果是多少呢? 3的二进制数表示为b0011 2的二进制数表示为b0010 3 & 2 ------- b0011 -----> 3 ------- b0010 -----> 2 所以3与2的结果为2
结论:
&
按位与运算符是对两个整型操作数中对应位执行布尔代数,两个位都为1的时候输出1,否则为0。
-
-
&&
逻辑与&&
运算符是短路与运算.- 逻辑与跟短路的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true.&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录判定用户名不说null而且不说空字符串,应当写为:
username!=null && !username.equals("")
,二者的顺序不能交换,更不能用&**运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointException
异常.
int与Integer有什么区别?
JAVA是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,JAVA为每一个基本数据类型都引入了对应的包装类型,int的包装类就是Integer,从JAVA5开始引入了自动装箱/拆箱机制,使得二者可以相互转换.
JAVA为每个原始类型提供了包装类型:
- 原始类型:
boolean,char,byte,short,int,long,float,double
- 包装类型:
Boolean,Character,Byte,Short,Integer,Long,Float,Double
class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3; // 将3自动装箱成 Integer 类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == c); // true a 自动拆箱成 int 类型再和 c 比较
}
}
扩展:JAVA8大基本对象(如果算上void的话总共九种)
9种基本数据类型和取值范围
基本类型 | 大小(位/bit) | 字节数(byte) | 最小值 | 最大值 | 默认值 | 包装器类型 |
---|---|---|---|---|---|---|
boolean | - | - | false | true | false | Boolean |
char | 16bit | 2bytes | Unicode 0 | Unicode 2^16-1 | 空 | Character |
byte | 8bit | 1byte | -2^7 | 2^7-1 | 0 | Byte |
short | 16bits | 2bytes | -2^15 | 2^15-1 | 0 | Short |
int | 32bits | 4bytes | -2^31 | 2^31-1 | 0 | Integer |
long | 64bits | 8bytes | -2^63 | 2^63-1 | 0 | Long |
float | 32bits | 4bytes | 0.0 | Float | ||
double | 64bits | 8bytes | 0.0 | Double | ||
void | - | - | - | - | - | Void |
图中从左到右都是隐式转换,无需再代码中进行强制转换从右到左均要进行强制类型转换,才能通过编译.强制转换会丢失精度。
//从左到右
byte i = 12;
System.out.println("byte:"+i);
short i2 = i;
System.out.println("short:"+i2);
char j = '²';
System.out.println("char:"+j);
int j3 = j;
System.out.println("int:"+j3);
long j4 = j;
/*
输出结果:
byte:12
short:12
char:²
int:178
*/
//从右到左
double i = 178.33;
System.out.println("double:"+i);
float i1 = (float) i;
System.out.println("float:"+i1);
byte i5 = (byte) i;
System.out.println("byte:"+i5);
char i6 = (char) i;
System.out.println("char:"+i6);
/*
输出结果:
double:178.33
float:178.33
byte:-78
char:²
*/
我们再web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,请你讲讲如何输出一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
JAVA中的final关键字有哪些用法?
- 修饰类:表示该类不能被继承
- 修饰方法:表示方法不能被重写
- 修饰变量:表示变量只能赋值一次且赋值以后值不能被修改