4月1日-10日需要背的面试题,注意是结合场景背,理解着背,加油吧!!

1、知识点

  • return或者throw之前要执行finally中的内容
  • protected class A 这样写不对,类的访问权限修饰符只能是 public 和 default
  • 标识符:可以包含字母、数字、下划线、$;不能以数字开头;不能是 Java 关键字
  • java.lang.Runnable 是接口,Double 对象在 java.lang 包中
  • 内存由 JVM 负责释放,程序员无法直接释放内存,垃圾回收时间不确定
  • 包装类可以实现基本类型和字符串之间的转换,字符串转基本类型:parseXXX(String s);基本类型转字符串:String.valueOf(基本类型)
  • 构造方法在一个对象被 new 时执行
  • abstract 方法必须在 abstract 类中
  • abstract 类中可以有 private 的成员
  • abstract 不能与 final 并列修饰同一个类
  • abstract 只能修饰方法和类,不能修饰字段
  • interface中的访问权限修饰符只能是 public 或 default
  • interface中的方法必须要实现类实现,所以不能使用 final
  • interface中所有的方法默认都是 abstract,通常 abstract 省略不写
  • 只有 public、abstract和默认的 3 种修饰符能够修饰 interface
  • 加载 class 时首先完成 static 方法装载,非 static 属性和方法还没有完成初始化,所以不能调用。
  • public 修饰的成员变量和方法可以在任何类中都能被访问到,private私有的。只能在当前类中被访问到,protected 修饰的成员会被位于同一 package 中的所有类访问到,也能被该类的所有子类继承下来。
    friendly 所修饰的成员是缺省的,在同一package中的所有类都能访问,但只能被该类所在同一个 package 中的子类所继承下来。
  • 实现字符串反转:使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。
  • 值相等的情况下:基本类型==包装对象返回 true
  • 装箱是通过调用包装器类的 valueOf 方法实现的;拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法。Integer i = 8;//自动装箱    int n = i;//自动拆箱
  • Math.random()的返回值是0-1
  • 编译程序时,环境变量包括 java_home 和 class path,javac —次可同时编译数个 Java 源文件,javac.exe -d 参数可指定生成类文件的位置
  • call by value:传递的是具体的值,基础数据类型就是这种类型,不能改变实参的数值
  • call by reference:传递的是对象的引用,即对象的存储地址,不能改变实际参数的参考地址但可以访问和改变地址中的内容
  • 存在i+1< i的数,integer.max+1就是负数
  • 正则表达式
  • \d  匹配一个数字字符,等价于[0-9]
  • \D  匹配一个非数字字符,等价于[^0-9]
  • \s  匹配任何空白字符,包括空格、制表符、换页符等,等价于 [ \f\n\r\t\v]
  • .  匹配除换行符 \n 之外的任何单字符,匹配 .  字符需要转译,使用 \. 
  • *  匹配前面的子表达式零或多次,匹配 * 字符,需要转译使用 \*
  • 匹配前面子表达式零或一次,或表示指明表达式为非贪婪模式的限定符。匹配 ? 字符,需要转译使用 \?
  • |  将两个匹配条件进行逻辑 或 运算
  • +  匹配前面的子表达式一次或多次,要匹配 + 字符需要转译,使用 \+
  • [0-9]{6}  匹配连续6个0-9之间的数字
  • long l = 1234是对的
  • 接口可继承接口,抽象类可实现接口,抽象类可继承实体类
  • 100 =  1*(8*8) + 4*(8*1) + 4*1,八进制:144,Java中八进制数必须以0开头,0144

  • final 修饰基本类型变量,值不能改变;final 修饰引用类型变量,栈内存中的引用不能改变,所指向的堆内存中的对象的属性值可能可以改变
  • getDeclaredFields(): 获取所有本类自己声明的属性, 不能获取父类和实现的接口中的属性;getFields(): 只能获取所有 public 声明的属性, 包括获取父类和实现的接口中的属性

2、什么是JAVA内部类?匿名内部类可以继承类或实现接口吗?为什么?静态内部类和非静态内部类有什么区别?

3、JDK、JRE、JVM

JDK 的安装目录 5 个文件夹、一个 src 源码压缩包

  • bin:各种命令工具, java 源码的编译器 javac、监控工具 jconsole、分析工具
  • include:与 JVM 交互C语言用的头文件
  • lib:类库      
  • jre:Java 运行环境 
  • db:安装 Java DB 的路径

JRE:Java Runtime Environment的缩写,表示JAVA运行环境,包含 JVM及 Java 核心类库

JVM:Java Virtual Machine,是实现跨平台的最核心的部分,.class 文件会在 JVM 上执行,JVM 会解释给操作系统执行;JVM 包含 Java 应用程序的类的解释器和类加载器等

4、

5、if  -else if-else与switch的区别

6、每个数组元素都有默认值,基本类型的默认值为 0、0.0、false,引用类型的默认值为 null

7、在不确定参数的个数时,可以使用可变参数。每个方法最多只有一个可变参数,必须是方法的最后一个参数;可以设置为任意类型:引用类型,基本类型;参数的个数可以是 0 个、1 个或多个;可变参数也可以传入数组;通过对 class 文件反编译可以发现,可变参数被编译器处理成了数组

8、说一说你的对面向过程和面向对象的理解

  • 软件开发思想,先有面向过程,后有面向对象,都是解决实际问题的思维方式。但在大型软件系统中,面向过程的做法不足,从而推出了面向对象,两者相辅相成,宏观上面向对象把握复杂事物的关系;微观上面向过程去处理
  •  面向过程以实现功能的函数开发为主;面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能
  • 面向过程封装的是功能;面向对象封装的是数据和功能
  • 面向对象具有继承性和多态性;面向过程则没有

9、方法重载和重写是什么?有什么区别?

重载发生在同⼀个类中,⽅法名必须相同,参数类型不同、个数不同、顺序不同,⽅法返回值和访问修饰符可以不同。重载就是同⼀个类中多个同名⽅法根据不同的传参来执⾏不同的逻辑处理。

 重写发生在运行期,是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写。1. 返回值类型、⽅法名、参数列表必须相同,抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类。2. 如果⽗类⽅法访问修饰符为 private/final/static 则⼦类就不能重写该⽅法,但是被 static修饰的⽅法能够被再次声明。3. 构造⽅法⽆法被重写综上:重写就是⼦类对⽗类⽅法的重新改造,外部样⼦不能改变,内部逻辑可以改变。

10、this和super关键字的作用

this主要是为了解决成员变量和局部变量同名问题。this.就代表了成员变量。在普通方法中可以省略 this,在静态方法当中不允许出现 this 关键字,因为this代表的是当前对象,而使用了静态方法之后(static)之后,这个方法就是属于当前类的,是随着类加载而形成的,这个时候还没有对象,用this.对象肯定会报错。

super代表对当前对象的直接父类对象的引用,可以调用父类的非 private 成员变量和方法,仅限在第一行调用否则会报错

11、static、abstract、final、this、super、private、public、protected、default、friendly关键字的作用是什么?

abstract:可以修饰类和方法,不能修饰属性和构造方法。abstract 修饰的类是抽象类,需要被继承,修饰的方法是抽象方法,需要被子类重写

final与static的区别:

  • 都可以修饰类、方法、成员变量。
  • 都不能用于修饰构造方法。
  • static 可以修饰类的代码块,final 不可以。
  • static 不可以修饰方法内的局部变量,final 可以。
  • static 修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性 / 方法名 访问
  • static 修饰的代码块表示静态代码块,当 Java 虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次
  • static 修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次
  • static 方法中不能用 this 和 super 关键字
  • static 方法必须是实现类有方法体,而不能是抽象的abstract
  • static 方法不能被重写

12、Object、String、Collections、list、map的常用方法

Object:getClass(); 获取类结构信息;hashCode() 获取哈希码;equals(Object) 默认比较对象的地址值是否相等;toString() 把对象转变成字符串;notify() 多线程中唤醒功能;notifyAll() 多线程中唤醒所有等待线程的功能

String:equals:字符串是否相同;indexOf:目标字符或字符串在源字符串中位置下标;lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标;valueOf:其他类型转字符串;charAt:获取指定下标位置的字符;concat:追加字符串到当前字符串;isEmpty:字符串长度是否为0;contains:是否包含目标字符串;length:字符串字符数;replace:字符串替换;replaceAll:带正则字符串替换;split:以某正则表达式分割字符串;substring:截取字符串;toLowerCase:字符串转小写;toUpperCase:字符串转大写;trim:去字符串首尾空格

13、子类构造方法的执行过程是什么样的?

第一种情况:子类没有显示调用父类含参构造方法,并且也没有this.调用自身其他构造方法时,系统会默认先调用父类的无参构造方法,再调用子类的无参构造方法。

第二种情况:如果子类的构造方法中通过 super 显式调用父类的有参构造方法,将执行父类相应的构造方法。不执行无参父类构造方法

第三种情况:如果子类的构造方法中通过 this 显式调用自身的其他构造方法,将执行类中相应的构造方法。不执行无参构造方法

14、什么是Java的垃圾回收机制?

15、instanceof关键字的作用是什么?

在运行时判断对象是否是指定类及其父类的一个实例。

16、什么是Java的多态?

多态的前提首先要有继承关系,子类要重写父类的方法,父类引用指向子类,

向上转型:将一个父类的引用指向一个子类对象,自动进行类型转换。

向下转型必须转换为父类引用指向的真实子类类型,不是任意的强制转换,否则会出现 ClassCastException

向下转型时可以结合使用 instanceof 运算符进行判断

17、不通过构造方法能创建对象吗?

创建对象的几种方式:1、new 2、通过反射 调用newInstance()方法,是Class类或者Constructor类 3、调用对象的clone()方法  4、运用反序列化手段,调用ObjectInputStream 对象的 readObject() 方法

18、内存泄漏和内存溢出的区别

  • 内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,内存泄露堆积会导致内存被占光。
  • 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory。
  • 内存泄露会导致内存溢出

19、java.sql.Date和java.util.Date的区别

20、==和equals的区别是什么?

    == 基本数据类型比较的是值,引⽤数据类型比较的是内存地址

    equals分为两种情况,一种情况就是没有重写equals(),等价于==;另一种情况是类重写了equals()方法,比较的就是两个对象的内容是否相等

21、接口和抽象类有什么区别?

  • 抽象类可以有构造方法;接口中不能有构造方法。因为不能有方法体
  • 接口中成员变量必须要初始化
  • 抽象类中可以包含非抽象普通方法;JDK1.8 以前接口中的所有方法默认都是抽象的,JDK1.8 开始方法可以有 default 实现和 static 方法。并且在接口中含有static修饰的方法要加方法体
  • 抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。
  • 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。
  • 接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

 22、普通类和抽象类有哪些区别?

  • 抽象类不能被实例化,可以有抽象方法,也可以没有。抽象方法只需声明不需要实现,含有抽象方法的类必须声明为抽象类
  • 抽象类的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
  • 抽象方法不能被声明为静态,不能用 private 修饰,不能用 final 修饰

23、Math.round(-1.5) 等于多少?

      JDK 中的 java.lang.Math 类

  • ceil() :向上取整,返回小数所在两整数间的较大值,返回类型是 double,如 -1.5 返回 -1.0
  • floor() :向下取整,返回小数所在两整数间的较小值,返回类型是 double,如 -1.5 返回 -2.0
  • round() :朝正无穷大方向返回参数最接近的整数,返回值是 int 或 long,如 -1.5 返回 -1

24、java中操作字符串都有哪些类?它们之间有什么区别?--String、StringBuilder、StringBuffer

可变性
简单的来说:String 类中使⽤ final 关键字修饰字符数组来保存字符串,private final charvalue[],所以 String 对象是不可变的。⽽ StringBuilder 与 StringBuffer 都继承⾃ AbstractStringBuilder 类,在AbstractStringBuilder 中也是使⽤字符数组保存字符串char[]value,但是没有⽤ final 关键字修饰,所以这两种对象都是可变的。
StringBuilder 与 StringBuffer 的构造⽅法都是调⽤⽗类构造⽅法也就是 AbstractStringBuilder实现的。
线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是StringBuilder 与 StringBuffer 的公共⽗类,定义了⼀些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共⽅法。
StringBuffer对⽅法加了同步锁或者对调⽤的⽅法加了同步锁,所以是线程安全的。
StringBuilder并没有对⽅法进⾏加同步锁,所以是⾮线程安全的。
性能
每次对 String 类型进⾏改变的时候,都会⽣成⼀个新的 String 对象,然后将指针指向新的 String对象。
StringBuffer 每次都会对 StringBuffer 对象本身进⾏操作,⽽不是⽣成新的对象并改变对象引⽤。
相同情况下使⽤ StringBuilder 相⽐使⽤ StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的⻛险。
对于三者使⽤的总结:1. 操作少量的数据: 适⽤ String2. 单线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuilder3. 多线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuffer

25、final finally finalize()区别

  • finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如直接返回未执行到 try-finally 语句块;在trycatch之前抛出异常未执行到 try-finally 语句块;系统退出未执行到 finally 语句块)
  • finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。Java 技术允许使用 finalize() 方法在GC将对象从内存中清除出去之前做必要清理工作,是在GC删除对象之前被调用的。一般情况下,此方法由JVM调用。特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,要调用 super.finalize() 。 

26、hashCode()相同,equals()也一定为true吗?

       不一定,反之也不成立,因为类的 hashCode() 方法和 equals() 方法都可以重写,返回的值完全在于自己定义。hashCode() 返回该对象的哈希码值;equals() 返回两个对象是否相等。

但是对于这两个方法有一个常规的协定,就是说两个对象用equals()返回为true的时候,那么两个对象的hashCode()方法必须返回相同的结果。两个对象用 equals() 比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,以提高哈希表性能。如果要重写 equals() 方法,那也必须重写 hashCode() 方法,用来保证 equals() 方法相等时两个对象 hashcode() 返回相同的值。

 

27、三次握手,四次挥手

TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ack标志位置为1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ack标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。

四次握手机制也是由客户端去发起,客户端会发送一个报文,在报文里面FIN位标志位置一,当服务端收到这个报文之后,我就知道了客户端想要和我断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的这个消息的时候,对于服务端而言,他和还有可能有未发送完的消息,他还要继续发送,所以呢,此时对于服务端而言,我只能进行一个消息确认,就是我先告诉服务端,我知道你要给我断开连接了,但是我这里边还可能没有做好准备,你需要等我一下,等会儿我会告诉你,于是呢,发完这个消息确认包之后,可能稍过片刻它就会继续发送一个断开连接的一个报文啊,也是一个FIN位置1的报文也是由服务端发给客户端的啊,这个报文表示服务端已经做好了断开连接的准备,那么当这个报文发给客户端的时候,客户端同样要给服务端继续发送一个消息确认的报文一共有四次,那么,通过这四次的相互沟通和连接,我就知道了,不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就可以被断开啊,这是我对三次握手和四次挥手的一个理解。

 

28、HTTP、TCP、UDP

TCP协议提供安全可靠的网络传输服务,它是一种面向连接的服务。类似于打电话,必须先拨号,双方建立一个传递信息的通道传输。

而UDP协议是一种数据报协议,它传输的数据是分组报文,它是无连接的,不需要和目标通信方建立连接,类似于写信,所以它的传输不保证安全可靠。但适合大数据量的传输。

Http.协议是超文本传输协议,是一.种相对于TCP来说更细致的协议,TCP以及UDP协议规范的是网络设备之间的通信规范,HTTP是在TCP协议的基础上针对用户服务的协议,用户服务具体体现在应用程序之间的交互,比如我们的javaweb中客户端服务端体系就要用http.协议来规范通信。

计算机网络中有这样一个术语,TIP/IP 网络参考模型,整个计算机网络系统被分为4层,从底层到顶层分别为:网络接口层,网际层,传输层,应用层,每层的通信都有 专门的协议,底层是为上一层提供服务的。我们的TCP以及UDP是传输层的协议,而HTTP协议是处在应用层的协议。结合项目使用TCP和UDP在开发中我们很少见到,但是网络底层都有它们的影子,正常的会话级别的服务:如客户端服务器体系底层就说基于TCP协议的。而邮件发送,短信发送等底层使用的是UDP协议。HTTP协议,客户端/服务器体系的程序都使用HTTP协议来规范通信。

29、可序列化对象为什么要定义serialversionUID值?

  • SerialVersionUid 是为了序列化对象版本控制,告诉 JVM 各版本反序列化时是否兼容
  • 如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassException异常
  • 仅增加了一个属性,希望向下兼容,老版本的数据都保留,就不用修改
  • 删除了一个属性,或更改了类的继承关系,就不能不兼容旧数据,这时应该手动更新 SerialVersionUid

30、

 

7、nio中的Files类常用方法有哪些?

8、什么是反射?有什么作用?

9、动态代理是什么?应用场景?

10、怎么实现动态代理?

11、什么是java序列化?什么情况下需要序列化?

12、什么场景要对象克隆?

13、深拷贝和浅拷贝区别是什么?

14、如何实现对象克隆与深拷贝?

15、Java跨平台运行的原理

16、Java的安全性体现在哪里?

17、Java针对不同的应用场景提供了哪些版本?

3、下面打印结果是?


int i = 5;
switch (i) {
default:
    System.out.println("default");
case 0:
    System.out.println(0);
    break;
case 1:
    System.out.println(1);
    break;
case 2:
    System.out.println(2);
    break;
}

4、Java属于编译型还是解释型语言?

5、如果有两个类A、B(注意不是接口),如何编写C类同时使用这两个类的功能?

6、构造方法是否可以被重载?重写?

7、基本类型byte表示的数值范围是多少?

8、日期类型如何格式化?字符串如何转日期?

9、当输入为2的时候返回值是


public static int cal(int i) {
    int result = 0;
    switch (i) {
    case 1:
        result = result + i;
    case 2:
        result = result + i * 2;
    case 3:
        result = result + i * 3;
    }
    return result;
}

10、System.out.println('a'+1);的结果是

11、静态与非静态成员变量区别?

12、二进制数,小数点向右移一位,值会发生什么变化?

13、下面两段代码的区别是?


short s1 = 1; s1 = s1 + 1;
short s1 = 1; s1 += 1;

14、switch能否作用在byte、long、String上?

15、在Java 中,如何跳出当前的多重嵌套循环?

16、为什么不能根据返回类型来区分方法重载?

17、Inner Class和Static Nested Class的区别?

18、abstract方法是否可是static的?native的?synchronized的?

19、静态方法内部能对非静态调用吗?

20、内部类可以引用它的外部类的成员吗?有什么限制?

1、打印结果是什么

2、说说字符串与基本数据之间的转换

3、GB2312编码的字符串如何转换为ISO-8859-1编码?

4、Java中的日期与时间获取与转换?

5、反射主要实现类有哪些?

6、Class类的作用是什么?如何获取Class对象?

7、反射的使用场景、作用及优缺点?

8、面向对象设计原则有哪些?

9、反射的使用场景、作用及优缺点?

10、下面代码的输出是?


public class TestExchange {
    String str = new String("1");
    char[] arr = { 'a', 'b', 'c' };

    public static void main(String[] args) {
        TestExchange te = new TestExchange();
        te.exchange(te.str, te.arr);
        System.out.print(te.str + " ");
        System.out.print(te.arr);
    }

    public void exchange(String str, char arr[]) {
        str = "2";
        arr[0] = 'd';
    }
}

11、关于String[] strArr=new String[10];正确的是()


  • A、strArr[10] 为 ""
  • B、strArr[0] 为未定义
  • C、strArr[9] 为 null
  • D、strArr.length 为 10

12、写一个方法实现String类的replaceAll方法

13、String类是否可以继承?

14、String、StringBuilder、StringBuffer的区别?

15、为什么String类被设计用final修饰?

16、String s = new String("xyz");创建几个String对象?

17、String s="a"+"b"+"c"+"d";创建了几个对象?

18、对比一下Java和JavaScriprt

19、什么是assert?

20、类的实例化方法调用顺序

21、JDK8中Stream接口的常用方法

22、说说反射在你实际开发中的使用

23、什么是泛型?为什么要使用泛型?

24、有没有使用JDK1.8 中的日期与时间API?

1、java 有哪些常用容器(集合)?

2、ArrayList和Vector的联系和区别

3、Collection和Collections有什么区别?

4、List、Set、Map 之间的区别是什么?

5、HashMap和Hashtable 有什么区别?

6、如何决定使用HashMap还是TreeMap?

7、ArrayList和LinkedList的区别是什么?

8、Array和ArrayList有何区别?

9、如何实现数组和List之间的转换?

10、Queue的add()和offer()方法有什么区别?

11、Queue的remove()和poll()方法有什么区别?

12、Queue的element()和peek()方法有什么区别?

13、哪些集合类是线程安全的?

14、迭代器Iterator是什么?

15、Iterator怎么使用?有什么特点?

16、Iterator和 ListIterator有什么区别?

17、怎么确保一个集合不能被修改?

18、为什么基本类型不能做为HashMap的键值?

19、HashMap的键值需要注意什么?

20、Java中已经数组类型,为什么还要提供集合?

1、TreeSet的原理是什么?使用需要注意什么?

2、HashSet实现原理是什么?有什么特点?

3、正确的是()


  • A、LinkedList 继承自 List
  • B、TreeMap 继承自 HashMap
  • C、HashSet 继承自 AbstractSet
  • D、AbstractSet 继承自 Set

4、HashSet和HashMap有什么区别?

5、ArrayList list=new ArrayList(10);中的list扩容几次?

6、List、Set、Map哪个继承自Collection接口?

7、ArrayList与LinkedList哪个插入性能高?

8、LinkedHashMap、LinkedHashSet、LinkedList哪个最适合当作Stack使用?

9、Map的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性?

10、TreeMap和TreeSet在排序时如何比较元素?

11、Collections工具类中的sort方法如何比较元素?

12、List里如何剔除相同的对象?

13、Java.util.Map的常用实现类有哪些?

14、List、Set、Map 是否继承自 Collection 接口?

15、Vector、ArrayList、LinkedList 的存储性能和特性?

16、List、Map、Set 三个接口,存取元素时,各有什么特点?

17、Map的遍历方式

18、List、Set和Map接口的特点与常用的实现类

19、说一下HashMap的实现原理

20、ConcurrentHashMap了解吗?说说实现原理。

 

 

1、列举常见的运行时异常(具体场景)

       空指针异常NullPointerException:这个是开发中最常见的异常了,如果对象为空,然后调其他方法的时候就会报空指针

       算术异常ArithmeticException:举个最简单的例子,定义两个变量,让被除数为0

       类型转换异常ClassCastException:比如说我创建一个日期类Date的对象,返回值是Object,也就是多态,然后我强转成string类型,编译器也不会报错因为Object类是顶级父类,运行时就会报错,因为                                                                       Date类型和String完全是不搭边的两个类

       输入类型不匹配异常InputMismatchException:比如说我写一个Scanner,调nextInt方法,如果输入一个字符串就会报这个异常

       数据格式异常NumberFormatException:比如说定义一个Stirng类型变量,然后调包装类Integer的parseInt方法,但是我传的String是一个非整型的值,就会报错

       数组下标越界异常IndexOutOfBoundsException:调用数组没有的下标

2、OutOfMemoryError的原因有哪些?怎么解决?

原因:JVM 在 GC 时,对象过多,导致内存溢出

解决:调整 GC 的策略,在一定比例下开始GC而不使用默认的策略,或将新代和老代设置合适的大小,可以微调存活率。如在老代 80% 时就是开始GC,并且将 -XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)设置的更合理

3、Unsupported major.minor version 52是什么造成的,如何解决?

     工程中存在 jar 包编译时所用的 JDK 版本高于build path 中 JDK 的版本。这里的 version 52 对应 JDK 版本是 1.8,将项目的 build path 中 JDK 的版本调整为高于或等于 1.8 即可。

4、Java中如何进行异常处理?throws、throw、try、catch、finally分别如何使用?

       通过 5 个关键词实现:throw、throws、try、catch 和 finally

     定义方法时,可以使用 throws 关键字抛出异常
    方法体内使用 throw 抛出异常
    使用 try 执行一段代码,当出现异常后,停止后续代码的执行,跳至 catch 语句块,使用 catch 来捕获指定的异常,并进行处理
    finally 语句块表示是在 try、catch 语句块执行结束后,最后一定会被执行

5、运行时异常与受检异常有何异同?

      异常表示程序运行过程中可能出现的非正常状态,运行时异常,表示程序代码在运行时发生的异常,受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能某行代码出现潜在的问题而在编译器报错,这个时候就要手动trycatch或者是向上抛异常,使程序能通过javac通过编译期

6、异常的设计原则有哪些?

  • 优先使用标准的异常
  • 避免不必要的使用受检异常
  • 保持异常的原子性

7、Java中异常处理机制

分别从异常的结构,原理,处理方法回答

  • 结构
  • 顶级父类的Throwable,有两个子类分别是Error和Exception;
  • Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题
  • Exception:分为受检异常和运行时异常,受检异常就是编译器检测到某段代码可能会发生某些问题,需要程序员提前给代码做出错误的解决方案,否则编译不通过;运行时异常就是编译期通过,但是运行不通过,一般来说就是代码写的有问题需要修改
  • 原理
  • java 对异常默认的处理方式,是将问题抛出给上一级。抛出之前,java 会根据错误产生的异常类,创建出该类的对象,底层并通过 throw 关键字将异常抛出给上一级,不断向上抛出,直到抛给了JVM 虚拟机,虚拟机拿到异常之后,就会将错误的原因和所在的位置,打印在控制台
  • 处理方法
  • try catch 处理:自己将问题处理掉,不会影响到后续代码的继续执行
  • throw 抛出:问题自己无法处理,可以通过 throw 关键字,将异常对象抛出给调用者。如果抛出的对象是 RuntimeException 或 Error,则无需在方法上 throws 声明;
  • 其他异常,方法上面必须进行 throws 的声明,告知调用者此方法存在异常

了解tcp ip协议中三次握手和四次挥手的机制嘛?

三次握手:

TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ack标志位置为1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ack标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。

四次挥手:

四次握手机制也是由客户端去发起,客户端会发送一个报文,在报文里面FIN位标志位置一,当服务端收到这个报文之后,我就知道了客户端想要和我断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的这个消息的时候,对于服务端而言,他和还有可能有未发送完的消息,他还要继续发送,所以呢,此时对于服务端而言,我只能进行一个消息确认,就是我先告诉服务端,我知道你要给我断开连接了,但是我这里边还可能没有做好准备,你需要等我一下,等会儿我会告诉你,于是呢,发完这个消息确认包之后,可能稍过片刻它就会继续发送一个断开连接的一个报文啊,也是一个FIN位置1的报文也是由服务端发给客户端的啊,这个报文表示服务端已经做好了断开连接的准备,那么当这个报文发给客户端的时候,客户端同样要给服务端继续发送一个消息确认的报文一共有四次,那么,通过这四次的相互沟通和连接,我就知道了,不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就可以被断开啊,这是我对三次握手和四次挥手的一个理解。

9、tcp和udp的区别?

10、java中IO流有哪些?

  • 最根本的四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)
  1. 对文件进行操作:FileInputStream(字节输入流)、FileOutputStream(字节输出流)、FileReader(字符输入流)、FileWriter(字符输出流)
  2. 对管道进行操作:PipedInputStream(字节输入流)、PipedOutStream(字节输出流)、PipedReader(字符输入流)、PipedWriter(字符输出流)
  3. 字节/字符数组:ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter
  4. Buffered 缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  5. 字节转化成字符流:InputStreamReader、OutputStreamWriter
  6. 数据流:DataInputStream、DataOutputStream
  7. 打印流:PrintStream、PrintWriter
  8. 对象流:ObjectInputStream、ObjectOutputStream
  9. 序列化流:SequenceInputStream

11、BIO、NIO、AIO有什么区别?

12、输入流和输出流的区别

  • 从程序中读入数据,就是输入流;从程序中向外写出数据,就是输出流
  • 从磁盘读到内存就是输入流,用 InputStream 或 Reader
  • 写到磁盘就是输出流,用 OuputStream 或 Writer

13、节点流和处理流区别

  • 节点流:可以从某节点读数据或向某节点写数据的流。如 FileInputStream
  • 处理流:对已存在的流的连接和封装,实现更为丰富的流数据处理,处理流的构造方法必需其他的流对象参数。如 BufferedReader

14、字节流和字符流的区别

  • 字节流处理的最基本单位为 1 个字节,通常用来处理二进制数据。字节流类 InputStream 和 OutputStream 类均为抽象类,代表了基本的输入字节流和输出字节流。
  • 字符流处理的最基本的单元是 Unicode 代码单元(大小2字节),通常用来处理文本数据。

区别:

  • 字节流操作的基本单元是字节;字符流操作的基本单元是字符
  • 字节流默认不使用缓冲区;字符流使用缓冲区
  • 字节流通常用于处理二进制数据,不支持直接读写字符;字符流通常用于处理文本数据
  • 在读写文件需要对文本内容进行处理:按行处理、比较特定字符的时候一般会选择字符流;仅仅读写文件,不处理内容,一般选择字节流

特征:

  • 以 stream 结尾都是字节流,reader 和 writer 结尾是字符流
  • InputStream 是所有字节输入流的父类,OutputStream 是所有字节输出流的父类
  • Reader 是字符输入流的父类,Writer 是字符输出流的父类

常见的字节流:

  • 文件流:FileOutputStream 和 FileInputStream
  • 缓冲流:BufferedOutputStream 和 BufferedInputStream
  • 对象流:ObjectOutputStream 和 ObjectInputStream

常见的字符流:

  • 字节转字符流:InputStreamReader 和 OutputStreamWriter
  • 缓冲字符流:PrintWriter 和 BufferedReader

17、如何避免sql注入?

SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

防止的方法:

  1. 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
  2. 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
  3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  4. 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
  5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

1、如何创建和删除数据库?

2、MyISAM与InnoDB的区别?

3、char与varchar的区别

4、建表语句中varchar(50)中50的指是什么?

5、int(10)中10指什么?

6、MySQL如何获取当前日期?

7、如何获取MySQL的版本?

8、什么是触发器,MySQL都有哪些触发器?

9、MySQL显示表前 50 行

10、如何连接MySQL服务端、关闭连接?

11、int(10)、char(16)、varchar(16)、datetime、text的意义?

12、说说你知道的MySQL存储引擎

13、说一说MySQL中的锁机制

14、说一说MySQL中的事务

15、MySQL中TEXT数据类型的最大长度

16、MySQL中有哪些时间字段?

17、MySQL中DATETIME和TIMESTAMP的区别

18、MySQL的数据类型有哪些?

19、FLOAT和DOUBLE的区别是什么?

20、Mysql的SQL语句是否区分大小写?

1、Mysql驱动程序是什么?

2、Innodb引擎有什么特性?

3、使用过MySQL的存储过程吗?介绍一下

4、什么是索引?什么场景使用?

5、索引的种类有哪些?

6、索引如何创建与删除?

7、索引对性能有哪些影响?

8、MySQL创建和使用索引的注意事项?

9、创建MySQL联合索引应该注意什么?

10、列值为NULL时,查询是否会用到索引?

11、以下语句是否会使用索引?


SELECT FROM user WHERE YEAR(cdate) < 2007;

12、以下三条sql 如何只建一条索引?

13、LIKE 后的%和_代表什么?

14、与Oracle相比,Mysql有什么优势?

15、MySQL有哪些常用函数?

16、MyISAM索引与InnoDB索引的区别?

17、Mysql的体系结构是什么样的?

18、Mysql中exists和in的区别

19、MySQL如何进行慢SQL优化?

20、说一些索引失效的情况

1、说一些索引失效的情况

2、这种情况,ID 是几?


一张自增表里总共有 7 条数据,删除了最后 2 条,重启 MySQL 数据库,又插入了 1 条,此时 ID 是几?

3、说一说 MySQL 的行锁和表锁

4、说一说MySQL的乐观锁和悲观锁?

5、举例说明数据库死锁

6、MySQL中如何避免死锁?

7、MySQL 单表上亿,怎么优化分页查询?

8、MySQL如何配置读写分离?

9、项目中如何实现读写分离?怎么配置?

10、如何实现分库分表?怎么配置?

11、truncate和delete的异同?

12、事务的四大特性

13、脏读、幻读、不可重复读指什么?

14、事务有哪些隔离级别?

15、delete、drop、truncate区别

16、数据库的三范式是什么?有什么作用?

17、左连接、右连接、内连接和全外连接的区别

1、介绍一下 MyBatis

2、Mybaits 的优缺点

3、MyBatis 的适用场景

4、MyBatis 与 Hibernate 的区别

5、#{} 和 ${} 的区别

6、MyBatis 中实体类的属性名与表中的字段名不一致怎么处理?

7、MyBatis 中如何配置连接中断或执行超时?

8、用 MyBatis 如何使用模糊查询?

9、Mapper 接口如何与写 SQL 的 XML 文件进行绑定的?

10、Mapper 接口方法如何与注解里的 SQL 进行绑定的?

11、Mapper 接口并没有实现类,它是如何工作的?

12、Mapper 接口中能不能根据参数不同进行重载?

13、MyBatis 有哪些分页的方式?分页插件的原理是什么?

14、MyBatis 是如何将 sql 执行结果转换为目标对象并返回的?有哪些映射形式?

15、MyBatis 如何批量插入?

16、MyBatis 如何获取返回自增主键值?

17、Mapper 接口如何传递多个参数?

18、MyBatis 中有哪些动态 SQL 标签?它们的作用分别是什么?如何实现的?

19、Mapper XML 映射文件中支持哪些标签?分别什么作用?

20、不同 Mapper XML 文件中 id 是否可以相同?

1、为什么说 MyBatis 是半自动 ORM?

2、MyBatis 如何进行 1对1 和 1对多 的关联查询?

3、什么是 MyBatis 的接口绑定?有哪些实现方式?

4、MyBatis 的 SQL 执行日志如何开启?

5、MyBatis 中注册 Mapper 有哪些方式?

6、MyBatis 如何支持延迟加载?现实原理是什么?

7、MyBatis 中的本地缓存和二级缓存的作用是什么?怎么实现的?

8、MyBatis 的源码中的核心类有哪些?如何实现框架功能的?

9、MyBatis 如何编写一个自定义插件?

10、MyBatis 插件的运行原理是什么?

11、Spring 中如何配置 MyBatis?

12、MyBatis 是如何与 Spring 集成的?

1、为什么要使用spring框架?

2、什么是aop?

3、什么是ioc?

4、spring有哪些主要模块?

5、spring常用的注入方式有哪些?

6、spring中的bean是线程安全的吗?

7、spring支持几种bean的作用域?

8、spring自动装配bean有哪些方式?

9、spring事务实现方式有哪些?

10、介绍一下spring mvc

11、spring mvc运行流程?

12、spring mvc有哪些组件?

13、@RequestMapping的作用是什么?

14、@Autowired的作用是什么?

15、什么是spring boot?为什么要用?

16、spring boot核心配置文件是什么?

17、spring boot有哪些方式可以实现热部署?

18、spring中事务的传播特性

19、Spring mvc 与 Spring boot 有什么区别?

20、@Transactional 注解哪些情况下会失效?

21、Spring中ObjectFactory与BeanFactory的区别

22、Spring中BeanFactory.getBean是否线程安全?

1、说一说JVM的内存区域

2、JDK8为什么要使用元空间取代永久代?

3、对象在哪块内存分配?

4、介绍下Java中垃圾回收机制

5、Java中类加载过程是什么样的?

6、对象创建过程是什么样的?

7、方法区内存溢出怎么处理?

8、谈谈 JVM 中的常量池

9、谈谈动态年龄判断

10、谈谈永久代

11、运行时栈帧包含哪些结构?

12、JVM 的内存模型是什么?

13、JVM 如何确定垃圾对象?

14、哪些是 GC Roots?

15、被引用的对象就一定能存活吗?

16、强引用、软引用、弱引用、虚引用是什么,有什么区别?

17、你做过 JVM 调优,说说如何查看 JVM 参数默认值?

18、工作中常用的 JVM 配置参数有哪些?

19、谈谈对 OOM 的认识

20、什么情况发生栈溢出?

1、你有哪些手段来排查 OOM 的问题?

2、遇到过元空间溢出吗?

3、遇到过堆外内存溢出吗?

4、谈谈你知道的垃圾回收算法

5、谈谈你知道的垃圾收集器

6、生产环境用的什么JDK?如何配置的垃圾收集器?

7、如何查看 JVM 当前使用的是什么垃圾收集器?

8、如何开启和查看 GC 日志?

9、JVM 监控与分析工具你用过哪些?介绍一下。

10、JIT 是什么?

11、谈谈双亲委派模型

12、列举一些你知道的打破双亲委派机制的例子。为什么要打破?

13、说一下垃圾分代收集的过程

14、如何找到死锁的线程?

15、invokedynamic 指令是干什么的?

16、什么是方法内联?

17、什么是逃逸分析?

18、描述一下什么情况下,对象会从年轻代进入老年代

19、safepoint 是什么?

20、MinorGC、MajorGC、FullGC 什么时候发生?

21、可以描述一下 class 文件的结构吗?

22、说说 JVM 如何执行 class 中的字节码

23、生产环境 CPU 占用过高,你如何解决?

24、生产环境服务器变慢,如何诊断处理?

1、介绍一下Redis

2、Redis支持哪些数据类型?

3、Redis与Memcached的区别

4、Redis使用单线程模型为什么性能依然很好?

5、Redis各数据类型最大容量是多少?

6、Redis持久化机制有哪些?各有什么优缺点?

7、Redis使用过程中的注意事项?

8、Redis过期键的删除策略有哪些?

9、说说Redis的回收策略

10、为什么Redis所有数据放到内存中?

11、说说Redis的同步机制?

12、Pipeline有什么好处?

13、说说Redis集群?

14、说说遇到的Redis集群方案不可用的情况?

15、接触过哪些Redis客户端?

16、Redisson、Jedis、Lettuce各有什么优缺点?

17、Redis如何设置密码?

18、Redis哈希槽

19、Redis 集群会有写操作丢失吗?

20、Redis集群之间是如何复制?

1、Redis集群支持最大节点数是多少?

2、Redis如何选择数据库?

3、怎么测试Redis的连通性?

4、说一说你对Redis的事务的理解?

5、Redis事务相关的命令有哪些?

6、Redis如何设置过期时间?

7、Redis如何设置永久有效?

8、Redis如何做内存优化?

9、Redis的内存用完了会发生什么?

10、单个Redis实例最多能存放多少个key?

11、List、Set、Sorted Set最多能存放多少元素?

12、如何保证Redis中存的都是热点数据?

13、Redis有哪些适用场景?

14、Redis中如何找出已知前缀的key?

15、处理过大量的key同一时间过期吗?需要注意什么?

16、Redis的队列如何异步使用?

17、Redis如何实现消息一次生产,多次消费?

18、Redis如何实现消息延迟?

19、Redis如何实现分布式锁?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值