牛客网面试宝典之JAVA基础知识(一)总结
发布日期:2021-06-29 18:10:24 浏览次数:2 分类:技术文章

本文共 4003 字,大约阅读时间需要 13 分钟。

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 的二进制数表示为 b00102 的二进制数表示为 b0001    3 & 2   -----b0011 ---> 3&b0010 ---> 2-----b0010 ---> 2    所以3与2的结果为2

    结论:& 按位与运算符是对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0~

    如果位运算基础知识忘记了,给大家推荐一篇我的文章 !

  • (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总结还在更新中)给出了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区别

关于上述三者的区别以及源码分析,参考我的另一篇文章

转载地址:https://csp1999.blog.csdn.net/article/details/110237040 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux环境下Kafka的安装与使用(SpringBoot整合云服务器上的Kafka)
下一篇:String StringBuilder StringBuffer区别以及源码分析

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月20日 19时42分27秒