[面试宝典2022版]Java基础

面试题目录


文章目录

  • 面试题目录
  • 前言
  • 一、&和&&的区别
  • 二、八种基本数据类型的大小,以及他们的封装类
  • 三、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
  • 四、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  • 五、char 型变量中能不能存贮一个中文汉字?为什么?
  • 六、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
  • 七、"=="和 equals 方法究竟有什么区别?
  • 八、静态变量和实例变量的区别?
  • 九、Integer 与 int 的区别?
  • 十、作用域 public,private,protected,以及不写时的区别
  • 总结


前言

为了减轻大家的负担和节省大家的时间,一些过时知识点和被笔试概率极低的题目不再被收录和分析。

一、&和&&的区别

        &和&&都可以用作逻辑与的运算符,表示逻辑与(and) 当运算符两边的表达式的结果都为true时,

整个运算结果才为true, 否则,只要有一方为false,则结果为false 

        &&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于

if(str != null && !str.equals(“”))表达 式,当 str 为 null 时,后面的表达式不会执行,所以不会出现

NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异 常。If(x==33 & ++y>0)

y 会增长,If(x==33 && ++y>0)不会增长

        &还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,
我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31 & 0x0f
的结果为 0x01。

二、八种基本数据类型的大小,以及他们的封装类

基本类型
大小(字节)
默认值封装类
byte 1(byte)0Byte
short2(short)0Short
int40Integer
long80LLong
float40.0fFloat
double80.0dDouble
boolean~falseBoolean
char2\u0000(null)Character

                                                                                                                                      

注:
         1.int 是基本数据类型,Integer 是 int 的封装类,是引用类型。int 默认值是 0,而 Integer 默
认值是null,所以 Integer 能区分出 0 和 null 的情况。一旦 java 看到 null,就知道这个引用还没有
指向某个对象,再任何引用使用前,必须为其指定一个对象,否则会报错。
        2.基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,
必须通过实例化开辟数据空间之后才可以赋值。数组对象也是一个引用对象,将一个数组赋值给另
一个数组时只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。虽然
定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在 Java 虚拟机中没有任何供
boolean 值专用的字节码指令,Java 语言表达式所操作的 boolean 值,在编译之后都使用 Java 虚
拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java 虚拟机的 byte 数组,每个元素
boolean 元素占 8 位。这样我们可以得出 boolean 类型占了单独使用是 4 个字节,在数组中又是 1
个字节。使用 int 的原因是,对于当下 32 位的处理器(CPU)来说,一次处理数据是 32 位(这里
不是指的是 32/64 位系统,而是指 CPU 硬件层面),具有高效存取的特点。

三、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?

        在 switch(expr1)中,expr1 只能是一个整数表达式或者枚举常量(更大字体),整数表达

式可以是 int 基本类型或 Integer 包装 类型, 由于,byte,short,char 都可以隐含转换为 int,所以,

这些类型以及这些类型的包装类型也是可以的。显然,long String 类型 都不符合 switch 的语法

规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中(之前的回答是这样

)。但是 JDK1.7 之后,switch 也支持了 String(注意)

四、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

        对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int

型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。对于 short s1 = 1; s1+=

1;由于 += java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。

五、char 型变量中能不能存贮一个中文汉字?为什么?

       char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,

char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符

集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字

节,所以,char 类型的变量也是占用两个字节。 备注:后面一部分回答虽然不是在正面回答题

目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做

到知无不言,言无不尽。

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

       使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还

是可以改变的。例如,对于如下语句:

 final StringBuffer a=new StringBuffer("immutable"); 

执行如

下语句将报告编译期错误:

a=new StringBuffer("");

但是,执行如下语句则可以通过编译:

a.append(" broken!"); 

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来

的参数对象:

public void method(final StringBuffer param) {}

实际上,这是办不到的,在该方法内

部仍然可以增加如下代码来修改参数对象:

 param.append("a");

七、"=="和 equals 方法究竟有什么区别?

      (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起

说,则很难说清楚) ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应

的内存中所存储的数值是否相同,要比较两个基本类 型的数据或两个引用变量是否相等,只能用

==操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占

用一块内存(堆内存),变量也占用一块内 存,例如 Objet obj = new Object();变量 obj 是一个内

存,new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对 象占用的那块

内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两

个变量所对应的内存 中的数值是否相等,这时候就需要用==操作符进行比较。 equals 方法是用于

比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独

立的。例如, 对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条 new

语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个不同的对象,

它们的首地址是不同的, 即 a b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false

而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返 回 true。在实际开发中,我们经

常要比较传递进来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不

注意就使 用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有

大量这样的错误。记住,字符串的比较基本上 都是使用 equals 方法。 如果一个类没有自己定义

equals 方法,那么它将继承 Object 类的 equals 方法,Object 类的 equals 方法的实现代码如下:

boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就
是使用 == 操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals 和使用 ==
会得到同样的结果,如果比较的是两个独立的对象则总返回 false 。如果你编写的类希望能够比较
该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals 方法,由你自己写代码来决定
在什么情况即可认为两个对象的内容是相同的。

八、静态变量和实例变量的区别?

       在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。 在程序运行时的

区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才

能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序

加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用

了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来

引用。 例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,

并且每创建一个实例对象,这个 staticVar就会加 1;但是,每创建一个实例对象,就会分配一个

instanceVar,即可能分配多个 instanceVar,并且每个 instanceVar 的值都只自加了 1 次。

public class VariantTest {
 public static int staticVar = 0;
 public int instanceVar = 0;
   public VariantTest() {
        staticVar++;
        instanceVar++;
        System.out.println(“
                staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
    }
}

九、Integer 与 int 的区别?

       int 是 java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装类,Integer

java int 提供的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出

未赋值和值为 0 的区别,int 则无法表达出未赋值的情况,例如,要想表达出没有 参加考试和考试

成绩为 0 的区别,则只能使用 Integer。在 JSP 开发中,Integer 的默认为 null,所以用 el 表达式

在文本框中显示时,值 为空白字符串,而 int 默认的默认值为 0,所以用 el 表达式在文本框中显示

时,结果为 0,所以,int 不适合作为 web 层的表单数据的 类型。Integer 提供了多个与整数相关

的操作方法,例如,将一个字符串转换成整数,Integer 中还定义了表示整数的最大值和最小值的

常量。

十、作用域 public,private,protected,以及不写时的区别

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly
作用域当前类同一package子孙类其他package
public
protected
×
friendly
×
×
private
×
×
×
备注:只要记住了有 4 种访问权限, 4 个访问范围,然后将全选和范围在水平和垂直方向上分别按
排从小到大或从大到小的顺序 排列,就很容易画出上面的图了。


总结

        分享一些面试题,可供参考,未完结,还在更新中

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值