JAVA面试题

                                            

    JAVA面试宝典

面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVCSpring Boot/Spring CloudHibernateMybatisRabbitMQKafkaZookeeperMySqlRedisJVM

一、Java 基础

1.JDK JRE 有什么区别?

JRE Java Runtime Environment)是Java 运行时环境……它是运行编译后的Java程序所必需的一切包,包括Java

拟机(JVM)Java基础类库、Java 命令和其他基础设施。但是,它不能用于创建新程序。

JDKJava 开发工具包……功能齐全的SDKforJava。它拥有JRE所拥有的一切,还包含了编译java源码的编译器

javac,还包含了很多java程序调试和分析的工具:jconsolejvisualvm等工具软件,还包含了java程序编写所需的

文档和demo例子程序。它能够创建和编译程序,是提供给程序员使用的。

2.== equals 的区别是什么?

1、功能不同

"=="是判断两个变量或实例是不是指向同一个内存空间的值

"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。

2、定义不同

"equals"JAVA中是一个方法。

"=="JAVA中只是一个运算符合

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

两个对象equals相等,则它们的hashcode必须相等,反之则不一定。两个对象==相等,则其hashcode一定相等,

反之不一定成立。

4.final java 中有什么作用?

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行 修饰。

final写在方法上时,表示这个方法不能被重写

final写在变量上,表示是常量,值不能再次被改变

5.java 中的 Math.round(-1.5) 等于多少?

Mathround方法是四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)=-1

6.String 属于基础的数据类型吗?

String并不是基本数据类,而是一个类(class),是C++java等编程语言中的字符串,

1字符类型:byte,char 2 基本整型:short,int,long 3 浮点型:float,double 4 布尔类型:boolean”

7.java 中操作字符串都有哪些类?它们之间有什么区别?

String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。

StringBuffffer : 对字符串的操作的方法都加了synchronized,保证线程安全。

StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用 StringBuilder对象的appendreplacedelete等方法修改字符串。

8.String str="i" String str=new String(“i”)一样吗?

9.如何将字符串反转?

1. 利用 StringBuffffer StringBuilder reverse 成员方法: // StringBuffffer public static String reverse1(String

str) { return new StringBuilder(str).reverse().toString(); }

2. 利用 String toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接:

3. 利用 String CharAt 方法取出字符串中的各个字符:

10.String 类的常用方法都有那些?

indexOf() 返回指定字符得索引

charAt() 返回指定索引处得字符

repalce() 字符串替换

trim() 去除字符串两端的空白

split() 分割字符串 返回分割后的字符串数组

getBytes() 返回字符串的byte类型数组

length() 返回字符串的长度

toLowerCase() 字符串转小写

toUpperCase() 字符串转大写

substring() 截取字符串

equals() 字符串比较

11.抽象类必须要有抽象方法吗?

抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例

化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译 通不过。

12.普通类和抽象类有哪些区别?

抽象类不能被实例化

抽象类可以有抽象方法,抽象方法只需申明,无需实现

含有抽象方法的类必须申明为抽象类

抽象类的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类

抽象方法不能被声明为静态

抽象方法不能用 private 修饰

抽象方法不能用 final 修饰

13.抽象类能使用 final 修饰吗?

不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

14.接口和抽象类有什么区别?

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口必须指向实现所有接口实现类的对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量都是是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。

同样,一个实现接口的类,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单个继承。

15.java IO 流分为几种?

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以

一共四个):InputStreamOutputStreamReaderWriterJava中其他多种多样变化的流均是由它们派生出来的.

16.BIONIOAIO 有什么区别?

BIO(BlockingIO)是一个连接一个线程。

NIO(java non-blocking IO)是一个请求一个线程。

AIO(Asynchronous IO)是一个有效请求一个线程。

BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

17.Files的常用方法都有哪些?

Files.exists() 检测文件路径是否存在 Files.createFile()创建文件 Files.createDirectory()创建文件夹 Files.delete() 删除文件或者目录

Files.copy() 复制文件

Files.move() 移动文件

Files.size()查看文件个数

Files.read() 读取文件

Files.write()写入文件

二、容器

18.java 容器都有哪些?

List,Map,SetCollectionLinkedListArrayList ,VectorStackHashtableHashMap

WeakHashMap

数据容器主要分为了两类: Collection: 存放独立元素的序列。 Map:存放key-value型的元素对。(这对于需要利用 key查找value的程序十分的重要!) 从类体系图中可以看出,Collection定义了Collection类型数据的最基本、最共性的功能接口,而List对该接口进行了拓展。 LinkedList :其数据结构采用的是链表,此种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。

ArrayList:其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。

HashSet: Set类不允许其中存在重复的元素(集),无法添加一个重复的元素(Set中已经存在)。

HashSet利用Hash函数进行了查询效率上的优化,其contain()方法经常被使用,以用于判断相关元素是否已经被添加过。

HashMap: 提供了key-value的键值对数据存储机制,可以十分方便的通过键值查找相应的元素,而且通过Hash散列机制,查找十分的方便。

19.Collection Collections 有什么区别?

Collection 是集合的接口,其继承类又List Set

Collections 是集合的工具类,定义了许多操作集合的静态方法。是帮助类

20.ListSetMap 之间的区别是什么?

List:有序集合

Set:不重复集合,LinkedList、HashSet按照插入排序,SortedSet可排序,HashSet无序

Map:键值对集合

21.HashMap Hashtable 有什么区别?

1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且key不能包含重复键,但value可以包含重复值。HashMap允许null keynull value

2 HashTable是线程安全的一个Collection HashMapHashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于

HashMap允许空(null)键值(key,由于非线程安全,效率上可能高于Hashtable HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。 HashMapHashtablecontains方法去掉了,改成containsvaluecontainsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMapJava1.2引进的 Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 HashtableHashMap采 用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

22.如何决定使用 HashMap 还是 TreeMap

TreeMap<K,V> Key值是要求实现 java.lang.Comparable ,所以迭代的时候TreeMap默认是按照Key值升序排序

的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。

HashMap<K,V> Key值实现散列 hashCode() ,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链 表或红黑树。适用于在Map中插入、删除和定位元素。

23.说一下 HashMap 的实现原理?

HashMap使用数组加链表实现。每个数组中储存着链表。

当使用put方法储存key-value键值对时,会先调用keyhashCode方法,得到此key经特定哈希运算后的值,然后将 此值通过其他运算得到一个值,将这个值与(length-1)做或操作(&),相当于对数组长度做取余操作。最终得到一个值作为此key在数组中的索引值,然后将key-value键值对储存进去。通过这种方法将储存的不同key-value键值 对散列到数组的不同位置。

在储存的时候,如果索引位置尚无元素,那么直接储存。如果有元素,那么就调用此keyequals方法与原有的元素

Key进行比较。如果返回true,说明在这个equals定义的规则上,这两个Key相同,那么将原有的key保留,用新的

value代替原来的value。如果返回false,那么就说明这两个keyequals定义的规则下是不同元素,那么就与此链表

的下一个结点进行比较,知道最后一个结点都没有相同元素,再下一个是null的时候,就用头插法将此key-value添加

到链表上。

HashMap对重复元素的处理方法是:key不变,value覆盖。

当使用get方法获取key对应的value时,会和储存key-value时用同样的方法,得到key在数组中的索引值,如果此索

引值上没有元素,就返回null。如果此索引值上有元素,那么就拿此keyequals方法与此位置元素上的key进行比

较,如果返回true。就返回此位置元素对应的value。如果返回false,就一直按链表往下比较,如果都是返回false

那么就返回null

另外:HashMapJDK1.8之后引入红黑树结构。HashMap是线程不安全的,线程安全的是CurrentHashMap,不过

此集合在多线程下效率低。

24.说一下 HashSet 的实现原理?

首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素。 一方面Set中最重要的一个操作就是查找。而且通常我们会选择

HashSet使用的是散列函数,那么它当中的元素也就无序可寻。当中是允许元素为null的。

25.ArrayList LinkedList 的区别是什么?

数据结构实现: ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率: ArrayList LinkedList 在随机访问的时候效率要高, 因为 LinkedList 是链表的数据存储方式,所以需要移动指针从前往后依次查找。

增加和删除效率: 在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高, 因

ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说: 在需要频繁读取集合中的元素时,更推荐使用ArrayList, 而在插入和删除操作较多时,更推荐使用 LinkedList

26.如何实现数组和 List 之间的转换?List转数组:toArray(arraylist.size()方法

数组转ListArraysasList(a)方法

27.ArrayList Vector 的区别是什么?

这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合 中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的 数据是允许重复的,这是与HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其 中的元素,也不允许有重复的元素。

ArrayListVector的区别主要包括两个方面:.

1)同步性:

ArrayList的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

2)数据增长:

要增加ArrayListVector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存 储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。

ArrayListVector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

28.Array ArrayList 有何区别?

ArrayJava中的数组,声明数组有三种方式 int[] a=new int[10]; int a[]=new int[10]; int a[]={1,2,3,4}; 可以看出:在定义一个数组的时候,必须指定这个数组的数据类型及数组的大小,也就是说数组中存放的元素个数固定并且类型一样

ArrayList是动态数组,也就是数组的复杂版本,它可以动态的添加和删除元素,被称为集合,集合的声明如下

ArrayList list = new ArrayList(10); ArrayList list1 = new ArrayList(); 可以看出:在不使用泛型的情况下,这个list

可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数

据了

29. Queue poll() remove()有什么区别?

相同点:都是返回第一个元素,并在队列中删除返回的对象。

如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

30.哪些集合类是线程安全的?

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector

31.迭代器 Iterator 是什么?

首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

32.Iterator 怎么使用?有什么特点?

1Iterator()要求容器返回一个IteratorIterator将准备好返回序列的第一个元素。

2)使用next()获得序列中的下一个元素

3)使用hasNext()检查序列中是否还有元素。

4)使用remove()将迭代器新近返回的元 素删除。

有什么特点:

1 Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出

ConcurrentModifificationEception的异常。

2Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素,删除的是上一次Iterator.next()方法返回的对象。

3Iterator必须依附于一个集合类对象而存在, Iterator本身不具有装载数据对象的功能。

4next()方法,该方法通过游标指向的形式返回Iterator下一个元素。

33.Iterator ListIterator 有什么区别?

1)所属关系,ListIterator是一个Iterator的子类型。

2)局限:只能应用于各种List类的访问。

3)优势:

Iterator只能向前移动,而ListIterator可以双向移动。

4ListIterator add() 方法,可以向 List 中添加对象,而Iterator 不能。

34.怎么确保一个集合不能被修改?

我们可以采用Collections包下的unmodififiableMap方法,通过这个方法返回的map,是不可以修改的。他会报 java.lang.UnsupportedOperationException错。

同理:Collections包也提供了对listset集合的方法。 Collections.unmodififiableList(List)

Collections.unmodififiableSet(Set)

三、多线程

35.并行和并发有什么区别?

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

解释二:

并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

解释三:

并行:在一台处理器上同时处理多个任务,

并发:在多台处理器上同时处理多个任务。如hadoop分布式集群 所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

36.线程和进程的区别?

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫轻量级进程。

线程的划分小于进程,线程是隶属于某个进程的。进程是程序的一种动态形式,是CPU,内存等资源占用的基本单位,而线程是不能占有这些资源的。

进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。

进程在执行过程中包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制。

37.守护线程是什么?

1、守护线程,专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。

2、再换一种说法,如果有用户自定义线程存在的话,jvm就不会退出——此时,守护线程也不能退出,也就是它还要运行,干嘛呢,就是为了执行垃圾回收的任务啊。

38.创建线程有哪几种方式?

1,继承Thread类,重写run方法;

 2,实现Runnable接口,重写run方法,但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;

3,使用Executor框架创建线程池。Executor框架是juc里提供的线程池

的实现。

补充线程相关的方法:

调用线程的start():启动此线程,调用相应的run()方法

Thread的常用方法:

 1.start():启动线程并执行相应的run()方法

2.run():子线程要执行的代码放入run()方法中

3.currentThread()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值