java面试2020

mac2025-12-16  9

一 声明

此资源全部来自互联网收集, 关注公众号(知识追寻者)获取 大厂面试手册,后台回复 拍拍知识追寻者 即可领取;

二 基础模块

【1】 你对string有什么了解。

【2】Sting ,StingBuilder ,StringBuffer之间的区别;

可变性: String 类中使用 final 关键字字符数组保存字符串,所以string对象是不可变的。 private final char value[]

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[] value ,但是没有用 final 关键字修饰, 这两种对象都是可变的。

线程安全性: String中的对象是不可变的,也就可以理解为常量,线程安全。 StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。 StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。 AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。性能: 每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。 StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

【3】== 和 equals 之间的区别;

是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和的结果一样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法

【4】Throwable 类常用方法

getMessage() 方法:返回异常发生时的详细信息。getCause() 方法:获得导致当前 Throwable 异常的 Throwable 异常。getStackTrace() 方法:获得 Throwable 对象封装的异常信息。printStackTrace() 方法:在控制台上打印

【5】说说包装类型和基础类型;

【6】int和Integer的区别;

Integer是int的包装类型,在拆箱和装箱中,二者自动转换。int是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象。 Integer 对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。

【7】谈谈你对final关键字的理解;

【8】谈谈你对不可变对象的理解;

【9】object类中有那些方法;

【10】面向对象的特征;

【11】final, finalize和finally 之间的区别;

final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为 final 的方法也同样只能使用,不能在子类中被重写。finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在 finally 块中.finalize:Object 类中定义的方法,Java 中允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写 finalize()方法可以整理系统资源或者执行其他清理工作。

【12】error 和 exception 有什么区别

Error:Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关 。比如: OutOfMemoryError NoClassDefFoundError LinkageError

Exception : 在Exception分支中有一个重要的子类RuntimeException(运行时异常),该类型的异常自动为你所编写的程序定义 异常,比如:

ArrayIndexOutOfBoundsException(数组下标越界) NullPointerException(空指针异常) ArithmeticException(算术异常) MissingResourceException(丢失资源) ClassNotFoundException(找不到类) BufferOverflowException ClassCastException

【13】谈谈你对static关键字的理解和使用的注意点;

【14】 java的八大基本数据类型是那些;

【15】 finalize()方法什么时候被调用;

【16】如何将byte转为String;

可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。 我们可以做强制转换,但是Java中int是32位的而byte是8 位的,所以,如果强制转化int类型的高24位将会被丢弃,byte 类型的范围是从-128到128

【17】int 占几个字节;

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

【18】throws, throw, try, catch, finally 代表什么;

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。一般情况下是用 try 来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try 用来指定一块预防所有异常的程序;catch 子句紧跟在 try 块后面,用来指定你想要捕获的异常的类型;throw 语句用来明确地抛出一个异常;throws 用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally 为确保一段代码不管发生什么异常状况都要被执行;try 语句可以嵌套,每当遇到一个 try 语句,异常的结构就会被放入异常栈中,直到所有的 try 语句都完成。如果下一级的try 语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的 try 语句或者最终将异常抛给 JVM。

【19】谈谈你对Java中异常机制的理解;

【20】transient 关键字怎么用;

【21】说说java中的访问修饰符和作用范围;

【22】witch 是否能作用在byte 上?是否能作用在long ?上是否能作用在String上?

在idk 1.7之前,switch只能支持byte, short, char, int或者其对应的封装类以及Enum类型。从idk 1.7之后switch开始支持String。

可以用在byte上,但是不能用在long上

【23】怎么判断String是否为null;

【24】说说你对内部类的了解;

【25】transient 关键字

transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程,transient 只能修饰变量,不能修饰类和方法。

【26】什么是重载和重写;

重写 override 方法名、参数、返回值相同。 子类方法不能缩小父类方法的访问权限。 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 存在于父类和子类之间。 方法被定义为 final 不能被重写。

重载 overload 参数类型、个数、顺序至少有一个不相同。 不能重载只有返回值不同的方法名。 存在于父类和子类、同类中。

【27】clone()是哪个类的方法;

java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法

【28】& 和 &&的区别;

首先记住&是位操作,而&&是逻辑运算符。另外需要记住逻辑运算符具有短路特性,而&不具备短路特性。

【29】 a=a+b与a+=b有什么区别;

【30】父类的静态方法能否被子类重写;

【31】什么是多态,如何实现;

【32】抽象类(abstract class)和接口(interface)有什么区别;

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是 private、默认、protected、public 的,而接口中的成员全都是 public 的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

【33】break、和 continue怎么用;

【34】char能不能存储一个中文汉字

char 类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。使用 Unicode 意味着字符在 JVM 内部和外部有不同的表现形式,在 JVM内部都是 Unicode,当这个字符被从 JVM 内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader 和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;

【35】成员变量和静态变量的区别;

生命周期的不同:

成员变量随着对象的创建而存在随着对象的回收而释放。 静态变量随着类的加载而存在随着类的消失而消失。

调用方式不同:

成员变量只能被对象调用。 静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

别名不同

成员变量也称为实例变量。 静态变量称为类变量。

数据存储位置不同:

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。 静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

【36】java当中的四种引用;

强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上:

强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

【37】Math.round(11.5),Math.round(-11.5)分别等于多少?为什么?

【38】throw 和 throws 之间的区别;

throw ,用于在程序中显式地抛出一个异常。 throws ,用于指出在该方法中没有处理的异常。每个方法必须显式指明哪些异常没有处理,以便该方法的调用者可以预防可能发生的异常。最后,多个异常用逗号分隔

【39】描述动态代理的几种实现方式,分别说出相应的优缺点;

【40】至少写出3种单例模式;

【42】深拷贝和浅拷贝区别;

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

【23】 为什么 Java 被称作是“平台无关的编程语言

java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件( .java )被编译成能被 Java 虚拟机执行的字节码文件( .class )。Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

【42】 Java 对象(Class)创建的方式

使用 new 关键字创建对象。使用 Class 类的 newInstance 方法(反射机制)。使用 Constructor 类的 newInstance 方法(反射机制)。使用 clone 方法创建对象。使用(反)序列化机制创建对象。

【43】实例化顺序

父类静态变量父类静态代码块子类静态变量、子类静态代码块父类非静态变量(父类实例成员变量)父类构造函数子类非静态变量(子类实例成员变量)子类构造函数

【44】静态变量和实例变量的区别

静态变量是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。补充:在 Java 开发中,上下文类和工具类中通常会有大量的静态成员。

【45】Java 中的 final 关键字有哪些用法

类:表示该类不能被继承;修饰方法:表示方法不能被重写;修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

【46】String s = new String(“xyz”) 会创建几个对象

在 String 池内找,找到 “xyz” 字符串,不创建 “xyz” 对应的 String 对象,否则创建一个对象。遇到 new 关键字,在内存上创建 String 对象,并将其返回给 s ,又一个对象。总共是 1 个或者 2 个对象

【47】用最有效率的方法算出2乘以8

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

【48】内部类的作用

内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立.在单个外围类当中,可以让多个内部类以不同的方式实现同一接口,或者继承同一个类.创建内部类对象的时刻不依赖于外部类对象的创建。内部类并没有令人疑惑的”is-a”管系,它就像是一个独立的实体。内部类提供了更好的封装,除了该外围类,其他类都不能访问

【49】String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4请问s5==s2返回什么

返回false。在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=new String(“ab”);

【50】CheckedException 和 RuntimeException 有什么区别

RuntimeException运行异常:表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生CheckedException受检异常:跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常

二 集合模块

【1】Collection 和 Collections 之间的区别;

【2】.List、Set、Map 之间的区别;

【3】java中都有哪些容器;

【4】HashMap、LinkedMap、TreeMap的区别;

【5】 HashMap 、HashTable之间的区别;

【6】HashSet和TreeSet之间的区别;

【7】EnumSet 是什么;

【8】 HashMap 的实现原理;

【9】HashSet 的实现原理;

【10】ArrayList 和 LinkedList 的区别;

【11】 ArrayList 和 Vector 的区别;

【12】Iterator 和 ListIterator 之间的区别;

【13】Enumeration和Iterator接口的区别;

【14】如何决定选用HashMap还是TreeMap;

【15】我们如何对一组对象进行排序;

【16】HashMap底层结构 put操作;

【17】HashMap、HashMap如何保证线程安全;

【18】哪些集合类是线程安全的;

【19】HashMap 的 容量因子是多少,怎么计算使用?

三 IO模块

【1】Java 提供了哪些 IO 方式?

【2】NIO 如何实现多路复用?

【3】字节流和字符流的区别

【4】什么java序列化,如何实现java序列化;

【5】Java中流类的超类主要有那些;

【6】FileInputStream和FileOutputStream是什么?

【7】System.out.println()是什么?

【8】说说PrintStream和PrintWriter?

【9】BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法;

【10】说说你对IO流的理解?

最新回复(0)