栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

刷面试题的第二天

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

刷面试题的第二天

JAVA基础 2.1、String和StringBuffer的区别。

String是个不可变长度的字符串,而StringBuffer是个可变长度的字符串;
在对String类进行操作的时候(例如增加字符),实际上是在内存中产生了一个新的String对象;而StringBuffer是给原对象增加字符,不是新创建一个对象;

2.2、数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有length()这个方法。

2.3、final,finally,finalize的区别。

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

2.4、Error,Exception,RuntimeException区别

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。

Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
Exception又分为运行时异常,受检查异常。
运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。
受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理),所以称之为受检查异常。

Exception体系包括RuntimeException体系和其他非RuntimeException的体系:
①RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

2.5、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用。

throws是获取异常
throw是抛出异常
try是将会发生异常的语句括起来,从而进行异常的处理,
catch是如果有异常就会执行他里面的语句,
而finally不论是否有异常都会进行执行的语句。

2.6、throw和throws有什么区别?

throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。

2.7、请说一下你常见到的几种异常?

空指针异常:NullPointerException
数组下标越界:ArrayIndexOutOfBoundsException
类型转换异常:ClassCastException
算数异常,例如除数为零:ArithMeticException
IO异常,比如说找不到文件:FileNotFoundException
找不到类异常:ClassNotFoundException
sql异常,例如sql语句不能正常运行;

2.8、线程的基本概念?线程的基本状态以及状态之间的关系

1.是程序执行流的最小单元。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
2.开始时:就绪状态,等待cpu调用后进入运行状态,运行过程中遇到阻塞事件,进入阻塞状态,等待阻塞事件结束后,重新进入就绪状态;如果没有阻塞事件,运行结束后,则进入结束状态。

2.9、sleep()和wait()有什么区别?

sleep就是暂停当前线程一段时间,把cpu让给其他线程使用,到时候自动恢复。调用sleep不会释放对象锁。
wait方法导致本线程放弃对象锁,进入等待,只有等到本对象的notify方法(或notifyAll)后本线程才能进入就绪状态,等待执行。

2.10、多线程有几种实现方法?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。

2.11、启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

2.12、线程的基本状态以及状态之间的关系。

新建状态(New):新创建了一个线程对象。
就绪状态(Runnable):也叫可运行状态。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权限。
运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
①等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
②同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
③其它阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

2.13、Set和List的区别,List和Map的区别?

Set是无序的,元素不可重复;List是有序的,元素可以重复;
List存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的);

2.14、同步方法、同步代码块区别?

同步方法
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
同步代码块
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步

2.15、描述Java锁机制。

java中所说的锁就是指的内置锁,每个java对象都可以作为一个实现同步的锁,虽然说在java中一切皆对象,但在锁必须是引用类型的,基本数据类型则不可以。每一个引用类型的对象都可以隐式的扮演一个用于同步的锁的角色,执行线程进入synchronized块之前会自动获得锁,无论是通过正常语句退出还是执行过程中抛出了异常,线程都会放弃对synchronized块的控制时自动释放锁。获得锁的唯一途径就是进入这个内部锁保护的同步块或方法。

2.16、Comparable和Comparator接口是干什么的?列出它们的区别

它们都是用于对类的对象进行比较和排序使用的接口。
Comparable是排序接口,位于java.lang包下,若一个类实现了Comparable接口,且重写了CompareTo方法,就意味着该类支持排序、常结合Collections.sort或Arrays.sort对集合或数组内的元素进行排序。
Comparator是比较接口,位于java.util包下,我们如果需要控制某个类对象的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2.17、Java集合类框架的最佳实践有哪些?

首先Java中的集合框架体系非常强大和完善,主要用于程序中的数据存储,从最顶层主要分为了Collection和Map接口,我们平时使用的集合类都是从这两个类别中扩展开来,正确选择要使用的集合的类型对性能非常重要。
比如:
1)元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。
2)如果我们大概知道存储的数量,可以在使用集合时先给予一个初始容量大小,从而有效避免集合自动增长的算法而造成的空间浪费,如new ArrayList(30)。
为了类型安全,提高存储效率和可读性,我们优先使用泛型,并且还能有效避免ClassCastException类型转换异常。
有时为了提高数据的快速定位查找,可优先使用Map键值对集合,因为Map集合在数据的查找上效率非常高,但是如果保证数据的顺序,最好使用List
使用JDK提供的不变类作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
底层的集合实际上是空的情况下,返回长度是0的集合或者数组,不要返回null。

2.18、HashMap和Hashtable的区别。

1、HashMap和HashTable都是键值对数据结构,且都实现了Map接口,存储的元素无序;
2、HashMap非线程安全的,而HashTable是线程安全的(HashTable里面的方法使用Synchronize关键字修饰),所以HashMap的效率高于HashTable。
3、HashMap允许空键空值,HashTable则不允许

2.19、HashSet和TreeSet有什么区别?

相同点:1、单列存储 2、元素不可重复
不同点:1、底层数据结构不同(HashSet=哈希表结构TreeSet=二叉树结构)
2、数据唯一性依据不同(HashSet通过重写hashcode和equalsTreeSet通过compareable接口)
3、有序行不同,HashSet无序,TreeSet有序

2.20、说出ArrayList,Vector,linkedList的存储性能和特性。

1、ArrayList和linkedList、Vector都实现了List接口;
2、ArrayList和Vector底层是用数组实现的,而linkedList使用双向链表实现的,在集合插入、删除元素时,ArrayList需要移动数组元素性能较差;但是在查询时,因为是连续的数组,所以查询速度快;linkedList正好相反。
3、在容量增长上,ArrayList增长原来50%,Vector集合增加容量原来的一倍。
4.安全性方面Vector能够保证线程安全,但是效率比ArrayList要低。

2.21、在Java语言,怎么理解goto。

goto这个词是C语言中的,goto语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能。而在结构化程序语言中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。但是在java语言中,goto这个词只是作为了保留字,不推荐使用,因为java语言讲究简单,方便。

2.22、请描述一下Java 5有哪些新特性?

1、泛型
2、For-Each循环
3、自动装包/拆包
4、枚举
5、静态导入
6、Annotation(框架配置,代码生成的里程碑)
7、可变参数
8、字符串格式化器(java.util.Formatter)
9、新的线程模型和并发库Thread frameword

2.23、Java 6新特性有哪些。

1、引入了一个支持脚本引擎的新框架
2、UI的增强
3、对WebService支持的增强(JAX-WS2.0和JAXB2.0)
4、一系列新的安全相关的增强
5、JDBC4.0
6、Compiler API
7、通用的Annotations支持

2.24、Java 7新特性有哪些。

1、switch中可以使用字符串了 2、运用ListtempList = new ArrayList<>();及泛型实例化类型自动推断
3、语法上支持集合,而不一定是数组
4、新增一些读取环境信息的工具方法
5、Boolean类型反转,空指针安全,参与位运算
6、两个char间的equals
7、安全的加减乘除
8、map集合支持并发请求,且可以写成Map map = {name:“xxx”,age:18};

2.25、Java 8 新特性有哪些。

1、lambda表达式-Lambda允许把函数作为一个方法的参数,用更简洁的语法实现以前负杂的功能代码
2、方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
3、接口中可以使用default关键字声明一个默认实现方法。
4、新的编译工具,如:Nashorn引擎jjs、类依赖分析器jdeps。
5、新添加的Stream API(java.util.stream)把真正的函数式风格引入到Java中。
6、加强对日期与时间的处理。
7、Optional类用来解决空指针异常。
8、Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

2.26、描述Java动态代理。

代理模式是常用的java设计模式之一,java中的代理实现主要有基于接口的jdk动态代理和基于类的cglib动态代理,代理的特点就是会为目标对象产生代理对象,从而在调用实际目标对象方法时实现无侵入式的代码扩展,比如一些框架中的拦截器机制、springAOP面向切面机制都是基于动态代理的目的主要就是为了解决一些安全性问题(不让客户直接调用目标对象的功能,而是相当于通过中介),其次就是可以在调用目标功能方法之前、之后额外添加一些功能,比如日志、事务等,并且还能阻止调用功能,目标功能,从而实现权限控制。

2.27、为什么要使用单例模式?

1、避免在开发程序的时候,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象;
2、一般单例模式通常有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回自己的实例;实行形式有两种,懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。

//构造方法私有化,让外界无法创建对象
private Test(){
}
//在当前类中声明静态对象,并提供公共静态方法让外界调用获取对象
private static Test t;
public static Test getInstance(){
	if(t==null){
	t=new Test();
	}
	return t;
}
2.28、Java中有哪些常用排序方式使用Java实现冒泡排序。

排序主要用于将一组无需数据进行升序/降序排列,Java中有很多种排序方法,如:冒泡排序,选择排序,插入排序,快速排序等,其中在大量数据无需数据中效率最高的属于快速排序,比如实际工作中如果需要对数据排序,我们可以借助JDK中自带的Arrays。sort方法,它内部采用了快速排序,效率非常高,当然也可以自己实现。

冒泡排序代码如下:
import java.util.Arrays;
public class Bubblesort{
	int temp;//定义一个临时变量
	for(int i=0;i 
2.29、Java中垃圾回收有什么目的?什么时候进行垃圾回收? 

Java语言中一个显著的特点就是引入了垃圾回收机制(简称GC),使c语言程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄漏,有效的使用空闲的内存。简单的理解,就是当对象失去引用后,系统会在调度的时间对她所占用的内存进行回收。

2.30、如何实现对象克隆。

实现对象克隆有两种方式:
1)、实现Cloneable接口并重写Object类中的clone()方法;
2)、实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号