2022 最新 Java 基础 面试题(一)

2022 最新 Java 基础 面试题(一)

  • 1、面向对象的特征有哪些方面/li>
  • 3、String 是最基本的数据类型吗/li>
  • 4、float f=3.4;是否正确/li>
  • 5、short s1 = 1; s1 = s1 + 1;有错吗hort s1 = 1; s1 += 1; 有错吗/li>
  • 6、Java 有没有 goto/li>
  • 7、int 和 Integer 有什么区别/li>
        • · 原始类型: boolean,char,byte,short,int,long,float,double
  • 8、&和&&的区别/li>
  • 9、解释内存中的栈(stack)、堆(heap)和方法区(method area)
  • 10、Math.round(11.5) 等于多少ath.round(-11.5)等于 多少/li>
  • 11、switch 是否能作用在 byte 上,是否能作用在 long 上, 是否能作用在 String 上/li>
  • 12、用最有效率的方法计算 2 乘以 8/li>
  • 13 、 数组有没有 length ( )方法S tring 有没有 lengt h ( ) 方法/li>
  • 14、在 Java 中,如何跳出当前的多重嵌套循环/li>
  • 15、构造器(constructor)是否可被重写(override)/li>
  • 16、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对/li>
  • 17、是否可以继承 String 类/li>
  • 18、当一个对象被当作参数传递到一个方法后,此方法可改变
  • 19、String 和 StringBuilder、StringBuffer 的区别/li>
  • 20、重载(Overload)和重写(Override)的区别。重载的 方法能否根据返回类型进行区分/li>
  • 21、描述一下 JVM 加载 class 文件的原理机制/li>
        • · Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
  • 22、char 型变量中能不能存贮一个中文汉字,为什么/li>
  • 23、抽象类(abstract class)和接口(interface)有什么异
  • 24、静态嵌套类(Static Nested Class)和内部类(Inner Class) 的不同/li>
        • new Outer().new Inner();
  • 25、Java 中会存在内存泄漏吗,请简单描述。
  • 26、抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized 修饰/li>
  • 27、阐述静态变量和实例变量的区别。
  • 28、是否可以从一个静态(static)方法内部发出对非静态
  • 29、如何实现对象克隆/li>
  • 30、GC 是什么什么要有 GC/li>
        • · 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说, 这里是它们唯一存在过的区域。
        • · -Xms / -Xmx — 堆的初始大小 / 堆的最大大小
  • 31、String s = new String(“xyz”);创建了几个字符串对象/li>
  • 32、接口是否可继承(extends)接口象类是否可实现
  • 33 、 一个 ” .j ava ” 源文件中是否可以包含多个 类 (不是内部类 ) /li>
  • 34、Anonymous Inner Class(匿名内部类)是否可以继承其它 类否可以实现接口/li>
  • 35、内部类可以引用它的包含类(外部类)的成员吗没有 什么限制/li>
  • 36、Java 中的 final 关键字有哪些用法/li>
  • 37、指出下面程序的运行结果
  • 38、数据类型之间的转换:
        • · 如何将字符串转换为基本数据类型/li>
        • · 调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型;
  • 39、如何实现字符串的反转及替换/li>
  • 40、怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的
  • 41、日期和时间:
  • 42、打印昨天的当前时刻。
  • 43、比较一下 Java 和 JavaSciprt。
        • · 基于对象和面向对象:Java 是一种真正的面向对象的语言,即使是开发 简单的程序,必须设计对象;JavaScript 是种脚本语言,它可以用来制作与网络 无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和
  • 44、什么时候用断言(assert)/li>
        • assert(a > 0); // throws an AssertionError if a
  • 45、Error 和 Exception 有什么区别/li>
  • 46、try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的代码会不会被执行,什么时候被执行,在 return 前还是后/li>
  • 47、Java 语言如何进行异常处理,关键字:throws、throw、
  • 48、运行时异常与受检异常有何异同/li>
        • · 不要将异常处理用于正常的控制流(设计良好的 API 不应该强迫它的调 用者为了正常的控制流而使用异常)
  • 49、列出一些你常见的运行时异常/li>
        • · ArithmeticException(算术异常)
  • 50、阐述 final、finally、finalize 的区别。
        • · final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味 着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。将 变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须 在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为 final 的方 法也同样只能使用,不能在子类中被重写。
  • 51、类 ExampleA 继承 Exception,类 ExampleB 继承 ExampleA。
        • 有如下代码片断:
  • 52、List、Set、Map 是否继承自 Collection 接口/li>
  • 53、阐述 ArrayList、Vector、LinkedList 的存储性能和特性。
  • 54、Collection 和 Collections 的区别/li>
  • 55、List、Map、Set 三个接口存取元素时,各有什么特点/li>
  • 56、TreeMap 和 TreeSet 在排序时如何比较元素Collections 工具类中的 sort()方法如何比较元素/li>
  • 57、Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行,它们有什么区别/li>
  • 58、线程的 sleep()方法和 yield()方法有什么区别/li>
  • 59、当一个线程进入一个对象的 synchronized 方法 A 之后, 其它线程是否可进入此对象的 synchronized 方法 B/li>
  • 60、请说出与线程同步以及线程调度相关的方法。
        • · wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
        • · 在银行账户的存款(deposit)方法上同步(synchronized)关键字
  • 61、编写多线程程序有几种实现方式/li>
  • 62、synchronized 关键字的用法/li>
  • 63、举例说明同步和异步。
  • 64、启动一个线程是调用 run()还是 start()方法/li>
  • 65、什么是线程池(thread pool)/li>
        • · newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只 有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线 程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执 行顺序按照任务的提交顺序执行。
        • · newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创
  • 66、线程的基本状态以及状态之间的关系/li>
  • 67、简述 synchronized 和 java.util.concurrent.locks.Lock 的异同/li>
  • 68、Java 中如何实现序列化,有什么意义/li>
  • 69、Java 中有几种类型的流/li>
        • import java.io.FileInputStream;
  • 70、写一个方法,输入一个文件名和一个字符串,统计这个字 符串在这个文件中出现的次数。
  • 71、如何用 Java 代码列出一个目录下所有的文件/li>
  • 72、用 Java 的套接字编程实现一个多线程的回显(echo)服
  • 73、XML 文档定义有几种形式们之间有何本质区别析 XML 文档有哪几种方式/li>
  • 74、你在项目中哪些地方用到了 XML/li>
  • 75、阐述 JDBC 操作数据库的步骤。
        • Class.forName(“oracle.jdbc.driver.OracleDriver”);
        • ResultSet rs = ps.executeQuery();
  • 76、Statement 和 PreparedStatement 有什么区别个性 能更好/li>
  • 77、使用 JDBC 操作数据库时,如何提升读取数据的性能 何提升更新数据的性能/li>
  • 78、在进行数据库编程时,连接池有什么作用/li>
  • 79、什么是 DAO 模式/li>
  • 80、事务的 ACID 是指什么/li>
        • · 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作 的失败都会导致整个事务的失败;
  • 81、 JDBC 中如何进行事务处理答:
  • 82、JDBC 能否处理 Blob 和 Clob/li>
  • 83、简述正则表达式及其用途。
  • 84、Java 中是如何支持正则表达式操作的/li>
  • 85、获得一个类的类对象有哪些方式/li>
        • · 方法 1:类型.class,例如:String.class
        • · 方法 1:通过类对象调用 newInstance()方法,例如: String.class.newInstance()
  • 88、如何通过反射调用对象的方法/li>
  • 89、 简述一下面向对象的 ” 六原则一法则 ”。
  • 90、简述一下你了解的设计模式。
        • · 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公 共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同 的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而 不必考虑到底返回的是哪一个子类的实例。
  • 91、用 Java 写一个单例类。
  • 92、什么是 UML/li>
  • 93、UML 中有哪些常用的图/li>
  • 94、 用 Java 写一个冒泡排序。
  • 95、用 Java 写一个折半查找。

1、面向对象的特征有哪些方面/h2>

答:

面向对象的特征主要有以下几个方面:

· 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽 象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的 细节是什么。

· 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类 被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让 变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要 手段(如果不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中 关于桥梁模式的部分)。

· 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问

只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自 治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写 一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西, 只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别, 明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是 封装得足够好的,因为几个按键就搞定了所有的事情)。

· 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。 简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分 为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的 服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须 刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电, 甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道 供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载

(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override) 实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的 东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已 有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样 的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

2、访问修饰符 public,private,protected,以及不写(默认) 时的区别/p>

答:

修饰符 当前类 同 包 子 类 其他包
public
protecte d ×
default × ×
private × × ×

类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公

开( public), 对于不是同一个包中的其他类相当于私有( private)。 受保护

( protected)对子类相当于公开 ,对不是同一包中的没有父子关系的类相当于私 有。Java 中,外部类的修饰符只能是 public 或默认 ,类的成员( 包括内部类 )的 修饰符可以是以上四种。

3、String 是最基本的数据类型吗/h2>

答:

不是 。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double 、 char、boolean;除 了基本类 型( primitive type),剩 下的都是引用类 型( reference type), Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。

4、float f=3.4;是否正确/h2>

答:不正确 。 3.4 是双精度数 , 将双精度型 ( double) 赋值给浮点型 ( float) 属于 下转型( down-casting, 也称为窄化 ) 会造成精度损失 , 因此需要强制类型转 换 float f =(float)3.4; 或者写成 float f =3.4F;。

5、short s1 = 1; s1 = s1 + 1;有错吗hort s1 = 1; s1 += 1; 有错吗/h2>

答:

对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型, 因此 s1+1 运算结果也是 int 型, 需要强制转换类型才能赋值给 short 型。 而 short s1 = 1; s1 += 1;可以正确 编译, 因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

6、Java 有没有 goto/h2>

答:

goto 是 Java 中的保留字 ,在 目前版本的 Java 中没有使用 。( 根据 James Gosling

( Java 之父) 编写的《 The Java Programming Language》 一书的附录中给出 了一个 Java 关键字列表, 其中有 goto 和 const, 但是这两个是目前无法使用的 关键字, 因此有些地方将其称之为保留字, 其实保留字这个词应该有更广泛的意 义, 因为熟悉 C 语言的程序员都知道, 在系统类库中使用过的有特殊意义的单词 或单词的组合都被视为保留字)

7、int 和 Integer 有什么区别/h2>

答:

Java 是一个近乎纯洁的面向对象编程语言, 但是为了编程的方便还是引入了基本 数据类型, 但是为了能够将这些基本数据类型当成对象操作, Java 为每一个基本

数据类型都引入了对应的包装类 型( wrapper class),int 的包装类就是 Integer,

从 Java 5 开始引入了自动装箱 /拆箱机制, 使得二者可以相互转换。 Java 为每个原始类型提供了包装类型:

· 原始类型: boolean,char,byte,short,int,long,float,double

· 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float, Double

请添加图片描述

}
}

如果不明就里很容易认为两个输出要么都是 true 要么都是 false。首 先需要注意的

是 f1、f2、f3、f4 四个变量都是 Integer 对象引用 ,所以下面的==运算比较的不 是值而是引用 。装 箱的本质是什么呢当我们给一个 Integer 对象赋一个 int 值的 时候, 会调用 Integer 类的静态方法 valueOf, 如果看看 valueOf 的源代码就知 道发生了什么。

2022 最新 Java 基础 面试题(一)

简单的说 ,如果整型字面量的值在 -128 到 127 之间 ,那么不会 new 新的 Integer

对象, 而是直接引用常量池中的 Integer 对象, 所以上面的面试题中 f1f4 的结果 是 false。

提醒 : 越是貌似简单的面试题其中的玄机就越多 , 需要面试者有相当深厚的功力 。

8、&和&&的区别/h2>

答:

&运算符有两种用法:(1)按位与; (2)逻辑与。 &&运算符是短路与运算。 逻辑与 跟短路与的差别是非常巨大的, 虽然二者都要求运算符左右两端的布尔值都是

true 整个表达式的值才是 true。&&之所以称为短路运算是因为 ,如果 &&左边的 表达式的值是 false, 右边的表达式会被直接短路掉, 不会进行运算 。 很多时候我 们可能都需要用&&而不是&,例 如在验证用户登录时判定用户名不是 null 而且不 是空字符串, 应当写为: username != null &&!username.equals(“” ), 二者 的顺序不能交换,更不能用 &运算符 ,因为第一个条件如果不成立 ,根本不能进行 字符串的 equals 比较, 否则会产生 NullPointerException 异常。 注意: 逻辑或 运算符( |) 和短路或运算符( ||) 的差别也是如此。

补充: 如果你熟悉 JavaScript, 那你可能更能感受到短路运算的强大, 想成 为 JavaScript 的高手就先从玩转短路运算开始吧。

9、解释内存中的栈(stack)、堆(heap)和方法区(method area)

的用法。

答:

通常我们定义一个基本数据类型的变量, 一个对象的引用, 还有就是函数调用的 现场保存都使用 JVM 中的栈空间 ;而 通过 new 关键字和构造器创建的对象则放在 堆空间, 堆是垃圾收集器管理的主要区域, 由于现在的垃圾收集器都采用分代收 集算法, 所以堆空间还可以细分为新生代和老生代, 再具体一点可以分为 Eden、 Survivor( 又可分为 From Survivor 和 To Survivor)、 Tenured; 方法区和堆都 是各个线程共享的内存区域 , 用于存储已经被 JVM 加载的类信息 、 常量 、 静态变

量 、JIT 编译器编译后的代码等数据 ;程 序中的字面 量( literal)如 直接书写的 100、” hello” 和常量都是放在常量池中, 常量池是方法区的一部分,。 栈空间操作起来 最快但是栈很小 ,通 常大量的对象都是放在堆空间 ,栈 和堆的大小都可以通过 JVM 的启动参数来进行调整, 栈空间用光了会引发 StackOverflowError, 而堆和常量 池空间不足则会引发 OutOfMemoryError。

String str = new String(“hello”);

上面的语句中变量 str 放在栈上, 用 new 创建出来的字符串对象放在堆上, 而 ” hello” 这个字面量是放在方法区的。

补充 1: 较新版本的 Java( 从 Java 6 的某个更新开始) 中, 由于 JIT 编译器的发 展和 ” 逃逸分析 ” 技术的逐渐成熟, 栈上分配、 标量替换等优化技术使得对象一 定分配在堆上这件事情已经变得不那么绝对了。

补充 2 : 运行时常量池相当于 Class 文件常量池具有动态性, Java 语言并不要求 常量一定只有编译期间才能产生, 运行期间也可以将新的常量放入池中, String 类的 intern()方法就是这样的。

看看下面代码的执行结果是什么并且比较一下 Java 7 以前和以后的运行结果是否

一致。

2022 最新 Java 基础 面试题(一)

10、Math.round(11.5) 等于多少ath.round(-11.5)等于 多少/h2>

答:

Math.round(11.5)的返回值是 12, Math.round(-11.5)的返回值是-11。 四舍五 入的原理是在参数上加 0.5 然后进行下取整。

11、switch 是否能作用在 byte 上,是否能作用在 long 上, 是否能作用在 String 上/h2>

答:

在 Java 5 以前 ,switch(expr)中,expr 只能是 byte、short、char、int。从 Java 5 开始, Java 中引入了枚举类型, expr 也可以是 enum 类型, 从 Java 7 开始, expr 还可以是字符串( String), 但是长整型( long) 在目前所有的版本中都是 不可以的。

12、用最有效率的方法计算 2 乘以 8/h2>

答:

2

补充: 我们为编写的类重写 hashCode 方法时, 可能会看到如下所示的代码, 其 实我们不太理解为什么要使用这样的乘法运算来产生哈希码( 散列码), 而且为 什么这个数是个素数,为什么通常选择 31 这个数前两个问题的答案你可以自己 百度一下 ,选择 31 是因为可以用移位和减法运算来代替乘法 ,从而得到更好的性 能。 说到这里你可能已经想到了: 31 * num 等价于(num

public class PhoneNumber {private int areaCode; private String prefix; private String lineNumber;@Overridepublic int hashCode() { final int prime = 31; int result = 1;result = prime * result + areaCode; result = prime * result+ ((lineNumber == null) /span> 0 : lineNumber.hashCode()); result = prime * result + ((prefix == null) /span> 0 : prefix.hashCode()); return result;}  @Overridepublic boolean equals(Object obj) { if (this == obj来源:libin9iOak
                                                        

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

上一篇 2022年2月4日
下一篇 2022年2月5日

相关推荐