【JAVA面试题整理】_JavaSE_下

上一篇:【JAVA面试题整理】_JavaSE_上


  1. 请你简单描述一下正则表达式及其用途

在处理字符串的时候,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具。

  1. 请你谈谈Java中是如何支持正则表达式操作的?

Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。
此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作

  1. 请你比较一下Java和JavaSciprt?

(1) 面向对象和基于对象:Java是一种真正的面向对象的语言;而JS是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言
(2) 编译和解释:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。
(3) 强类型变量和弱类型变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。

  1. 请你讲讲如何输出一个某种编码的字符串?

1、public String(byte[] bytes, Charset charset) :使用指定的字符集解码指定的字节数组来构造新的字符串。
2、public byte[] getBytes(Charset charset):使用给定的字符集将该字符串编码为一个字节序列,并将结果存储到一个新的字节数组中。
注意:这两个方法中的charset必须一致,否则会出现乱码。

  1. 请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?

(1) Array大小是固定的,ArrayList的大小是动态变化的。
(2) Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
注意:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
详情数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

  1. 请你解释什么是值传递和引用传递?

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象,但改变参数的引用却不会影响到原对象。
一般认为,java内的传递都是值传递.
Java的值传递问题

  1. 请你解释为什么会出现4.0-3.6=0.40000001这种现象?

原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
注意:二进制中只能准确表示 2的n次方分之一 所能够表示的小数(也可以相加)。

  1. 你知道java8的新特性吗,请简单介绍一下

1、Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
2、默认方法:默认方法就是一个在接口里面有了一个可以实现的方法(修饰符必须为default)。
详情:详解JAVA8函数式接口{全}  , 方法引用

  1. 请你介绍一下volatile?

作用:
1、保证了不同线程对同一变量操作的内存可见性.(当一个线程修改了变量,其他使用次变量的线程可以立即知道这一修改).
2、禁止了指令重排序.
详情:java中的volatile关键字详解

  1. 请说明如何使用反射以及获取对象私有字段的值?
/* 使用示例 */
class MethodInvokeTest {
   public static void main(String[] args) throws Exception {
       String str = "hello";
   Method m = str.getClass().getMethod("toUpperCase");
       System.out.println(m.invoke(str));  // HELLO
   }
}

其中,就可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。
详情:Java反射机制的原理和用途

  1. 请说明Comparable和Comparator接口的作用以及它们的区别。

1、 Comparable接口位于 java.lang包下,Comparator接口位于java.util包下。
2、Comparable: 内部比较器,一个类如果想要使用 Collections.sort(list) 方法进行排序,则需要实现该接口,并重写compareTo()
3、Comparator: 外部比较器,用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。(策略模式)

  1. 请说明Java是否支持多继承?

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。

  1. 请解释一下extends 和super 泛型限定符

(1) 上界<? extend Fruit>、下界<? super Apple>
(2) 上界的list只能get,因为我只要用Fruit就能接住取出的任意对象。
(3) 下界的list只能add,并且只能addApple及其子类,这样容器才能都接得住,道理同上。

  1. 请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

(1) “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
(2) Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
(3) 因为父类的private修饰的方法对子类是不可见的(继承不了),所以就谈不上覆盖。

  1. 请列举你所知道的Object类的方法并简要说明。

(1) clone() 创建并返回此对象的一个副本。
(2) equals(Object obj) 比较某个其他对象是否与此对象“相等”。
(3) finalize() 当对象被回收时,由对象的垃圾回收器调用此方法。
(4) getClass() 返回一个对象的运行时类。
(5) hashCode() 返回该对象的哈希码值。

  1. 请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?

(1) java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)
(2) 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历
详情Java快速失败(fail-fast)和安全失败(fail-safe)区别

  1. 请你说说Iterator和ListIterator的区别?

(1)Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
(2)Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
(3)ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素等等。

  1. 请简单说明一下什么是迭代器?

(1) Iterator提供了遍历操作集合元素的统一接口, Collection接口实现Iterable接口,
(2) 每个集合都通过实现Iterable接口中iterator()方法返回Iterator接口的实例, 然后对集合的元素进行迭代操作.
详情Java中迭代器是什么?

  1. 启动一个线程是用run()还是start()? 为什么?

启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态;比如通过实行Callable接口来创建的线程就没有run方法,它的是call方法
详情启动一个线程是用run()还是start()

  1. 介绍下NIO、BIO、AIO

BIO :同步并阻塞,一个连接一个线程(面向流)
NIO:同步非阻塞,一个请求一个线程(面向缓冲)
AIO:异步非阻塞,一个有效请求一个线程
详情(B)IO 与 NIO的区别

  1. 请你解释一下什么是线程池(thread pool)?

newSingleThreadExecutor
       创建一个单线程的线程池。这个线程池只有一个线程工作,也就是相当于单线程串行执行所有任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程替代它,此线程池保证所有任务的执行顺序按照任务提交的顺序执行。
newFixedThreadPool
       创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程数量达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池就会补充一个新的线程。
newCachedThreadPool
       创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲的线程(60秒内不执行任务),当任务数值增加时,可以添加新线程来处理任务,该线程池不会对线程池大小进行限制,其大小完全依赖于操作系统或者JVM能够创建的最大小线程数量。
newScheduledThreadPool
       创建一个大小不限的线程池。此线程池支持定时以及周期性执行任务的需求。
       
详情代码示例

  1. 举例说明同步和异步

同步:方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为
异步:其方法调用更像一个消息传递,一旦开始,方法调用就会立即返回(暂无结果),调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

  1. 请你说明一下在监视器(Monitor)内部,是如何做到线程同步的?

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码

  1. 请分析一下同步方法和同步代码块的区别是什么?

同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法。

  1. 请说明一下线程池有什么优势?

(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能执行。
(3)提高线程的可管理性,使用线程池可以对线程进行统一分配、调优和监控。

  1. 请介绍一下什么是生产者消费者模式?

首先要知道什么是生产者和消费者:产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。
该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。
详情生产者/消费者模式的理解及实现

  1. 多线程中的i++线程安全吗?请简述一下原因?

不安全,因为其不是原子性的操作(只有一步的操作)
i++ 完整步骤为: i = i+1; 先+1后赋值,执行期中任何一步都是有可能被其他线程抢占的。

  1. 请问什么是死锁(deadlock)?

当两个及以上的线程处于相互的占有且等待状态时,就陷入了死锁。

  1. 产生死锁的四个必要条件和解决办法?

(1)互斥:某种资源一次只能被一个线程访问。
(2)不可抢占:当某资源正在被线程A持有并且A没有主动放弃的情况下,无法将该资源分配给其他线程。
(3)占有且等待:线程A自身占有一定资源的情况下,因资源未满足又等待其他线程释放A所需的其他资源。
(4)循环等待:当两个及以上的线程处于相互的占有且等待状态时,就开始循环等待。
解决
a. 资源预分配策略, 如银行家算法。
b. 资源有序分配策略,比如在线程A没有获取小号资源的情况下,无法去申请对应的大号资源。

  1. 请问JDK和JRE的区别是什么?

JRE是Java Runtime Environment的缩写,顾名思义是java运行时环境,包含了java虚拟机,java基础类库
JDK是Java Development Kit的缩写,顾名思义是java开发工具包,包含了jre,同时还包含了编译java源码的编译器javac以及很多java程序调试和分析的工具

  1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被不同的IDE编译成能被 Java 虚拟机执行的字节码文件。
正是Java 虚拟机让跨平台变为可能,因为不同设备上的JVM知道其底层硬件平台的指令长度和其他特性。

  1. 描述一下JVM内存模型(简称JMM)

线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
注意:本地内存是JMM的一个抽象概念,并不真实存在。

  1. 请简述一下GC算法

(1)引用计数法:引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。
(2)标记-清除算法:它将垃圾回收分为两个阶段:标记阶段清除阶段
标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。在清除阶段,清除所有未被标记的对象。

  1. java中哪些类是线程安全的,请举例。

Vector:就比Arraylist多了个同步化机制(线程安全)。
Hashtable:就比Hashmap多了个线程安全。
ConcurrentHashMap:是一种高效但是线程安全的集合。
Stack:栈,也是线程安全的,继承于Vector。
------其实在jdk源码中相同效果的集合线程安全的比线程不安全的就多了一个同步机制,但是效率上却低了不止一点点,因为效率低,所以已经不太建议使用了。

  1. Error、Exception与RuntimeException的区别?
    在这里插入图片描述

详情Error、Exception与RuntimeException的区别

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值