本文目录一览:
- 如果你是一个 Java 面试官,你会问哪些问题?
- Java面试中都会遇到哪些问题
- java面试中经常被问到的问题有哪些?
- 润和java开发实习面试问什么
- JAVA面试被闻到:你平时开发中有没有遇到有挑战性的问题,你是怎么解决的?
如果你是一个 Java 面试官,你会问哪些问题?
- 谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
考点分析:对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。
回归正题,对于 Java 平台的理解,可以从很多方面简明扼要地谈一下,例如:Java 语言特性,包括泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。 - 对比 Hashtable、HashMap、TreeMap 有什么不同?
考点分析:上面的回答,只是对一些基本特征的简单总结,针对 Map 相关可以扩展的问题很多,从各种数据结构、典型应用场景,到程序设计实现的技术考量,尤其是在 Java 8 里,HashMap 本身发生了非常大的变化,这些都是经常考察的方面。
很多朋友向我反馈,面试官似乎钟爱考察 HashMap 的设计和实现细节,所以今天我会增加相应的源码解读,主要专注于下面几个方面:- 理解 Map 相关类似整体结构,尤其是有序数据结构的一些要点。
- 从源码去分析 HashMap 的设计和实现要点,理解容量、负载因子等,为什么需要这些参数,如何影响 Map 的性能,实践中如何取舍等。
- 理解树化改造的相关原理和改进原因。
- 除了典型的代码分析,还有一些有意思的并发相关问题也经常会被提到,如 HashMap 在并发环境可能出现无限循环占用 CPU、size 不准确等诡异的问题。我认为这是一种典型的使用错误,因为 HashMap 明确声明不是线程安全的数据结构,如果忽略这一点,简单用在多线程场景里,难免会出现问题。
- 理解导致这种错误的原因,也是深入理解并发程序运行的好办法。对于具体发生了什么,你可以参考这篇很久以前的分析,里面甚至提供了示意图,我就不再重复别人写好的内容了。
- Java 提供了哪些 IO 方式? NIO 如何实现多路复用?
考点分析:在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面,比如:基础 API 功能与设计, InputStream/...
Java面试中都会遇到哪些问题
JAVA面试精选题
各位准程序猿们,能不能找到一份好工作,就看你知不知道这,66道最基本的JAVA面试题,请耐心看完,说不定这10分钟,会影响你一辈子。
面试题NO.01-NO.05
- 问题:如果 main 方法被声明为 private 会怎样?
答案: 能正常编译,但运行的时候会提示“main 方法不是 public 的”。 - 问题:Java 里的传引用和传值的区别是什么?
答案: 传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝。 - 问题:如果要重写一个对象的 equals 方法,还要考虑什么?
答案: hashCode。 - 问题:Java 的“一次编写,处处运行”是如何实现的?
答案: Java 程序会被编译成字节码组成的 class 文件,这些字节码可以运行在任何平台,因此 Java 是平台独立的。 - 问题:说明一下 public static void main(String args[]) 这段声明里每个关键字的作用
答案:- public: main 方法是 Java 程序运行时调用的第一个方法,因此它必须对 Java 环境可见。所以可见性设置为 public。
- static: Java 平台调用这个方法时不会创建这个类的一个实例,因此这个方法必须声明为 static。
- void: main 方法没有返回值。
- String 是命令行传进参数的类型,args 是指命令行传进的字符串数组。
面试题NO.06-NO.10
- 问题:== 与 equals 的区别
答案: == 比较两个对象在内存里是不是同一个对象,就是说在内存里的存储位置一致。两个 String 对象存储的值是一样的,但有可能在内存里存储在不同的地方。
== 比较的是引用而 equals 方法比较的是内容。public boolean equals(Object obj) 这个方法是由 Object 对象提供的,可以由子类进行重写。默认的实现只有当对象和自身进行比较时才会返回 true,这个时候和 == 是等价的。String, BitSet, Date, 和 File 都对 equals 方法进行了重写,对两个 String 对象而言,值相等意味着它们包含同样的字符序列。对于基本类型的包装类来说,值相等意味着对应的基本类型的值一样。 - 问题:如果去掉了 main 方法的 static 修饰符会怎样?
答案: 程序能正常编译。运行时会抛 NoSuchMethodError 异常。 - 问题:为什么 oracle type4 驱动被称作瘦驱动?
答案: oracle 提供了一个 type 4 JDBC 驱动,被称为瘦驱动。这个驱动包含了一个 oracle 自己完全用 Java 实现的一个 TCP/IP 的 Net8 的实现,因此它是平台独立的,可以在运行时由浏览器下载,不依赖任何客户端的 oracle 实现。客户端连接字符串用的是 TCP/IP 的地址端口,而不是数据库名的 tnsname。 - 问题:介绍一下 finalize 方法
答案:- final: 常量声明。
- finally: 处理异常。
- finalize: 帮助进行垃圾回收。
接口里声明的变量默认是 final 的。final 类无法继承,也就是没有子类。这么做是出于基础类型的安全考虑,比如 String 和 Integer。这样也使得编译器进行一些优化,更容易保证线程的安全性。final 方法无法重写。final 变量的值不能改变。finalize() 方法在一个对象被销毁和回收前会被调用。finally,通常用于异常处理,不管有没有异常被抛出都会执行到。比如,关闭连接通常放到 finally 块中完成。
- 问题:什么是 Java API?
答案: Java API 是大量软件组件的集合,它们提供了大量有用的功能,比如 GUI 组件。
面试题NO.11-NO.15
- 问题:GregorianCalendar 类是什么东西?
答案: GregorianCalendar 提供了西方传统日历的支持。 - 问题:ResourceBundle 类是什么?
答案: ResourceBundle 用来存储指定语言环境的资源,应用程序可以根据运行时的语言环境来加载这些资源,从而提供不同语言的展示。 - 问题:为什么 Java 里没有全局变量?
答案: 全局变量是全局可见的,Java 不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。 - 问题:如何将 String 类型转化成 Number 类型?
答案: Integer 类的 valueOf 方法可以将 String 转成 Number。下面是代码示例: - 问题:SimpleTimeZone 类是什么?
答案: SimpleTimeZone 提供公历日期支持。
面试题NO.16-NO.20
- 问题:while 循环和 do 循环有什么不同?
答案: while 结构在循环的开始判断下一个迭代是否应该继续。do/while 结构在循环的结尾来判断是否将继续下一轮迭代。do 结构至少会执行一次循环体。 - 问题:Locale 类是什么?
答案: Locale 类用来根据语言环境来动态调整程序的输出。 - 问题:面向对象编程的原则是什么?
答案: 主要有三点,多态,继承和封装。 - 问题:介绍下继承的原则
答案: 继承使得一个对象可以获取另一个对象的属性。使用继承可以让已经测试完备的功能得以复用,并且可以一次修改,所有继承的地方都同时生效。 - 问题:什么是隐式的类型转化?
答案: 隐式的类型转化就是简单的一个类型赋值给另一个类型,没有显式的告诉编译器发生了转化。并不是所有的类型都支持隐式的类型转化。 代码示例:
面试题NO.21-NO.25
- 问题:sizeof 是 Java 的关键字吗?
答案: 不是。 - 问题:native 方法是什么?
答案: native 方法是非 Java 代码实现的方法。 - 问题:在 System.out.println() 里面,System, out, println 分别是什么?
答案: System 是系统提供的预定义的 final 类,out 是一个 PrintStream 对象,println 是 out 对象里面一个重载的方法。 - 问题:封装,继承和多态是什么?
答案: 简单来说,多态是指一个名字多种实现。多态使得一个实体通过一个通用的方式来实现不同的操作。具体的操作是由实际的实现来决定的。
多态在 Java 里有三种表现方式:- 方法重载
- 通过继承实现方法重写
- 通过 Java 接口进行方法重写。
- 问题:显式的类型转化是什么?
答案: 显式的类型转化是明确告诉了编译器来进行对象的转化。 代码示例:
面试题NO.26-NO.30
- 问题:什么是 Java 虚拟机?
答案: Java 虚拟机是能移植到不同硬件平台上的软件系统。 - 问题:类型向下转换是什么?
答案: 向下转换是指由一个通用类型转换成一个具体的类型,在继承结构上向下进行。 - 问题:Java 的访问修饰符是什么?
答案: 访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。它们包含:- public: 所有类都可以访问
- protected: 同一个包内以及所有子类都可以访问
- private: 只有归属的类才能访问
- 默认: 归属类及相同包下的子类可以访问。
- 问题:所有类的父类是什么?
答案: Object。 - 问题:Java 的基本类型有哪些?
答案: byte, char, short, int, long, float, double, boolean。
面试题NO.31-NO.40
- 问题:静态类型有什么特点?
答案: 静态变量是和类绑定到一起的,而不是类的实例对象。每一个实例对象都共享同样一份静态变量。也就是说,一个类的静态变量只有一份,不管它有多少个对象。类变量或者说静态变量是通过 static 这个关键字来声明的。类变量通常被用作常量。静态变量通常通过类名字来进行访问。当程序运行的时候这个变量就会创建直到程序结束后才会被销毁。类变量的作用域和实例变量是一样的。它的初始值和成员变量也是一样的,当变量没被初始化的时候根据它的数据类型,会有一个默认值。类似的,静态方法是属于类的方法,而不是类对象,它的调用并不作用于类对象,也不需要创建任何的类实例。静态方法本身就是 final 的,因为重写只会发生在类实例上,静态方法是和类绑定在一起的,不是对象。父类的静态方法会被子类的静态方法屏蔽,只要原来方法没有声明为 final。非静态方法不能重写静态方法,也就是说,你不能在子类中把一个静态方法改成实例方法。
非静态变量在每一个对象实例上都有单独的一份值。 - 问题:操作符和操作符有什么区别?
答案: 当一个表达式在求值的时候,两个操作数都会被求值,更像是一个操作符的快捷方式。当一个表达式求值的时候,先计算第一个操作数,如果它返回 true 才会计算第二个操作数。如果第一个操作数取值为 false,第二个操作数就不会被求值。 - 问题:Java 是如何处理整型的溢出和下溢的?
答案: Java 根据类型的大小,将计算结果中的对应低阶字节存储到对应的值里面。 - 问题:public static void 写成 static public void 会怎样?
答案: 程序正常编译及运行。 - 问题:声明变量和定义变量有什么不同?
答案: 声明变量我们只提供变量的类型和名字,并没有进行初始化。定义包括声明和初始化两个阶段。String s; 只是变量声明,String s = new String("bob"); 或者 String s = "bob"; 是变量定义。
面试题NO.41-NO.45
- 问题:Java 支持哪种参数传递类型?
答案: Java 参数都是进行传值。对于对象而言,传递的值是对象的引用,也就是说原始引用和参数引用的那个拷贝,都是指向同一个对象。 - 问题:对象封装的原则是什么?
答案: 封装是将数据及操作数据的代码绑定到一个独立的单元。这样保障了数据的安全,防止外部代码的错误使用。对象允许程序和数据进行封装,以减少潜在的干涉。对封装的另一个理解是作为数据及代码的保护层,防止保护层外代码的随意访问。 - 问题:你怎么理解变量?
答案: 变量是一块命名的内存区域,以便程序进行访问。变量用来存储数据,随着程序的执行,存储的数据也可能跟着改变。 - 问题:数值提升是什么?
答案: 数值提升是指数据从一个较小的数据类型转换成为一个更大的数据类型,以便进行整型或者浮点型运算。在数值提升的过程中,byte, char, short 值会被转化成 int 类型。需要的时候 int 类型也可能被提升成 long。long 和 float 则有可能会被转换成 double 类型。 - 问题:Java 的类型转化是什么?
答案: 从一个数据类型转换成另一个数据类型叫做类型转换。Java 有两种类型转换的方式,一个是显式的类型转换,一个是隐式的。
面试题NO.46-NO.50
- 问题:main 方法的参数里面,字符串数组的第一个参数是什么?
答案: 数组是空的,没有任何元素。不像 C 或者 C++,第一个元素默认是程序名。如果命令行没有提供任何参数的话,main 方法中的 String 数组为空,但不是 null。 - 问题:怎么判断数组是 null 还是为空?
答案: 输出 array.length 的值,如果是 0,说明数组为空。如果是 null 的话,会抛出空指针异常。 - 问题:程序中可以允许多个类同时拥有都有 main 方法吗?
答案: 可以。当程序运行的时候,我们会指定运行的类名。JVM 只会在你指定的类中查找 main 方法。因此多个类拥有 main 方法并不存在命名冲突的问题。 - 问题:静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢?
答案: 当类加载器将类加载到 JVM 中的时候就会创建静态变量,这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块,它并不是类的成员,也没有返回值,并且不能直接调用。静态代码块不能包含 this 或者 super,它们通常被用初始化静态变量。 - 问题:一个类能拥有多个 main 方法吗?
答案: 可以,但只能有一个 main 方法拥有以下签名:
否则程序将无法通过编译。编译器会警告你 main 方法已经存在。
面试题NO.51-NO.60
- 问题:简单的介绍下 JVM 是如何工作的?
答案: JVM 是一台抽象的计算机,就像真实的计算机那样,它们会先将 .java 文件编译成 .class 文件(.class 文件就是字节码文件),然后用它的解释器来加载字节码。 - 问题:如果原地交换两个变量的值?
答案: 先把两个值相加赋值给第一个变量,然后用得到的结果减去第二个变量,赋值给第二个变量。再用第一个变量减去第二个变量,同时赋值给第一个变量。代码如下:
使用异或操作也可以交换。第一个方法还可能会引起溢出。异或的方法如下:int a=5,b=10;a=a+b; b=a-b; a=a-b; - 问题:什么是数据的封装?
答案: 数据封装的一种方式是在类中创建 set 和 get 方法来访问对象的数据变量。一般来说变量是 private 的,而 get 和 set 方法是 public 的。封装还可以用来在存储数据时进行数据验证,或者对数据进行计算,或者用作自省(比如在 struts 中使用 javabean)。把数据和功能封装到一个独立的结构中称为数据封装。封装其实就是把数据和关联的操作方法封装到一个独立的单元中,这样使用关联的这些方法才能对数据进行访问操作。封装提供的是数据安全性,它其实就是一种隐藏数据的方式。 - 问题:什么是反射 API?它是如何实现的?
答案: 反射是指在运行时能查看一个类的状态及特征,并能进行动态管理的功能。这些功能是通过一些内建类的反射 API 提供的,比如 Class, Method, Field, Constructors 等。使用的例子:使用 Java 反射 API 的 getName 方法可以获取到类名。 - 问题:JVM 自身会维护缓存吗,是不是在堆中进行对象分配,操作系统的堆还是 JVM 自己管理的堆?为什么?
答案: 是的,JVM 自身会管理缓存,它在堆中创建对象,然后在栈中引用这些对象。
面试题NO.61-NO.66
- 问题:虚拟内存是什么?
答案: 虚拟内存又叫延伸内存,实际上并不存在真实的物理内存。 - 问题:方法可以同时即是 static 又是 synchronized 的吗?
答案: 可以。如果这样做的话,JVM 会获取和这个对象关联的 java.lang.Class 实例上的锁。这样做等于: - 问题:String 和 StringTokenizer 的区别是什么?
答案: StringTokenizer 是一个用来分割字符串的工具类。 - 问题:transient 变量有什么特点?
答案: transient 变量不会进行序列化。例如一个实现 Serializable 接口的类在序列化到 ObjectStream 的时候,transient 类型的变量不会被写入流中,同时,反序列化回来的时候,对应变量的值为 null。 - 问题:哪些容器使用 Border 布局作为它们的默认布局?
答案: Window, Frame, Dialog。 - 问题:怎么理解什么是同步?
答案: 同步用来控制共享资源在多个线程间的访问,以保证同一时间内只有一个线程能访问到这个资源。在非同步保护的多线程程序里面,一个线程正在修改一个共享变量的时候,可能有另一个线程也在使用或者更新它的值。同步避免了脏数据的产生。 以上回答转载自求职类公众号圈里求职,里面还有更多求职面试经,程序猿也要学起来~
java面试中经常被问到的问题有哪些?
java 面试中经常被问到的问题有如下:
- 简述 string 对象,StringBuffer、StringBuilder 区分。
- 多态的原理。
- 简要描述面向对象编程的思想。
- 反射的原理。
- java.util 包的 UML 结构图。
- Vector 和 ArrayList、LinkedList 区别。
- Hashtable 和 HashMap 之间的区别。
润和java开发实习面试问什么
关于 Java 面试,一般应该会问到下面这些问题。
[编程工具]
你常用的编程工具有哪些?这个问题主要是考察你工作的专业性,你是不是具有大型项目的工作经验。
一般好的,Java 的编程工具,你比如说,Eclipse, netbeans, Intelli J 等等。
[局部变量和类变量的区别]
这个问题主要是考察选手对于 scope 的概念。回答这个问题,
就是局部变量是在方法里面定义的。这个变量只能在方法内部才可以被调用。
类变量呢,可以在类的内部,任何地方都可以被调用。类变量还可以添加一些修饰符,限制或者允许外部类调用。
[什么是继承?]
继承就是说子类可以享有父类的一些定义。
[什么是封装?]
封装是通过类定义的方式,把一些方法和数据包裹起来。
[什么是多态?]
多态是指一个对象可以通过具体的引用类型来调用父类和子类的一些方法。
这三个问题主要是考察选手对于面向对象编程的概念。
[Overriding 和 overloading 的区别]
这两种方法在编程中会经常用到。被问的可能性非常大。
Overriding 主要用在子类要使用父类的一些方法定义。方法名必须相同,方法参数必须相同,返回值类型必须相同。使用这种方法,子类既可以调用父类的方法也可以添加自己个性化的实现。
Overloading 主要用在方法这一层次上。具有同样的方法名,不同的参数类型,可能会返回不同的数据类型。
[接口和抽象的区别?]
这个问题在面向对象编程里面也是经常被问到的一个问题。
在 Java 中,无法实现多类继承,所以就引入了接口的概念。接口中,主要是类的声明,没有实现内容。
抽象类中至少要含有一个抽象方法。这个抽象方法只有声明没有实现。抽象类的非抽象方法,需要有实现内容。
[说一下访问修饰符]
这也是面向对象编程里面非常重要的一个概念。
private, protected, public。没有修饰符,就是 default。
private 只能在本类内部访问。
protected 在本类和子类中访问。
public 在其他类中都可访问。
default 在包内可访问。
[数组和数组列表的区别?]
[String, StringBuilder, StringBuffer 的区别?]
string 不可修改。
string builder 可修改,线程不安全的。
string buffer 可修改,线程安全的。
[HashMap, HashTable 的区别?]
都是字典类型。
hash map 是线程不安全的。
hash table 是线程安全的。
[Set 相关的问题]
Set 里面的数据是唯一的。
sorted set 是可排序的。
[Queue 相关的问题]
priority queue 先进先出。
[Map 相关的问题]
有 hash map, linked hash map, tree map.
JAVA面试被闻到:你平时开发中有没有遇到有挑战性的问题,你是怎么解决的?
这个问题可以从平时开发项目中的经验来说,主要考察自己开发实际项目时候的解决思路。比如常见的访问量剧增问题、资源消耗过快、内存占满响应速度慢。
运行程序来遍历表中的所有域。第一个参数是要遍历的表,第二个参数是表中的某个键。next 返回该键的下一个键及其关联的值。如果用 nil 作为第二个参数调用 next 将返回初始键及其关联值。当以最后一个键去调用,或是以 nil 调用一张空表时,next 返回 nil。如果不提供第二个参数,将认为它就是 nil。特别指出,你可以用 next(t) 来判断一张表是否是空的。
索引在遍历过程中的次序无定义,即使是数字索引也是这样。(如果想按数字次序遍历表,可以使用数字形式的 for。)
当在遍历过程中你给表中并不存在的域赋值,next 的行为是未定义的。然而你可以去修改那些已存在的域。特别指出,你可以清除一些已存在的域。
如果 t 有元方法 __pairs,以 t 为参数调用它,并返回其返回的前三个值。
否则,返回三个值:next 函数,表 t,以及 nil。因此以下代码
能迭代表 t 中的所有键值对。
参见函数 next 中关于迭代过程中修改表的风险。
pcall (f [, arg1, ···])
传入参数,以保护模式调用函数 f。这意味着 f 中的任何错误不会抛出;取而代之的是,pcall 会将错误捕获到,并返回一个状态码。第一个返回值是状态码(一个布尔量),当没有错误时,其为真。此时,pcall 同样会在状态码后返回所有调用的结果。在有错误时,pcall 返回 false 加错误消息。
接收任意数量的参数,并将它们的值打印到 stdout。它用 tostring 函数将每个参数都转换为字符串。print 不用于做格式化输出。仅作为看一下某个值的快捷方式。多用于调试。完整的对输出的控制
在不触发任何元方法的情况下检查 v1 是否和 v2 相等。返回一个布尔量。
rawget (table, index)
在不触发任何元方法的情况下获取 table[index] 的值。table 必须是一张表;index 可以是任何值。
rawlen (v)
在不触发任何元方法的情况下返回对象 v 的长度。v 可以是表或字符串。它返回一个整数。
rawset (table, index, value)
在不触发任何元方法的情况下将 table[index] 设为 value。table 必须是一张表,index 可以是 nil 与 NaN 之外的任何值。value 可以是任何 Lua 值。
这个函数返回 table。
select (index, ···)
如果 index 是个数字,那么返回参数中第 index 个之后的部分;负的数字会从后向前索引(-1 指最后一个参数)。否则,index 必须是字符串 "#",此时 select 返回参数的个数。
希望能帮到你。