java基础部分常见面试题(全)

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

文章目录

  • 1、一个”.java”源文件中是否可以包括多个类(不是内部 类)什么限制/li>
  • 2、Java 有没有 goto/li>
  • 3、说说&和&&的区别。
  • 4、在 JAVA 中如何跳出当前的多重嵌套循环/li>
  • 5、switch 语句能否作用在 byte 上,能否作用在 long 上,能**否作用在** String上
  • 6、short s1 = 1; s1 = s1 + 1;有什么错short s1 = 1; s1 += 1;有什么错/li>
  • 7、char 型变量中能不能存贮一个中文汉字什么/li>
  • 8、用最有效率的方法算出 2 乘以 8 等於几/li>
  • 9、请设计一个一百亿的计算器
  • 10、使用 final 关键字修饰一个变量时,是引用不能变,还 是引用的对象不能变/li>
  • 11、”==”和 equals 方法究竟有什么区别/li>
  • 12、静态变量和实例变量的区别/li>
  • 13、是否可以从一个 static 方法内部发出对非 static 方法的 调用/li>
  • 14、Integer 与 int 的区别
  • 15、Math.round(11.5)等於多少Math.round(-11.5)等於多 少/li>
  • 16、下面的代码有什么不妥之处/li>
  • 17、请说出作用域 public,private,protected,以及不写时 的区别
  • 18、Overload 和Override 的区别。Overloaded 的方法是否 可以改变返回值的类型/li>
  • 19、构造器 Constructor是否可被 **override*
  • 20、接口是否可继承接口抽象类是否可实现(implements) 接口抽象类是否可继承具体类(concrete class)抽象类中 是否可以有静态的 main 方法/li>
  • 21、写 clone()方法时,通常都有一行代码,是什么/li>
  • 22、面向对象的特征有哪些方面
  • 23、java 中实现多态的机制是什么/li>
  • 24、abstract class 和 interface 有什么区别/li>
  • 25、abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized/li>
  • 26、什么是内部类tatic Nested Class 和 Inner Class 的不同
  • 27、内部类可以引用它的包含类的成员吗没有什么限 制/li>
  • 28 、 Anonymous Inner Class ( 匿名内部类 ) 是否可以 extends( 继 承 ) 其 它 类 , 是 否 可 以implements( 实 现)interface(接口)/li>
  • 29、**super**.getClass()方法调用下面程序的输出结果是多少/li>
  • 30、String 是最基本的数据类型吗/li>
  • 31、String s = “Hello”;s = s + ” world!”;这两行代码执行后, 原始的 String 对象中的内容到底变了没有/li>
  • 32、是否可以继承 String 类/li>
  • 33、String s = new String(“xyz”);创建了几个 String Object/li>
  • 34、String 和 StringBuffer 的区别
  • 35、如何把一段逗号分割的字符串转换成一个数组/li>
  • 36、数组有没有 length()这个方法String 有没有 length()这 个方法/li>
  • 37 、下面这条语句一共创建了多少个对象: String s=”a”+”b”+”c”+”d”;
  • 38、try {}里有一个 return 语句,那么紧跟在这个 try 后的
  • 39、下面的程序代码输出的结果是多少/li>
  • 40、final, finally, finalize 的区别。
  • 41、运行时异常与一般异常有何异同/li>
  • 42、error 和 exception 有什么区别/li>
  • 43、Java 中的异常处理机制的简单原理和应用。
  • 44、请写出你最常见到的 5 个 runtime exception。
  • 45 、 JAVA 语 言 如 何 进 行 异 常 处 理 , 关 键 字 :
  • 46、java 中有几种方法可以实现一个线程什么关键字修 饰同步方法stop()和 suspend()方法为何不推荐使用/li>
  • 47、sleep() 和 wait() 有什么区别/li>
  • 48、同步和异步有何异同,在什么情况下分别使用他们 例说明。
  • 49. 下面两个方法同步吗自己发明)
  • 50、多线程有几种实现方法步有几种实现方法/li>
  • 51、启动一个线程是用 run()还是 start().
  • 52、当一个线程进入一个对象的一个 synchronized 方法后, 其它线程是否可进入此对象的其它方法/li>
  • 53、线程的基本概念、线程的基本状态以及状态之间的关系
  • 54、简述 synchronized 和 java.util.concurrent.locks.Lock 的 异同 /li>
  • 55、设计 4 个线程,其中两个线程每次对 j 增加 1,另外两 个线程对 j 每次减少 1。写出程序。
  • 56、子线程循环 10 次,接着主线程循环 100,接着又回到子 线程循环 10 次,接着再回到主线程又循环 100,如此循环 50 次,请写出程序。
  • 57、介绍 Collection 框架的结构
  • 58、Collection 框架中实现比较要实现什么接口
  • 59、ArrayList 和 Vector 的区别
  • 60、HashMap 和 Hashtable 的区别
  • 61、List 和 Map 区别/li>
  • 62、List, Set, Map 是否继承自 Collection 接口/li>
  • 63、List、Map、Set 三个接口,存取元素时,各有什么特点/li>
  • 64、说出 ArrayList,Vector, LinkedList 的存储性能和特性
  • 65、去掉一个 Vector 集合中重复的元素
  • 66、Collection 和 Collections 的区别。
  • 67、Set 里的元素是不能重复的,那么用什么方法来区分重 复与否呢是用==还是 equals()它们有何区别/li>
  • 68、你所知道的集合类都有哪些要方法/li>
  • 69、两个对象值相同(x.equals(y) == true),但却可有不同的
  • 70、TreeSet 里面放对象,如果同时放入了父类和子类的实 例对象,那比较时使用的是父类的 compareTo 方法,还是使 用的子类的 compareTo 方法,还是抛异常!
  • 71、说出一些常用的类,包,接口,请各举 5 个
  • 72、java 中有几种类型的流DK 为每种类型的流提供了一 些抽象类以供继承,请说出他们分别是哪些类/li>
  • 73、字节流与字符流的区别
  • 74、什么是 java 序列化,如何实现 java 序列化者请解 释 Serializable 接口的作用。
  • 75、描述一下 JVM 加载 class 文件的原理机制/li>
  • 76、heap 和 stack 有什么区别。
  • 77、GC 是什么为什么要有 GC/li>
  • 78、垃圾回收的优点和原理。并考虑 2 种回收机制。
  • 79、垃圾回收器的基本原理是什么圾回收器可以马上回 收内存吗什么办法主动通知虚拟机进行垃圾回收/li>
  • 80、什么时候用 assert。
  • 81、java 中会存在内存泄漏吗,请简单描述。
  • 82、能不能自己写个类,也叫 java.lang.String/li>
  • 83. Java 代码查错

1、一个”.java”源文件中是否可以包括多个类(不是内部 类)什么限制/h2>

可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

2、Java 有没有 goto/h2>

java 中的保留字,现在没有在 java 中使用。

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

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时, 整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。

&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于 if(str != null && !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异常。If(x33 & ++y>0) y 会增长,If(x==33 && ++y>0) 不会增长

&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,我们通常 使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31 & 0x0f 的结果为 0x01。 备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解

透彻深入、实际经验丰富。

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

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

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

5、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String上

在 switch(condition)中,condition 只能是一个整数表达式或者枚举常量(更大字体),整数表达式可 以是 int 基本类型或 Integer 包装类型,由于,byte,short,char 都可以隐式转换为 int,所以,这些类型以及这 些类型的包装类型也是可以的。显然,long 和 String 类型都不符合 switch 的语法规定,并且不能被隐式转 换成 int 类型,所以,它们不能作用于 swtich 语句中。

6、short s1 = 1; s1 = s1 + 1;有什么错short s1 = 1; s1 += 1;有什么错/h2>

对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值 给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。

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

7、char 型变量中能不能存贮一个中文汉字什么/h2>

char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char 型变量 中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字节,所以,char 类型的变量也是占 用两个字节。

备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解 的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。

8、用最有效率的方法算出 2 乘以 8 等於几/h2>

2

因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可, 而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2

9、请设计一个一百亿的计算器

首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减 法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。 首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围 的,为了便于讲解和理解,我们先以 byte 类型的整数为例,它用 1 个字节进行存储,表示的最大数值范围 为-128 到+127。-1 在内存中对应的二进制数据为 11111111,如果两个-1 相加,不考虑 Java 运算时的类型提 升,运算后会产生进位,二进制结果为 1,11111110,由于进位后超过了 byte 类型的存储空间,所以进位部

分被舍弃,即最终的结果为 11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128 在内存 中对应的二进制数据为 10000000,如果两个-128 相加,不考虑 Java 运算时的类型提升,运算后会产生进位, 二进制结果为 1,00000000,由于进位后超过了 byte 类型的存储空间,所以进位部分被舍弃,即最终的结果 为 00000000,也就是 0,这样的结果显然不是我们期望的,这说明**计算机中的算术运算是会发生越界情况 的,两个数值的运算结果不能超过计算机中的该类型的数值范围。**由于 Java 中涉及表达式运算时的类型自 动提升,我们无法用 byte 类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例 子程序体验一下:

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

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

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

()提供加减乘除的功能

备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看 jdk 中自带的 java.math.BigInteger 类的源码。面试的人也知道谁都不可能在短时间内写出这个类的完整代码的,他要的 是你是否有这方面的概念和意识,他最重要的还是考查你的能力,所以,你不要因为自己无法写出完整的 最终结果就放弃答这道题,你要做的就是你比别人写得多,证明你比别人强,你有这方面的思想意识就可 以了,毕竟别人可能连题目的意思都看不懂,什么都没写,你要敢于答这道题,即使只答了一部分,那也

与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机会当然就属于你了。另外,答案中 的框架代码也很重要,体现了一些面向对象设计的功底,特别是其中的方法命名很专业,用的英文单词很 精准,这也是能力、经验、专业性、英语水平等多个方面的体现,会给人留下很好的印象,在编程能力和 其他方面条件差不多的情况下,英语好除了可以使你获得更多机会外,薪水可以高出一千元。

10、使用 final 关键字修饰一个变量时,是引用不能变,还 是引用的对象不能变/h2>

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

final StringBuffer a=new StringBuffer(“immutable”);

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

a=new StringBuffer(“”);

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

a.append(” broken!”);

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

public void method(final StringBuffer param){

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append(“a”);

11、”==”和 equals 方法究竟有什么区别/h2>

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

操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是 否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆 内存),变量也占用一块内存,例如 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 方法,由你自己写代码来决定在什么情况即可认为两个对象的 内容是相同的。

12、静态变量和实例变量的区别/h2>

在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被

分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只 要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。 总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,并且每创建 一个实例对象,这个 staticVar 就会加 1;但是,每创建一个实例对象,就会分配一个 instanceVar,即可能 分配多个 instanceVar,并且每个 instanceVar 的值都只自加了 1 次。

备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了 自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写作能力!

13、是否可以从一个 static 方法内部发出对非 static 方法的 调用/h2>

不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方 法调用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个 static 方法被调用时,可 能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那个非 static 方法是关 联到哪个对象上的呢个逻辑无法成立,所以,一个 static 方法内部发出对非 static 方法的调用。

14、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 层的表单数据的 类型。

在 Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为 null 而判断一 个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性 为 0。

另外,Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer 中还定义 了表示整数的最大值和最小值的常量。

15、Math.round(11.5)等於多少Math.round(-11.5)等於多 少/h2>

Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含 义相对应, 例如, ceil 的 英文意义是 天花板,该 方法就表示 向上取整, Math.ceil(11.3) 的 结果为 12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为

11,Math.ceil(-11.6)的结果是-12;最难掌握的是 round 方法,它表示“四舍五入”,算法为 Math.floor(x+0.5), 即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5)的结果为 12,Math.round(-11.5)的 结果为-11。

16、下面的代码有什么不妥之处/h2>
来源:苍何fly
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年11月8日
下一篇 2018年11月8日

相关推荐