2023年6月20日发(作者:)

java程序员面试宝典电子书

1. Java基础部份

基础部份的顺序:大体语法,类相关的语法,内部类的语法,继承相关的语法,异样的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。

一、一个".java"源文件中是不是能够包括多个类(不是内部类)?有什么限制?

能够有多个类,但只能有一个public的类,而且public的类名必需与文件名相一致。

二、Java有无goto?

java中的保留字,此刻没有在java中利用。

3、说说&和&&的区别。

&和&&都能够用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,那么结果为false。

&&还具有短路的功能,即若是第一个表达式为false,那么再也不计算第二个表达式,例如,关于if(str !=

null&& !(“”))表达式,当str为null时,后面的表达式可不能执行,因此可不能显现NullPointerException若是将&&改成&,那么会抛出NullPointerException异样。If(x==33 &++y>0) y会增加,If(x==33 && ++y>0)可不能增加

&还能够用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,

咱们通常利用

0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

备注:这道题先说二者的一起点,再说出&&和&的特殊的地方,并列举一些经典的例子来讲明自己明白得透彻深切、实际体会丰硕。

4、在JAVA中如何跳出当前的多重嵌套循环?

在Java中,要想跳出多重循环,能够在外面的循环语句前概念一个标号,然后在里层循环体的代码中利用带有标号的break语句,即可跳出外层循环。例如,

ok:

for(int i=0;i for(int j=0;j (“i=” + i + “,j=”

+ j);

if(j == 5) break ok; }

}

另外,我个人通常并非利用标号这种方式,而是让外层的循环条件表达式的结果能够受到里层循环体代码的操纵,例如,要在二维数组中查找到某个数字。

int arr ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i

for(int j=0;j

(“i=” + i + “,j=” + j);

if(arr ==5) {

found = true;

break;

}

}

}

五、switch语句可否作用在byte上,可否作用在long上,可否作用在String上?

在switch(expr1)中,expr1只能是一个整数表达式或列举常量(更大字体),整数表达式能够是int大体类型或Integer包装类型,由于,byte,short,char都能够隐含转换为int,

因此,这些类型和这些类型的包装类型也是能够的。显然,

long和String类型都不符合switch的语法规定,而且不能被隐式转换成int类型,因此,它们不能作用于swtich语句中。

六、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编译器会对它进行特殊处置,因此能够正确编译。

7、char型变量中能不能存贮一个中文汉字?什么缘故? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包括了汉字,因此,char型变量中固然能够存储汉字啦。只是,若是某个特殊的汉字没有被包括在unicode编码字符集中,那么,那个char型变量中就不能存储那个特殊汉字。补充说明:unicode编码占用两个字节,因此,char类型的变量也是占用两个字节。

备注:后面一部份回答尽管不是在正面回答题目,可是,为了展现自己的学识和表现自己对问题明白得的透彻深切,能够回答一些相关的知识,做到知无不言,言无不尽。

八、用最有效率的方式算出2乘以8等于几?

2 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,因此,2乘以8等於几的最效率的方式是2 九、请设计一个一百亿的计算器

第一要明白这道题目的考查点是什么,一是大伙儿第一要对运算机原理的底层细节要清楚、要明白加减法的位运算原理和明白运算机中的算术运算会发生越界的情形,二是要具有必然的面向对象的设计思想。

第一,运算机顶用固定数量的几个字节来存储的数值,因此运算机中能够表示的数值是有必然的范围的,为了便于讲解和明白得,咱们先以byte类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,若是两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,因此进位部份被舍弃,即最终的结果为11111110,也确实是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,若是两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,因此进位部份被舍弃,即最终的结果为00000000,也确实是0,如此的结果显然不是咱们期望的,这说明运算机中的算术运算是会发生越界情形的,两个数值的运算结果不能超过运算机中的该类型的数值范

围。由于

Java中涉及表达式运算时的类型自动提升,咱们无法用byte类型来做演示这种问题和现象的实验,大伙儿能够用下面一个利用整数做实验的例子程序体验一下:

int a = _VALUE;

int b = _VALUE; int sum = a + b;

(“a=”+a+”,b=”+b+”,sum=”+sum);

先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也确实是20亿的大小,因此,要实现一个一百亿的计算器,咱们得自己设计一个类能够用于表示专门大的整数,而且提供了与另外一个整数进行加减乘除的功能,可能功能如下:

(1)那个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数

(2)有一个构造方式,把一个包括有多位数值的字符串转换到内部的符号和字节数组中

(3)提供加减乘除的功能

public class BigInteger{

int sign;

byte val;

public Biginteger(String val) {

sign = ;

val = ; }

public BigInteger add(BigInteger other) {

}

public BigInteger subtract(BigInteger other) {

}

public BigInteger multiply(BigInteger other){

}

public BigInteger divide(BigInteger other){

}

}

备注:要想写出那个类的完整代码,是超级复杂的,若是有爱好的话,能够参看jdk中自带的类的源码。面试的人也明白谁都不可能在短时刻内写出那个类的完整代码的,他要的是你是不是有这方面的概念和意识,他最重要的仍是考查你的能力,因此,你不要因为自己无法写出完整的最终结果就舍弃答这道题,你要做的确实是你比他人写得多,证明你比他人强,你有这方面的思想意识就能够够了,毕竟他人可能连题目的意思都看不懂,什么都没写,你要勇于答这道题,即便只答了一部份,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机遇固然就属于你了。另外,答案中的框架代码也很重要,表现了一些面向对象设计的功底,专门是其中的方式命名很专业,用的英文单词很精准,这也是能力、体会、专业性、英语水平等多个方面的表现,会给人留下专门好的印象,在编程能力和其他方面条件差不多的情形下,英语好除能够使你取得更多机遇外,薪水能够高出一千元。

10、利用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变?

利用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的。例如,关于如下语句:

final StringBuffer a=new

StringBuffer("immutable"); 执行如下语句将报告编译期错误:

a=new

2023年6月20日发(作者:)

java程序员面试宝典电子书

1. Java基础部份

基础部份的顺序:大体语法,类相关的语法,内部类的语法,继承相关的语法,异样的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。

一、一个".java"源文件中是不是能够包括多个类(不是内部类)?有什么限制?

能够有多个类,但只能有一个public的类,而且public的类名必需与文件名相一致。

二、Java有无goto?

java中的保留字,此刻没有在java中利用。

3、说说&和&&的区别。

&和&&都能够用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,那么结果为false。

&&还具有短路的功能,即若是第一个表达式为false,那么再也不计算第二个表达式,例如,关于if(str !=

null&& !(“”))表达式,当str为null时,后面的表达式可不能执行,因此可不能显现NullPointerException若是将&&改成&,那么会抛出NullPointerException异样。If(x==33 &++y>0) y会增加,If(x==33 && ++y>0)可不能增加

&还能够用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,

咱们通常利用

0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

备注:这道题先说二者的一起点,再说出&&和&的特殊的地方,并列举一些经典的例子来讲明自己明白得透彻深切、实际体会丰硕。

4、在JAVA中如何跳出当前的多重嵌套循环?

在Java中,要想跳出多重循环,能够在外面的循环语句前概念一个标号,然后在里层循环体的代码中利用带有标号的break语句,即可跳出外层循环。例如,

ok:

for(int i=0;i for(int j=0;j (“i=” + i + “,j=”

+ j);

if(j == 5) break ok; }

}

另外,我个人通常并非利用标号这种方式,而是让外层的循环条件表达式的结果能够受到里层循环体代码的操纵,例如,要在二维数组中查找到某个数字。

int arr ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i

for(int j=0;j

(“i=” + i + “,j=” + j);

if(arr ==5) {

found = true;

break;

}

}

}

五、switch语句可否作用在byte上,可否作用在long上,可否作用在String上?

在switch(expr1)中,expr1只能是一个整数表达式或列举常量(更大字体),整数表达式能够是int大体类型或Integer包装类型,由于,byte,short,char都能够隐含转换为int,

因此,这些类型和这些类型的包装类型也是能够的。显然,

long和String类型都不符合switch的语法规定,而且不能被隐式转换成int类型,因此,它们不能作用于swtich语句中。

六、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编译器会对它进行特殊处置,因此能够正确编译。

7、char型变量中能不能存贮一个中文汉字?什么缘故? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包括了汉字,因此,char型变量中固然能够存储汉字啦。只是,若是某个特殊的汉字没有被包括在unicode编码字符集中,那么,那个char型变量中就不能存储那个特殊汉字。补充说明:unicode编码占用两个字节,因此,char类型的变量也是占用两个字节。

备注:后面一部份回答尽管不是在正面回答题目,可是,为了展现自己的学识和表现自己对问题明白得的透彻深切,能够回答一些相关的知识,做到知无不言,言无不尽。

八、用最有效率的方式算出2乘以8等于几?

2 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,因此,2乘以8等於几的最效率的方式是2 九、请设计一个一百亿的计算器

第一要明白这道题目的考查点是什么,一是大伙儿第一要对运算机原理的底层细节要清楚、要明白加减法的位运算原理和明白运算机中的算术运算会发生越界的情形,二是要具有必然的面向对象的设计思想。

第一,运算机顶用固定数量的几个字节来存储的数值,因此运算机中能够表示的数值是有必然的范围的,为了便于讲解和明白得,咱们先以byte类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,若是两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,因此进位部份被舍弃,即最终的结果为11111110,也确实是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,若是两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,因此进位部份被舍弃,即最终的结果为00000000,也确实是0,如此的结果显然不是咱们期望的,这说明运算机中的算术运算是会发生越界情形的,两个数值的运算结果不能超过运算机中的该类型的数值范

围。由于

Java中涉及表达式运算时的类型自动提升,咱们无法用byte类型来做演示这种问题和现象的实验,大伙儿能够用下面一个利用整数做实验的例子程序体验一下:

int a = _VALUE;

int b = _VALUE; int sum = a + b;

(“a=”+a+”,b=”+b+”,sum=”+sum);

先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也确实是20亿的大小,因此,要实现一个一百亿的计算器,咱们得自己设计一个类能够用于表示专门大的整数,而且提供了与另外一个整数进行加减乘除的功能,可能功能如下:

(1)那个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数

(2)有一个构造方式,把一个包括有多位数值的字符串转换到内部的符号和字节数组中

(3)提供加减乘除的功能

public class BigInteger{

int sign;

byte val;

public Biginteger(String val) {

sign = ;

val = ; }

public BigInteger add(BigInteger other) {

}

public BigInteger subtract(BigInteger other) {

}

public BigInteger multiply(BigInteger other){

}

public BigInteger divide(BigInteger other){

}

}

备注:要想写出那个类的完整代码,是超级复杂的,若是有爱好的话,能够参看jdk中自带的类的源码。面试的人也明白谁都不可能在短时刻内写出那个类的完整代码的,他要的是你是不是有这方面的概念和意识,他最重要的仍是考查你的能力,因此,你不要因为自己无法写出完整的最终结果就舍弃答这道题,你要做的确实是你比他人写得多,证明你比他人强,你有这方面的思想意识就能够够了,毕竟他人可能连题目的意思都看不懂,什么都没写,你要勇于答这道题,即便只答了一部份,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机遇固然就属于你了。另外,答案中的框架代码也很重要,表现了一些面向对象设计的功底,专门是其中的方式命名很专业,用的英文单词很精准,这也是能力、体会、专业性、英语水平等多个方面的表现,会给人留下专门好的印象,在编程能力和其他方面条件差不多的情形下,英语好除能够使你取得更多机遇外,薪水能够高出一千元。

10、利用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变?

利用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的。例如,关于如下语句:

final StringBuffer a=new

StringBuffer("immutable"); 执行如下语句将报告编译期错误:

a=new