JAVA 面试 基础

20186月7日星期四

面试 基础

一、Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思?

 重载overload同一个类中同名不同参

 重写override表示子类中的方法可以与父类的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

 

二、 接口和抽象类的区别是什么?

抽象类:含有abstract修饰的类即为抽象类,抽象类不能创建实例对象。有抽象方法的类一定是抽象类,但抽象类不一定都有抽象方法。

接口:可以说成是抽象类的一种特例接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final

下面比较一下两者的语法区别

1. 抽象类可以有构造方法,接口中不能有构造方法

2. 抽象类中可以有普通成员变量,接口中没有普通成员变量

3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以使publicprotected和默认类型,但接口中的抽象方法只能是public类型的,并且默认修饰即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类

三、创建线程有几种不通的方式?

l 自定义类继承Thread类方式

l 自定义类实现Runnable接口方式

四、Java集合框架的基本接口有哪些?

Collection接口

 List接口

 Set接口

Map接口

五、Java中的两种异常类型是什么?

Error:称为错误,由java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等,程序对其不做处理。

Exception:所有异常类的父类,其子类对应了各种各样的可能出现的异常事件,一般需要用户显示的声明或捕获。

Runtime Exception:一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。

六、 Final,finallyfinalize的区别?

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。

finally异常处理语句结构的一部分,表示总是执行

finalizeObject类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提高垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。

七、 Java中如何实现序列化,有什么意义?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。

要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。

八、都用过什么设计模式

单例设计模式

工厂设计模式

模板设计模式

装饰设计模式

代理设计模式

适配器设计模式

九、写一个单例模式出来

饿汉模式

public class Single {

//私有本类中的构造函数

private Single(){}

//创建本类对象

private static Single s = new Single();

//对外提供获取本类对象方法

public static Single getInstance(){

return s;

}

}

注意问题:

  由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。

 

 

懒汉模式

public class Single

{

//私有构造函数

private Single(){}

//在本类中创建本类对象

private static Single instance = null;

//对外提供静态访问方法,获取本类实例对象

public static Single getInstance(){  

if(instance == null )  // 这里会有线程安全问题

{

instance = new Single();

}

return instance;

}

}

class SingleDemo

{

public static void main(String[] args)

{

//获取Single类的实例对象s

Single s = Single.getInstance();

//获取Single类的实例对象s2

Single s2 = Single.getInstance();

System.out.println(s==s2); //true

}

}

 

(3)工厂模式:

interface IFactory{

public IProduct createProduct();}

Class Factory implements IFactory{

public IProduct createProduct(){return new Product();}}

Public class client{

Public Static void main (String [] args){IFactory factory=new Factory();

IProduct product=factory.createProduct();

product.ProductMethod();}}

十、说一下多态的表现形式?

重载和重写

 

十一、问到hasshmap底层数据结构,arraylist-linklist区别和为什么有这样的区别;数组的比较方法;基本类型和引用数据类型的区别;问接口和抽象类的区别

(1)HashMap是线程序不安全的,不是同步的

HashMap可以让你将空值作为一个表的条目的keyvalue

Hashmap实际上是一个数组和链表的结合体,java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体.

(2) 区别:ArrayList是实现了基于动态数组的数据结构LinkedList基于链表的数据结构,

get\set=>Arraylist

Add\move=>LinkedList

单条数据插入或删除=>ArrayList

批量数据插入或删除=>LinkedList

十二、安全:hashmaphashtable的区别?那个不安全?为什么?怎么便利hashmap?线程方面:线程有几种状态?谈谈多线程的安全问题;问到线程和同步?写一个生产者和消费者模式; 考虑高并发的问题。

(1):区别:.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMapJava 1.2引进的Map接口的一个实现;

(2).同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

(3).值:只有HashMap可以让你将空值作为一个表的条目的keyvalue

(4)为什么?最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

HashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异

(5)遍历hashmap:两种方式,Map map=new HashMap();

Iterator iter=map.entrySet().iterator();s

Iterator iter=map.keySet().iterator();

(6)线程通常有五种状态,创建,就绪,运行,阻塞,和死亡;

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态手写字符串反转和冒泡排序;

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspendwait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

(7)多线程的安全问题:总结来说,多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的。线程安全问 题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的;当多个线程都执行写操作时,需要考虑线程同步 来解决线程安全问题。

(8)线程和同步:说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),

    将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,

从而保证了该变量的唯一性和准确性

(9)生产者和消费者模式:存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

(10)模式:1.wait()notify();2.await()signal(),即线程锁的方式;3.阻塞队列的方式;

(11)高并发:手段无非是切割(纵向,横向)和负载均衡。纵向分隔主要是按业务(功能)来分,也就是所谓面向服务架构,横向分隔方式比较多,主要依赖于所处理的对象属性负载均衡则可以是镜像(部署)分布(同样的功能部署几份)和计算分布(一个问题分几个子问题在不同的机器上运行,然后合并结果)。当然,这些手段是可以综合利用的,最终可以做成多流水线分布式计算模式;

 

十三、 listmapset什时候用?彼此间的区别和联系?

(1)list列表是顺序存放对象的,可以有相同的对象,通过索引存取;一般在能直接使用数组的时候,就有使用列表

(2)set集合:集合是无序存放对象的,其中不能有重复的对象(唯一的,回忆高中时候数学中学习的集合特性),集合没有索引,只能遍历次存取;一般用于存放无序的(指顺序不重要)不能重复的对象

(3)Map映射:映射,存放的是键与值的映射,其中键是唯一的(不能有重复对象),而值可以有重复的对象,存的时候,需要指定键和对应的值,取的时候可以根据键名取到值,也可以遍历;一般在用于存放具有对应关系的键值对的时候用;

(4)三者的区别和联系:三者都是接口,ListSet具有相似性,它们都是单列元素的集合,list,set是继承自collection,map不是,list里可以有重复元素,有先后顺手,Set里面不允许有重复的元素,而且无序,Map 保存key-value值,value可多值。

 

十四、object类型中有哪些方法?

(1)equals()hashCode()wait()toString(),finalize(),notify(),notifyAll(),wait(),

 

十五、LinkedListArrayList的区别?继承的接口?

(1)ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢

LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用

(2)list接口;ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问; VectorArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,接口中没有定义的方法 getremoveinsertList,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。LinkedList没有同步方法。如果 多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建 List时构造一个同步的List

 

十六、intstring是如何转化的?

(1)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();intStringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;

 

十七、谈谈你对面向对象编程的理解?

Java语言是纯粹的面向对象的程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态。Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序由一个一个的类组成;Java完全支持使用对象、类、继承、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物(即对象)出发来构造软件系统,在系统构造中 尽可能运用人类的自然思维方式。实际上,这些优势是所有面向对象编程语言的共同特征。而面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象 设计)和OOP(面向对象编程)三个部分有机组成,其中,OOAOOD的结构需要使用一种方式来描述并记录,目前业界统一采用UML(统一建模语言)来 描述并记录OOAOOD的结果。目前UML的最新版是2.0它一共包括13种类型的图形,使用这13种图形中的某些就可以很好地描述并记录软件分析、设 计的结果

 

十八、sleep&wait区别和联系?

(1)这两个方法来自不同的类分别是,sleep来自Thread,和wait来自Object;sleepThread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了bsleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep

(2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的 运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。 sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断;

 

十九、stringstringbufferstringbuilder的区别?哪个更安全?为什么?hashmap为什么查询的比较快?

(1)JAVA平台提供了两个类:StringStringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法;StringBuffer没有实现equals方法,所以,new StringBuffer(abc).equals(new StringBuffer(abc)的结果为false

(2)StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改;通过某些方法调用可以改变该序列的长度和内容,可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致;

(3)StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。(如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。但将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。);

(4)HashMapHashtable的轻量级实现(非同步非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key,由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable

 

二十、java的九大内置对象和四大作用域

(1)request 用户端请求,一次请求.此请求会包含来自GET/POST请求的参数

    response 网页传回用户端的回应

    pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

四大作用域:page对象表示当前一个JSP页面,可以理解为一个对象本身,是代表与一个页面相关的对象和属性;一个页面由一个编译好的 Java servlet 类表示,

request是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系);用户端请求

session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 与请求有关的会话期

application是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 正在执行的内容

 

二十一、object中定义了哪些方法?

clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

 

二十二、ArrayList, LinkedList, Vector的区别是什么?

ArrayList: 内部采用数组存储元素,支持高效随机访问,支持动态调整大小

 

LinkedList: 内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问

 

Vector: 可以看作线程安全版的ArrayList

 

二十三、String, StringBuilder, StringBuffer的区别是什么?

String: 不可变的字符序列,若要向其中添加新字符需要创建一个新的String对象

 

StringBuilder: 可变字符序列,支持向其中添加新字符(无需创建新对象)

 

StringBuffer: 可以看作线程安全版的StringBuilder

 

二十四、HashMapHashTable的区别

HashTable是线程安全的,而HashMap不是

 

HashMap中允许存在null键和null值,而HashTable中不允许

猜你喜欢

转载自blog.csdn.net/qq_38543396/article/details/80606699