Java经典面试题集及答案2021_第1页
Java经典面试题集及答案2021_第2页
Java经典面试题集及答案2021_第3页
Java经典面试题集及答案2021_第4页
Java经典面试题集及答案2021_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java经典面试题集及答案2021

Java经典面试题及答案1

1.Java集合框架是什么?说出一些集合框架的优点?

每种编程语言中都有集合,最初的Java版本包含几种集合

类:Vector、Stack、HashTable和Array。

随着集合的广泛使用,Java1.2提出了囊括所有集合接口、

实现和算法的集合框架。在保证线程安全的情况下使用泛型和并

发集合类,Java已经经历了很久。它还包括在Java并发包中,

阻塞接口以及它们的实现。

集合框架的部分优点如下:

(1)使用核心集合类降低开发成本,而非实现我们自己的集

合类。

(2)随着使用经过严格测试的集合框架类,代码质量会得到

提高。

(3)通过使用JDK附带的集合类,可以降低代码维护成本。

(4)复用性和可操作性。

2.集合框架中的泛型有什么优点?

Java1.5引入了泛型,所有的集合接口和实现都大量地使用

它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,

如果你添加其它类型的任何元素,它会在编译时根错。这避免了

在运行时出现CIassCastException,因为你将会在编译时得到

报错信息。

泛型也使得代码整洁,我们不需要使用显式转换和

instanceOf操作符。它也给运行时带来好处,因为不会产生类

型检查的字节码指令。

3.Java集合框架的基础接口有哪些?

CoIIection为集合层级的根接口。一个集合代表一组对象,

这些对象即为它的元素。Java平台不提供这个接口任何直接的

实现。

Set是一个不能包含重复元素的集合。这个接口对数学集合

抽象进行建模,被用来代表集合,就如一副牌。

List是一个有序集合,可以包含重复元素。你可以通过它

的索引来访问任何元素。List更像长度动态变换的数组。

Map是一个将key映射到value的对象.一个Map不能包含

重复的key:每个key最多只能映射一个value。

一些其它的接口有Queue、Dequeue>SortedSet>SortedMap

和ListIteratoro

4.为何ColIection不从Cloneable和Serializable接口继

承?

Co11ection接口指定一组对象,对象即为它的元素。如何

维护这些元素由Collection的具体实现决定。

例如,一些如List的Collection实现允许重复的元素,而

其它的如Set就不允许。很多Co11ection实现有一个公有的

clone方法。然而,把它放到集合的所有实现中也是没有意义的。

这是因为Collection是一个抽象表现。重要的是实现。

当与具体实现打交道的时候,克隆或序列化的语义和含义才

发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,

或它是否可以被克隆或序列化。

在所有的实现中授权克隆和序列化,最终导致更少的灵活性

和更多的限制。特定的实现应该决定它是否可以被克隆和序列

化。

5.为何Map接口不继承Co11ection接口?

尽管Map接口和它的实现也是集合框架的一部分,但Map

不是集合,集合也不是Map。因此,Map继承Collection毫无意

义,反之亦然。

如果Map继承Collection接口,那么元素去哪儿?Map包含

key-value对,它提供抽取key或value列表集合的方法,但是

它不适合“一组对象”规范。

6.Iterator是什么?

Iterator接口提供遍历任何CoIIection的接口。我们可以

从一个Collection中使用迭代器方法来获取迭代器实例。迭代

器取代了Java集合框架中的Enumerationo迭代器允许调用者

在迭代过程中移除元素。

7.Enumeration和Iterator接口的区别?

Enumeration的速度是Iterator的两倍,也使用更少的内

存。Enumeration是非常基础的,也满足了基础的需要。但是,

与Enumeration相比,Iterator更加安全,因为当一个集合正

在被遍历的时候,它会阻止其它线程去修改集合。

迭代器取代了Java集合框架中的Enumerationo迭代器允

许调用者从集合中移除元素,而Enumeration不能做到。为了使

它的功能更加清晰,迭代器方法名已经经过改善。

8.为何没有像Iterator,add()这样的方法,向集合中添加

元素?

语义不明,已知的是,Iterator的协议不能确保迭代的次

序。然而要注意,ListIterator没有提供一个add操作,它要

确保迭代的顺序。

9.为何迭代器没有一个方法可以直接获取下一个元素,而不

需要移动游标?

它可以在当前Iterator的顶层实现,但是它用得很少,如

果将它加到接口中,每个继承都栗去实现它,这没有意义。

10.Iterator和ListIterator之间有什么区别?

(1)我们可以使用Iterator来遍历Set和List集合,而

ListIterator只能遍历List。

(2)Iterator只可以向前遍历,而ListIterator可以双向

遍历。

(3)ListIterator从Iterator接口继承,然后添加了一些

额外的功能,比如添加一个元素、替换一个元素、获取前面或后

面元素的索引位置。

11.遍历一个List有哪些不同的方式?

ListstrList=newArrayListOO;

//使用for-each循环

for(Stringobj:strList){

System,out.println(obj);

}

//usingiterator

Iteratorit=strList.iterator();

whiIe(it.hasNext()){

Stringobj=it.next();

System.out.println(obj);

)

使用迭代器更加线程安全,因为它可以确保,在当前遍历的

集合元素被更改的时候,它会抛出

ConcurrentModificationException。

12.通过迭代器fail-fast属性,你明白了什么?

每次我们尝试获取下一个元素的时候,IteratorfaiI-fast

属性检查当前集合结构里的任何改动。如果发现任何改动,它抛

出ConcurrentModificationExceptionoCo11ection中所有

Iterator的实现都是按faiI-fast来设计的

(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类

除外)。

13.faiI-fast与fail-safe有什么区别?

Iterator的fail-fast属性与当前的集合共同起作用,因

此它不会受到集合中任何改动的影响。

Java,utiI包中的所有集合类都被设计为faiI-fast的,而

java.util,concurrent中的集合类都为fail-safe的。

FaiI-fast迭代器抛出ConcurrentModificationException,而

fail-safe迭代器从不抛出

ConcurrentModificationExceptiono

14.在迭代一个集合的时候,如何避免

ConcurrentModificationException?

在遍历一个集合的时候,我们可以使用并发集合类来避免

ConcurrentModificationException,比如使用

CopyOnWriteArrayList,而不是ArrayListo

15.为何Iterator接口没有具体的实现?

Iterator接口定义了遍历集合的方法,但它的实现则是集

合实现类的责任。每个能够返回用于遍历的Iterator的集合类

都有它自己的Iterator实现内部类。

这就允许集合类去选择迭代器是fail-fast还是fail-safe

的。比如,ArrayList迭代器是fail-fast的,而

CopyOnWriteArrayList迭代器是fail-safe的。

16.UnsupportedOperationException是什么?

UnsupportedOperationException是用于表明操作不支持

的异常。在JDK类中已被大量运用,在集合框架

java.utiI.Collections.UnmodifiabIeCo11ection将会在所有

add和remove操作中抛出这个异常。

17.在Java中,HashMap是如何工作的?

HashMap在Map.Entry静态内部类实现中存储key-vaIue

对。

HashMap使用哈希算法,在put和get方法中,它使用

hashCode()和equaIs()方法。当我们通过传递key-value对调

用put方法的时候,HashMap使用KeyhashCode()和哈希算法来

找出存储key-vaIue对的索引。

Entry存储在LinkedList中,所以如果存在entry,它使用

equals。方法来检查传递的key是否已经存在,如果存在,它会

覆盖value,如果不存在,它会创建一个新的entry然后保存。

当我们通过传递key调用get方法时,它再次使用

hashCode()来找到数组中的索引,然后使用equaIs()方法找出

正确的Entry,然后返回它的值。下面的图片解释了详细内容。

其它关于HashMap比较重要的问题是容量、负荷系数和阀值

调整。HashMap默认的初始容量是32,负荷系数是0.75。

阀值是为负荷系数乘以容量,无论何时我们尝试添加一个

entry,如果map的大小比阀值大的时候,HashMap会对map的

内容进行重新哈希,且使用更大的容量。容量总是2的霹,所以

如果你知道你需栗存储大量的key-vaIue对,比如缓存从数据库

里面拉取的数据,使用正确的容量和负荷系数对HashMap进行初

始化是个不错的做法。

18.hashCode()和equaIs()方法有何重要性?

HashMap使用Key对象的hashCode()和equaIs()方法去决

定key-value对的索引。当我们试着从HashMap中获取值的时候,

这些方法也会被用到。如果这些方法没有被正确地实现,在这种

情况下,两个不同Key也许会产生相同的hashCode()和equals。

输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把

它们存储到不同的地方。

同样的,所有不允许存储重复数据的集合类都使用

hashCode。和equals。去查找重复,所以正确实现它们非常重

要。equals。和hashCode()的实现应该遵循以下规则:

(1)如果o1.equaIs(o2),那么o1.hashCode()=

o2.hashCode()总是为true的。

(2)如果o1.hashCode()==o2.hashCode(),并不意味着

o1.equaIs(o2)会为true。

19.我们能否使用任何类作为Map的key?

我们可以使用任何类作为Map的key,然而在使用它们之前,

需要考虑以下几点:

(1)如果类重写了equals。方法,它也应该重写hashCode()

方法。

(2)类的所有实例需要遵循与equals。和hashCodeO相关

的规则。请参考之前提到的这些规则。

(3)如果一个类没有使用equals(),你不应该在hashCode()

中使用它。

(4)用户自定义key类的最佳实践是使之为不可变的,这样,

hashCodeO值可以被缓存起来,拥有更好的性能。不可变的美也

可以确保hashCodeO和equals。在未来不会改变,这样就会解

决与可变相关的‘问题了。

比如,我有一个类MyKey,在HashMap中使用它。

//传递给MyKey的name参数被用于equaIs()和hashCode()

MyKeykey=newMyKey(fPankaj1);//assume

hashCode=1234

myHashMap.put(key,1Value');

//以下的代码会改变key的hashCode()和equaIs()值

key.setName(1Amit1);//assumenewhashCode=7890

//下面会返回null,因为HashMap会尝试查找存储同样索

引的key,而key已被改变了,匹配失败,返回null

myHashMap.get(newMyKey(*Pankaj'));

那就是为何String和Integer被作为HashMap的key大量

使用。

20.Map接口提供了哪些不同的集合视图?

Map接口提供三个集合视图:

(1)Setkeyset():返回map中包含的所有key的一个Set

视图。

集合是受map支持的,map的变化会在集合中反映出来,反

之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除

迭代器自身的移除操作以外),迭代器的结果会变为未定义。

集合支持通过Iterator的Remove>Set.remove>removeAII、

retainAII和clear操作进行元素移除,从map中移除对应的映

射。它不支持add和addAII操作。

(2)CoIIectionvaIues():返回一个map中包含的所有

value的一个CoIlection视图。

这个coIlection受map支持的,map的变化会在coIlection

中反映出来,反之亦然。当一个迭代器正在遍历一个co11ection

时,若map被修改了(除迭代器自身的移除操作以外),迭代器的

结果会变为未定义。

集合支持通过Iterator的Remove>Set.remove>removeAII>

retainAII和clear操作进行元素移除,从map中移除对应的映

射。它不支持add和addAII操作。

(3)Set<map.entry<k,v»entrySet():返回一个map钟包

含的所有映射的一个集合视图。

这个集合受map支持的,map的变化会在coIIection中反

映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map

被修改了(除迭代器自身的移除操作,以及对迭代器返回的

entry进行setVaIue外),迭代器的结果会变为未定义。

集合支持通过Iterator的Remove>Set.remove>removeAII、

retainAII和clear操作进行元素移除,从map中移除对应的映

射。它不支持add和addAII操作。

21.HashMap和HashTabIe有何不同?

(1)HashMap允许key和vaIue为nuII,而HashTabIe不允

许。

(2)HashTabIe是同步的,而HashMap不是。所以HashMap

适合单线程环境,HashTable适合多线程环境。

(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子

类,假如你想要遍历顺序,你很容易从HashMap转向

LinkedHashMap,但是HashTable不是这样的,它的顺序是不可

预知的。

(4)HashMap提供对key的Set进行遍历,因此它是

faiI-fast的,但HashTabIe提供对key的Enumeration进行遍

历,它不支持faiI-fast。

(5)HashTabIe被认为是个遗留的类,如果你寻求在迭代的

时候修改Map,你应该使用CocurrentHashMapo

22.如何决定选用HashMap还是TreeMap?

对于在Map中括入、删除和定位元素这类操作,HashMap是

最好的选择。然而,假如你需要对一个有序的key集合进行遍历,

TreeMap是更好的选择。基于你的collection的大小,也许向

HashMap中添加元素会更快,将map换为TreeMap进行有序key

的遍历。

23.ArrayList和Vector有何异同点?

ArrayList和Vector在很多时候都很类似。

(1)两者都是基于索引的,内部由一个数组支持。

(2)两者维护插入的顺序,我们可以根据插入顺序来获取元

素。

(3)ArrayList和Vector的迭代器实现都是fail-fast的。

(4)ArrayList和Vector两者允许null值,也可以使用索

引值对元素进行随机访问。

以下是ArrayList和Vector的不同点。

(1)Vector是同步的,而ArrayList不是。然而,如果你寻

求在迭代的时候对列表进行改变,你应该使用

CopyOnWriteArrayListo

(2)ArrayList比Vector快,它因为有同步,不会过载。

(3)ArrayList更加通用,因为我们可以使用CoIIections

工具类轻易地获取同步列表和只读列表。

24.Array和ArrayList有何区别?什么时候更适合用Array?

Array可以容纳基本类型和对象,而ArrayList只能容纳对

象。

Array是指定大小的,而ArrayList大小是固定的。

Array没有提供ArrayList那么多功能,比如addAII、

removeAlI和iterator等。尽管ArrayList明显是更好的选择,

但也有些时候Array比较好用。

(1)如果列表的大小已经指定,大部分情况下是存储和遍历

它们。

(2)对于遍历基本数据类型,尽管Collections使用自动装

箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变

得很慢。

(3)如果你要使用多维数组,使用口口比List<list<>>更容

易。

25.ArrayList和LinkedList有何区别?

ArrayList和LinkedList两者都实现了List接口,但是它

们之间有些不同。

(1)ArrayList是由Array所支持的基于一个索引的数据结

构,所以它提供对元素的随机访问,复杂度为0(1),但

LinkedList存储一系列的节点数据,每个节点都与前一个和下

一个节点相连接。所以,尽管有使用索引获取元素的方法,内部

实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时

间复杂度为0(n),比ArrayList要慢。

(2)与ArrayList相比,在LinkedList中插入、添加和删除

一个元素会更快,因为在一个元素被放到中间的时候,不会涉及

改变数组的大小,或更新索引。

(3)LinkedList比ArrayList消耗更多的内存,因为

LinkedList中的每个节点存储了前后节点的引用。

26.哪些集合类提供对元素的随机访问?

ArrayList、HashMap>TreeMap和HashTable类提供对元素

的随机访问。

27.EnumSet是什么?

java.util.EnumSet是使用枚举类型的集合实现。当集合创

建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可

以是显示的或隐示的。EnumSet是不同步的,不允许值为nulI

的元素。它也提供了一些有用的方法,copyOf(Co11ection

c)、of(Efirst,E***rest)^complementOf(EnumSets)0

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

Vector>HashTable>Properties和Stack是同步类,所以

它们是线程安全的,可以在多线程环境下使用。Java1.5并发API

包括一些集合类,允许迭代时修改,因为它们都工作在集合的克

隆上,所以它们在多线程环境中是安全的。

29.并发集合类是什么?

Javal.5并发包(java.util,concurrent)包含线程安全集

合类,允许在迭代时修改集合。迭代器被设计为千ail-fast的,

会抛出ConcurrentModificationException。一部分类为:

CopyOnWriteArrayList、ConcurrentHashMap、

CopyOnWriteArraySet。

30.BlockingQueue是什么?

Java.util.concurrent.BIockingQueue是一个队列,在进

行检索或移除一个元素的时候,它会等待队列变为非空;当在添

加一个元素时,它会等待队列中的可用空间。

BIockingQueue接口是Java集合框架的一部分,主要用于

实现生产者-消费者模式。我们不需要担心等待生产者有可用的

空间,或消费者有可用的对象,因为它都在BlockingQueue的实

现类中被处理了。

Java提供了集中BlockingQueue的实现,比如

ArrayBIockingQueue、LinkedBIockingQueue、

PriorityBIockingQueue,、SynchronousQueue等。

31.队列和栈是什么,列出它们的区别?

栈和队列两者都被用来预存储数据。java.util.Queue是一

个接口,它的实现类在Java并发包中。队列允许先进先出(FIFO)

检索元素,但并非总是这样。Deque接口允许从两端检索元素。

栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行

检索。

Stack是一个扩展自Vector的类,而Queue是一个接口。

32.CoIlections类是什么?

Java,utiLCollections是一个工具类仅包含静态方法,它

们操作或返回集合。它包含操作集合的多态算法,返回一个由指

定集合支持的新集合和其它一些内容。这个类包含集合框架算法

的方法,比如折半搜索、排序、混编和逆序等。

33.ComparabIe和Comparator接口是什么?

如果我们想使用Array或CoIIection的排序方法时,需要

在自定义类里实现Java提供Comparable接口。

Comparable接口有compareTo(TOBJ)方法,它被排序方法

所使用。我们应该重写这个方法,如果“this”对象比传递的对

象参数更小、相等或更大时,它返回一个负整数、。或正整数。

但是,在大多数实际情况下,我们想根据不同参数进行排序O

比如,作为一个CEO,我想对雇员基于薪资进行排序,一个

HR想基于年龄对他们进行排序。这就是我们需要使用

Comparator接口的情景,因为Comparable.compareTo(Objecto)

方法实现只能基于一个字段进行排序,我们不能根据对象排序的

需要选择字段。

Comparator接口的compare(Objecto1,Objecto2)方法的

实现需要传递两个对象参数,若第一个参数比第二个小,返回负

整数;若第一个等于第二个,返回0;若第一个比第二个大,返回

正整数。

34.Comparable和Comparator接口有何区别?

Comparable和Comparator接口被用来对对象集合或者数组

进行排序。Comparable接口被用来提供对象的自然排序,我们

可以使用它来提供基于单个逻辑的排序。

Comparator接口被用来提供不同的排序算法,我们可以选

择需要使用的Comparator来对给定的对象集合进行排序。

35.我们如何对一组对象进行排序?

如果我们需要对一个对象数组进行排序,我们可以使用

Arrays.sort()方法。如果我们需要排序一个对象列表,我们可

以使用Co11ection.sort()方法。

两个类都有用于自然排序(使用Comparable)或基于标准的

排序(使用Comparator)的重载方法sort()oCoIIections内部

使用数组排序方法,所有它们两者都有相同的性能,只是

Co11ections需要花时间将列表转换为数组。

36.当一个集合被作为参数传递给一个函数时,如何才可以

确保函数不能修改它?

在作为参数传递之前,我们可以使用

CoIlections.unmodifiabIeCo11ection(Co11ectionc)方法创

建一个只读集合,这将确保改变集合的任何操作都会抛出

UnsupportedOperationExceptiono

37.我们如何从给定集合那里创建一个synchronized的集

合?

我们可以使用

CoIlections,synchronizedCoIlection(CoIlectionc)根据指

定集合来获取一个synchronized(线程安全的)集合。

38.集合框架里实现的通用算法有哪些?

Java集合框架提供常用的算法实现,比如排序和搜索。

Co11ections类包含这些方法实现。大部分算法是操作List的,

但一部分对所有类型的集合都是可用的。部分算法有排序、搜索、

混编、最大最小值。

39.大写的0是什么?举几个例子?

大写的。描述的是,就数据结构中的一系列元素而言,一个

算法的性能。

Collection类就是实际的数据结构,我们通常基于时间、

内存和性能,使用大写的0来选择集合实现。比如:

例子1:ArrayList的get(indexi)是一个常量时间操作,

它不依赖list中元素的数量。所以它的性能是0(1)。

例子2:一个对于数组或列表的线性搜索的性能是0(n),因

为我们需要遍历所有的元素来查找需要的元素。

40.与Java集合框架相关的有哪些最好的实践?

(1)根据需要选择正确的集合类型。比如,如果指定了大小,

我们会选用Array而非ArrayListo如果我们想根据插入顺序遍

历一个Map,我们需要使用TreeMap。如果我们不想重复,我们

应该使用Seto

(2)一些集合类允许指定初始容量,所以如果我们能够估计

到存储元素的数量,我们可以使用它,就避免了重新哈希或大小

调整。

(3)基于接口编程,而非基于实现编程,它允许我们后来轻

易地改变实现。

(4)总是使用类型安全的泛型,避免在运行时出现

CIassCastException<>

(5)使用JDK提供的不可变类作为Map的key,可以避免自

己实现hashCode()和equaIs()o

(6)尽可能使用Collections工具类,或者获取只读、同步

或空的集合,而非编写自己的实现。它将会提供代码重用性,它

有着更好的稳定性和可维护性。

Java经典面试题及答案2

1.什么是B/S架构?什么是C/S架构

B/S(Browser/Server),浏览器/服务器程序

C/S(Client/Server),客户端/服务端,桌面应用程序

2.你所知道网络协议有那些?

HTTP:超文本传输协议

FTP:文件传输协议

SMPT:简单邮件协议

TELNET:远程终端协议

POP3:邮件读取协议

3.Java都有那些开发平台?

JAVASE:主要用在客户端开发

JAVAEE:主要用在web应用程序开发

JAVAME:主要用在嵌入式应用程序开发

4•什么是JVM?java虚拟机包括什么?

JVM:java虚拟机,运用硬件或软件手段实现的虚拟的计算机,

Java虚拟机包括:寄存器,堆栈,处理器

5.Java是否需要开发人员回收内存垃圾吗?

大多情况下是不需要的。Java提供了一个系统级的线程来跟踪

内存分配,不再使用的内存区将会自动回收

6•什么是JDK?什么是JRE?

JDK:javadevelopmentkit:java开发工具包,是开发人员所

需要安装的环境

JRE:javaruntimeenvironment:java运行环境,java程序运

行所需要安装的环境

7.什么是数据结构?

计算机保存,组织数据的方式

8.Java的数据结构有那些?

线性表(ArrayList)

链表(LinkedList)

栈(Stack)

队列(Queue)

图(Map)

树(Tree)

9•什么是OOP?

面向对象编程

10.什么是面向对象?

世间万物都可以看成一个对象。每个物体包括动态的行为和静态

的属性,这些就构成了一个对象。

11.类与对象的关系?

类是对象的抽象,对象是类的具体,类是对象的模板,对象是类

的实例

12.Java中有几种数据类型

整形:byte,short,int,long

浮点型:float,double

字符型:char

布尔型:booIean

13.什么是隐式转换,什么是显式转换

显示转换就是类型强转,把一个大类型的数据强制赋值给小类型

的数据;隐式转换就是大范围的变量能够接受小范围的数据;隐

式转换和显式转换其实就是自动类型转换和强制类型转换。

14.Char类型能不能转成int类型?能不能转化成string类型,

能不能转成doubIe类型

Char在java中也是比较特殊的类型,它的int值从1开始,一

共有2的16次方个数据;Char<int<Iong<fIoat<doubIe;Char

类型可以隐式转成int,double类型,但是不能隐式转换成

string;如果char类型转成byte,short类型的时候,需要强

转。

15,什么是拆装箱?

拆箱:把包装类型转成基本数据类型

装箱:把基本数据类型转成包装类型

16.Java中的包装类都是那些?

byte:Byteshort:Shortint:Integerlong:LongfIoat:

Floatdouble:DoubIechar:CharacterbooIean:BooIean

17.一个java类中包含那些内容?

属性、方法、内部类、构造方法、代码块。

18.例如:if(a+1.0=4.0),这样做好吗?

不好,因为计算机在浮点型数据运算的时候,会有误差,尽量在

布尔表达式中不使用浮点型数据(if,while,switch中判断条件

不使用浮点型)

19.那针对浮点型数据运算出现的误差的问题,你怎么解决?

使用Bigdecimal类进行浮点型数据的运算

20.++i与i++的区别

++i:先赋值,后计算

i++:先计算,后赋值

21.程序的结构有那些?

顺序结构

选择结构

循环结构

22.数组实例化有几种方式?

静态实例化:创建数组的时候已经指定数组中的元素,

1int[]

a=newint[]{1,3,3}

动态实例化:实例化数组的时候,只指定了数组程度,数组中所

有元素都是数组类型的默认值

23.Java中各种数据默认值

Byte,short,int,Iong默认是都是OBoolean默认值是faIse

Char类型的默认值是''

Float与double类型的默认是0.0

对象类型的默认值是null

24.Java常用包有那些?

Java.lang

Java,io

Java.sqI

Java.utiI

Java.awt

Java,net

Java,math

25.Java最顶级的父类是哪个?

Object

26.Object类常用方法有那些?

EquaIs

Hashcode

toString

wait

notify

clone

getClass

27.java中有没有指针?

有指针,但是隐藏了,开发人员无法直接操作指针,由jvm来操

作指针

28.java中是值传递引用传递?

理论上说,java都是引用传递,对于基本数据类型,传递是值

的副本,而不是值本身。对于对象类型,传递是对象的引用,当

在一个方法操作操作参数的时候,其实操作的是引用所指向的对

象。

29.假设把实例化的数组的变量当成方法参数,当方法执行的时

候改变了数组内的元素,那么在方法外,数组元素有发生改变

吗?

改变了,因为传递是对象的引用,操作的是引用所指向的对象

30.实例化数组后,能不能改变数组长度呢?

不能,数组一旦实例化,它的长度就是固定的

31.假设数组内有5个元素,如果对数组进行反序,该如何做?

创建一个新数组,从后到前循环遍历每个元素,将取出的元素依

次顺序放入新数组中

32.形参与实参

形参:全称为“形式参数”,是在定义方法名和方法体的时候使

用的参数,用于接收调用该方法时传入的实际值;实参:全称为

“实际参数”,是在调用方法时传递给该方法的实际值。

33.构造方法能不能显式调用?

不能构造方法当成普通方法调用,只有在创建对象的时候它才会

被系统调用

34.构造方法能不能重写?能不能重载?

可以重写,也可以重载

35.什么是方法重载?

方法的重载就是在同一个类中允许同时存在一个以上的同名方

法,只要它们的参数个数或者类型不同即可。在这种情况下,该

方法就叫被重载了,这个过程称为方法的重载(override)

36.内部类与静态内部类的区别?

静态内部类相对与外部类是独立存在的,在静态内部类中无法直

接访问外部类中变量、方法。如果要访问的话,必须要new一个

外部类的对象,使用new出来的对象来访问。但是可以直接访问

静态的变量、调用静态的方法;

普通内部类作为外部类一个成员而存在,在普通内部类中可以直

接访问外部类属性,调用外部类的方法。

如果外部类要访问内部类的属性或者调用内部类的方法,必须要

创建一个内部类的对象,使用该对象访问属性或者调用方法。

如果其他的类要访问普通内部类的属性或者调用普通内部类的

方法,必须要在外部类中创建一个普通内部类的对象作为一个属

性,外同类可以通过该属性调用普通内部类的方法或者访问普通

内部类的属性

如果其他的类要访问静态内部类的属性或者调用静态内部类的

方法,直接创建一个静态内部类对象即可。

37.Static关键字有什么作用?

Static可以修饰内部类、方法、变量、代码块

Static修饰的类是静态内部类

Static修饰的方法是静态方法,表示该方法属于当前类的,而

不属于某个对象的,静态方法也不能被重写,可以直接使用类名

来调用。在static方法中不能使用this或者super关键字。

Static修饰变量是静态变量或者叫类变量,静态变量被所有实

例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,

在JVM加载类的时候,只为岸态分配一次内存。

Static修饰的代码块叫静态代码块,通常用来做程序优化的。

静态代码块中的代码在整个类加载的时候只会执行一次。静态代

码块可以有多个,如果有多个,按照先后顺序依次执行。

38.Final在java中的作用

Final可以修饰类,修饰方法,修饰变量。

修饰的类叫最终类。该类不能被继承。

修饰的方法不能被重写。

修饰的变量叫常量,常量必须初始化,一旦初始化后,常量的值

不能发生改变。

39.Java中操作字符串使用哪个类?

String,StringBuffer,StringBuiIder

40.StringBuffer,StringbuiIder有什么区别?

StringBuffer与StringBuiIder都继承了

AbstractStringBuIder类,而AbtractStringBuiIder又实现了

CharSequence接口,两个类都是用来进行字符串操作的。

在做字符串拼接修改删除替换时,效率比string更高。

StringBuffer是线程安全的,StringbuiIder是非线程安全的。

所以StringbuiIder比stringbuffer效率更高,StringBuffer

的方法大多都加了synchronized关键字

41.Stringstr=waaa",与Stringstr=newString("aaa”)

一样吗?

不一样的。因为内存分配的方式不一样。

第一种,创建的“aaa”是常量,jvm都将其分配在常量池中。

第二种创建的是一个对象,jvm将其值分配在堆内存中。

42.Stringstr=waaw,Strings="bb”,Stringaa=aa+s;-

种创速了几个对象?

一共有两个引用,三个对象。因为“aa"与“bb”都是常量,常

量的值不能改变,当执行字符串拼接时候,会创建一个新的常量

是“aabbb”,有将其存到常量池中。

43.将下java中的math类有那些常用方法?

Pow():瓶运算

SqrtO:平方根

Round():四舍五入

Abs():求绝对值

Random():生成一个0T的随机数,包括0不包括1

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

charAt:返回指定索引处的字符

indexOf():返回指定字符的索引

replace():字符串替换

trimO:去除字符串两端空白

splitO:分割字符串,返回一个分割后的字符串数组

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

Iength():返回字符串长度

toLowerCaseO:将字符串转成小写字母

toUpperCaseO:将字符串转成大写字符

substring():截取字符串

format():格式化字符串

equaIs():字符串比较

45.判断两个对象是否相同,能使用equlas比较吗?

不能。EquIas大多用来做字符串比较,要判断基本数据类型或

者对象类型,需要使用二

46.=与equIas有什么区别?

二可以判断基本数据类型值是否相等,也可以判断两个对象指向

的内存地址是否相同,也就是说判断两个对象是否是同一个对

象,Equlas通常用来做字符串比较。

47.如何将字符串反转?

StringbuiIder或者stringbuffer的reverse方法

48.面向对象的语言有那些特征?

封装、继承、多态

49.Java中的继承是单继承还是多继承

Java中既有单继承,又有多继承。对于java类来说只能有一个

父类,对于接口来说可以同时继承多个接口

50.什么是重写?什么是重载?

重载和重写都是java多态的表现。

重载叫override,在同一个类中多态的表现。当一个类中出现

了多个相同名称的方法,但参数个数和参数类型不同,方法重载

与返回值无关

重写叫overwrite,是字符类中多态的表现。当子类出现与父类

相同的方法,那么这就是方法重写。方法重写时,子类的返回值

必须与父类的一致。如果父类方法抛出一个异常,子类重写的方

法抛出的异常类型不能小于父类抛出的异常类型。

51.构造方法能不能重载?能不能重写?

可以重载,必须重写

52.如果父类只有有参构造方法,那么子类必须要重写父类的构

造方法吗?

必须重写

53.创建一个子类对象的时候,那么父类的构造方法会执行吗?

会执行。当创建一个子类对象,调用子类构造方法的时候,子类

构造方法会默认调用父类的构造方法。

54.什么是父类引用指向子类对象?

是java多态一种特殊的表现形式。创建父类引用,让该引用指

向一个子类的对象

55.当父类引用指向子类对象的时候,子类重写了父类方法和属

性,那么当访问属性的时候,访问是谁的属性?调用方法时,调

用的是谁的方法?

子类重写了父类方法和属性,访问的是父类的属性,调用的是子

类的方法

56.Super与this表示什么?

Super表示当前类的父类对象

This表示当前类的对象

57.抽象的关键字是什么?

Abstract

58.抽象类必须要有抽象方法吗

不是必须。抽象类可以没有抽象方法。

59.如果一个类中有抽象方法,那么这个一定是抽象类?

包含抽象方法的类一定是抽象类

60.抽象类可以使用final修饰吗?

不可以。定义抽象类就是让其他继承的,而final修饰类表示该

类不能被继承,与抽象类的理念违背了

61.普通类与抽象类有什么区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法

抽象类不能直接实例化,普通类可以直接实例化

62.什么是接口?

接口就是某个事物对外提供的一些功能的声明,是一种特殊的

java类

63.JAVA为什么需要接口?

接口弥补了Java单继承的缺点

64.接口有什么特点?

接口中声明全是publicstaticfinal修饰的常量

接口中所有方法都是抽象方法

接口是没有构造方法的

接口也不能直接实例化

接口可以多继承

65.接口与抽象类有什么区别?

抽象类有构造方法,接口没有构造方法

抽象类只能单继承,接口可以多继承

抽象类可以有普通方法,接口中的所有方法都是抽象方法

接口的属性都是publicstaticfinal修饰的,而抽象的不是

66.Java中异常分为哪两种?

编译时异常

运行时异常

67.说几个常见的编译时异常类?

NulIPointerException:空指针异常

ArrayIndexOutOfBoundsException:数组下标越界

NumberFormatException:数字转换异常

IIlegalArgumentException:参数不匹配异常

InstantiationException:对象初始化异常

ArithmeticException:算术异常

68.异常的处理机制有几种?

异常捕捉:try…catch…finally,异常抛出:throws©

69.如何自定义一个异常

继承一个异常类,通常是RumtimeException或者Exception

70.在异常捕捉时,如果发生异常,那么try.catch.finally块

外的return语句会执行吗?

会执行,如果有finally,在finally之后被执行,如果没有

finally,在catch之后被执行

71.Try.catch,finally是必须要存在的吗?

Try块必须存在,catch和finally可以不存在,但不能同时不

存在

72.Thow与thorws区别

Throw写在代码块内,throw后面跟的是一个具体的异常实例

Throw写在方法前面后面,throws后面跟的是异常类,异常类可

以出现多个

73.Error与Exception区别?

Error和Exception都是java错误处理机制的一部分,都继承

TThrowable类。

Exception表示的异常,异常可以通过程序来捕捉,或者优化程

序来避免。

Error表示的是系统错误,不能通过程序来进行错误处理。

74.使用Log4j对程序有影响吗?

有,Iog4j是用来日志记录的,记录一些关键敏感的信息,通常

会将日志记录到本地文件或者数据库中。记录在本地文件中,会

有频繁的i。操作,会耗费一些系统资源。记录在数据库中,会

频繁地操作数据库表,对系统性能也有一定的影响。但是为了程

序安全以及数据的恢复或者bug的跟踪,这点资源消耗是可以承

受的。

75.Log4j日志有几个级别?

由低到高:debug、info、wran、error

76.除了使用new创建对象之外,还可以用什么方法创建对象?

Java反射

77.Java反射创建对象效率高还是通过new创建对象的效率高?

通过new创建对象的效率比较高。通过反射时,先找查找类资源,

使用类加载器创建,过程比较繁琐,所以效率较低

78.Java中集合框架的有几个?

Coillection、Mapo

79.Co11ection接口下有那些集合框架?

List:线性表、Set:无序集合。

80.List接口有什么特点?

顺序存储、可以有重复值。

81.Set接口有什么特点

无须存储、不能有重复值。

82.ArrayList与LinkedList有什么区别?

ArrayList与LinkedList都实现了List接口。

ArrayList是线性表,底层是使用数组实现的,它在尾端插入和

访问数据时效率较高,

Linked是双向链表,他在中间插入或者头部插入时效率较高,

在访问数据时效率较低

83.Array与ArrayList有什么不一样?

Array与ArrayList都是用来存储数据的集合。ArrayList底层

是使用数组实现的,但是arrayList对数组进行了封装和功能扩

展,拥有许多原生数组没有的一些功能。我们可以理解成

ArrayList是Array的一个升级版。

84.Map有什么特点

以键值对存储数据

元素存储循序是无须的

不允许出现重复键

85.JDBC操作的步骤

加载数据库驱动类

打开数据库连接

执行sql语句

处理返回结果

关闭资源

86.在使用jdbc的时候,如何防止出现sql注入的问题。

使用PreparedStatement类,而不是使用Statement类

87.怎么在JDBC内调用一个存储过程

使用CalIabIeStatement

88.是否了解连接池,使用连接池有什么好处?

数据库连接是非常消耗资源的,影响到程序的性能指标。连接池

是用来分配、管理、释放数据库连接的,可以使应用程序重复使

用同一个数据库连接,而不是每次都创建一个新的数据库连接。

通过释放空闲时间较长的数据库连接避免数据库因为创建太多

的连接而造成的连接遗漏问题,提高了程序性能。

89.你所了解的数据源技术有那些?使用数据源有什么好处?

Dbcp,c3p0等,用的最多还是c3p0,因为c3p0比dbcp更加稳定,

安全;通过配置文件的形式来维护数据库信息,而不是通过硬编

码。当连接的数据库信息发生改变时,不需要再更改程序代码就

实现了数据库信息的更新。

90.Java的io流分为哪两种?

按功能来分

输入流(input),输出流(output)

按类型来分

字节流,字符流

91.常用io类有那些?

File

FileinputSteam,FiIeOutputStream

BufferInputStream,BufferedOutputSream

PrintWrite

FiIeReader,FileWriter

BufferReader,BufferedWriter

ObjectInputStream,ObjectOutputSream

92.字节流与字符流的区别

以字节为单位输入输出数据,字节流按照8位传输

以字符为单位输入输出数据,字符流按照16位传输

93.final>finalize。、finally

性质不同

final为关键字:

finalize()为方法;

finally为区块标志,用于try语句中;

作用

final为用于标识常量的关键字,final标识的关键字存储在常

量池中(在这里final常量的具体用法将在下面进行介绍);

finalize。方法在Object中进行了定义,用于在对象“消失”

时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的

析构函数;用户自定义时,用于释放对象占用的资源(比如进行

I/O操作);

finally{}用于标识代码块,与try()进行配合,不论try中的

代码执行完或没有执行完(这里指有异常),该代码块之中的程

序必定会进行;

94.抽象类和接口的区别?

抽象类:

抽象方法,只有行为的概念,没有具体的行为实现。使用

abstract关键字修饰,没有方法体。子类必须重写这些抽象方

法。

包含抽象方法的类,一定是抽象类。

抽象类只能被继承,一个类只能继承一个抽象类。

接口:

全部的方法都是抽象方法,属型都是常量

不能实例化,可以定义变量。

接口变量可以引用具体实现类的实例

接口只能被实现,一个具体类实现接口,必须实现全部的抽象方

接口之间可以多实现

一个具体类可以实现多个接口,实现多继承现象

95.线程同步的方法

wait。:让线程等待。将线程存储到一个线程池中。

notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。

让被唤醒的线程处于临时阻塞状态。

notifyAHO:唤醒所有的等待线程。将线程池中的所有线程都

唤醒。

96.线程与进程的区别

进程是系统进行资源分配和调度的一个独立单位,线程是CPU

调度和分派的基本单位

进程和线程的关系:

一个线程只能属于一个进程,而一个进程可以有多个线程,但至

少有一个线程。

资源分配给进程,同一进程的所有线程共享该进程的所有资源。

线程在执行过程中,需要协作同步。不同进程的线程间要利用消

息通信的办法实现同步。

线程是指进程内的一个执行单元,也是进程内的可调度实体。

线程与进程的区别:

调度:线程作为调度和分配的基本单位,进程作为拥有资源的基

本单位。

并发性:不仅进程之间可以并发执行,同一个进程的多个线程之

间也可以并发执行。

拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资

源,但可以访问隶属于进程的资源。

系统开销:在创建或撤销进程的时候,由于系统都要为之分配和

回收资源,导致系统的明显大于创建或撤销线程时的开销。但进

程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的

进程产生影响,而线程只是一个进程中的不同的执行路径。线程

有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一

个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程

的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。

97.&和&&的区别

&是位运算符。&&是布尔逻辑运算符,在进行逻辑判断时用&处理

的前面为false后面的内容仍需处理,用&&处理的前面为false

不再处理后面的内容。

98.重载与重写

Overload为重载,Override为重写方法的重写和重载是Java

多态性的不同表现。重写是父类与子类之间多态性的一种表现,

重载是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说

该方法被重写(Override)o子类的对象使用这个方法时,将调

用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

如果在一个类中定义了多个同名的方法,它们或有不同的参数个

数或有不同的参数类型,则称为方法的重载(Overload)。

重载的方法是可以改变返回值的类型。

99.如果对象的引用被置为null,垃圾收集器是否会立即释放对

象占用的内存?

不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

100.串行(serial)收集器和吞吐量(throughput)收集器的区别

是什么?

吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规

模和大规模数据的应用程序。而串行收集器对大多数的小应用

(在现代处理器上需要大概100M左右的内存)就足够了。

Java经典面试题及答案3

1、作用域public,private,protected,以及不写时的区别

答:区别如下:

作用域当刖类同一package子孙类其他package

publicV7VV

protectedVVVX

friendlyV7xX

privateVXXX

不写时默认为friendly嫡黑那

2、AnonymousInnerClass(匿名内部类)是否可以

extends(继承)其它类,是否可以implements(实

现)interface(接口)

答:匿名的内部类是没有名字的内部类。不能extends(继

承)其它类,但一个内部类可以作为一个接口,由另一个内部类

实现

3、StaticNestedClass和InnerClass的不同

答:NestedClass(一般是C++的说法),InnerClass(一

般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于

是否有指向外部的引用上。注:静态内部类(InnerClass)意

味着1创建一个static内部类的对象,不需要一个外部类对象,

2不能从一个static内部类的一个对象访问一个外部类对象

4、&和&&的区别

答:&是位运算符,表示按位与运算,&&是逻辑运算符,表

示逻辑与(and)

5、CoIIection和Collections的区别

答:Collection是集合类的上级接口,继承与他的接口主

要有Set和List.Collections是针对集合类的一个帮助类,他

提供一系列静态方法实现对各种集合的搜索、排序、线程安全化

等操作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论