牛客网面试宝典之JAVA基础知识总结
JAVA基础(一)
● 请你比较一下Java和JavaSciprt?
Java & JavaScript
参考回答:
- Java 是一种半编译半解释的完全面向对象的程序设计语言;JavaScript 是解释性的基于对象的脚本语言
- Java 诞生于 Sun 公司,后背 Oracle 收购;JavaScript 是由 Netscape 网景公司开发
- Java源代码在执行前必须经过编译后才能执行;JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行
- Java 采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型
- 代码格式不一样。
扩展:为什么说 Java 是一种半解释半编译的程序设计语言呢?
什么是编译形语言,什么又是解释形语言?
- 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,就可以直接运行这个程序。执行速度快,效率高,依靠编译器,跨平台性稍差。
- 解释型语言:把已经做好的源程序,翻译一句,执行一句,直到结束。执行速度慢,效率低,依靠编译器,跨平台性稍好。
那么为什么说Java 是编译型语言呢?
第一个观点认为 Java 是编译型语言,因为Java程序想要运行,那么第一步就是要使用Javac进行编译。没有经过编译的**.java**文件,是没办法运行的!
那么为什么又说Java 是解释型语言呢?
那么第二个观点则是认为Java是解释型语言,Java经过编译之后,仍然需要 JVM 的解释执行,Javac 将Java源文件编译成**.class文件,然后通过JVM**的解释执行!
综合上面两个观点来看,Java似乎既有编译型语言的特点,又有解释型语言的特点,也没有看到哪本权威的书籍上认定Java就是哪一种类型的语言。
● 请你讲讲&和&&的区别?
运算符
参考回答:
**&**运算符有两种用法:
-
(1)**&**按位与;
-
& 按位与底层操作的是二进制数,在JDK 集合源码中常见,例如 HashMap 底层 定位槽位的方式就是通过下面的公式实现:
-
(tab.length - 1) & hash
:即,数组长度 - 1 按位与上 hash 值!
-
- & 按位与操作两个数是如何实现的呢?我们来举一个简单实例:
3 & 2 结果是多少呢? 3 的二进制数表示为 b0010 2 的二进制数表示为 b0001 3 & 2 ----- b0011 ---> 3 & b0010 ---> 2 ----- b0010 ---> 2 所以3与2的结果为2
结论:& 按位与运算符是对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0~
如果位运算基础知识忘记了,给大家推荐一篇我的文章JAVA基础提高之位运算 !
-
& 按位与底层操作的是二进制数,在JDK 集合源码中常见,例如 HashMap 底层 定位槽位的方式就是通过下面的公式实现:
-
(2)**&&**逻辑与;
- **&&**运算符是短路与运算。
- 逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,==如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算==。很多时候我们可能都需要用**&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:
username != null &&!username.equals("")
,二者的顺序不能交换,更不能用&**运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException
异常。
● int和Integer有什么区别?
数据类型
参考回答:
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型,int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
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 比较
}
}
扩展:Java 8 大基本对象(如果算上void 的话总共9种)
9种基本数据类型和取值范围:
基本类型 | 大小(位/bit) | 字节数(byte) | 最小值 | 最大值 | 默认值 | 包装器类型 |
---|---|---|---|---|---|---|
boolean | - | - | false | true | false | Boolean |
char | 16 bits | 2 bytes | Unicode 0 | Unicode 2^16-1 | 空 | Character |
byte | 8 bits | 1 byte | -2^7 | 2^7-1 | 0 | Byte |
short | 16 bits | 2 bytes | -2~15 | 2^15-1 | 0 | Short |
int | 32 bits | 4 bytes | -2^31 | 2^31-1 | 0 | Integer |
long | 64 bits | 8 bytes | -2^63 | 2^63-1 | 0 | Long |
float | 32 bits | 4 bytes | 0.0 | Fload | ||
double | 64 bits | 8 bytes | 0.0 | Double | ||
void | - | - | - | - | - | Void |
注意:对于boolean值,在Java规范中并没有给出其储存大小,在《Java虚拟机规范》(参考我写的JVM总结通俗易懂的JVM虚拟机学习笔记还在更新中)给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。除了void之外,其他8种基本数据类型被称为八大基本数据类型。
图中从左向右的转换都是隐式转换,无需再代码中进行强制转换。从右向左均要进行强制类型转换,才能通过编译。强制转换会丢失精度,如:
//从左到右
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关键字有哪些用法?
参考回答:
- 修饰类:表示该类不能被继承;
- 修饰方法:表示方法不能被重写;
- 修饰变量:表示变量只能赋值一次且赋值以后值不能被修改(常量)
● 请你说明String 和StringBuffer的区别
考察点:数据类型
参考回答:
JAVA 平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
相关面试题:String/StringBuffer/StringBuilder区别
关于上述三者的区别以及源码分析,参考我的另一篇文章String StringBuilder StringBuffer区别以及源码分析
本文地址:https://blog.csdn.net/weixin_43591980/article/details/110237040
上一篇: Java线性分类器
下一篇: SQL优化教程之in与range查询