编程语言
首页 > 编程语言> > JAVA面试宝典-3

JAVA面试宝典-3

作者:互联网

一、基础

Java 多态的优缺点分别是什么?
多态的优点:

多态的缺点:

Java 常见的内部类有哪几种,简单说说其特征?
静态内部类、成员内部类、方法内部类(局部内部类)、匿名内部类。

public class Boxer1{ 
	Integer i; 
	int x; 
	public Boxer1(int y) { 
		x = i+y; 
		System.out.println(x); 
	} 
	
	public static void main(String[] args) { 
		new Boxer1(new Integer(4)); 
	} 
} 

下面关于Java类的构造方法的说法中正确的是:()

A. 一个类至少有一个构造方法 
B. 构造方法的返回值类型必须是void 
C. 构造方法的可见性修饰符必须是public 
D. 构造方法必须显式的定义 
正确答案: A 

解析:

Java 构造方法能否被重写和重载?
重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父 类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能 被重写的。而重载是针对同一个的,所以构造方法可以被重载。

下面那几个函数是public void method(){̷}的重载函数?

A.public void method( int m){̷} 
B.public int method(){̷} 
C.public void method2(){̷} 
D.public int method(int m,flfloat f ){̷} 
答案:A D 

解析:

简单说说什么是二叉树?什么是完全二叉树?什么是满二叉 树?什么是排序二叉树?

面向对象的三大特征是什么?请详细介绍他们各自的部分原理?

使用fifinal关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

fifinalStringBuffffer a=new StringBuffffer("immutable"); 
执行如下语句将报告编译期错误: 
a=new StringBuffffer(""); 
但是,执行如下语句则可以通过编译: 
a.append(" broken!"); 
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象: 
public void method(fifinal StringBuffffer param){} 
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象: 
param.append("a");

接口是否可继承接口?抽象类是否可实现(implements)接口?抽 象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?

Java 中堆和栈有什么区别?

request.getAttribute()和 request.getParameter()有何区别?

解释Spring支持的几种bean的作用域。
Spring框架支持以下五种bean的作用域:

解释Spring框架中bean的生命周期。

解释不同方式的自动装配 。
有五种自动装配的方式,用来指导Spring容器用自动装配方式进行依赖注入。

什么是线程死锁?死锁如何产生?如何避免线程死锁?
死锁的介绍:

死锁的产生的一些特定条件:

如何避免:

什么是视图?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一 个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

如下两种场景一般会使用到视图:

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

强引用,软引用和弱引用的区别

数组在内存中如何分配

说说http,https协议

区别:

说说tcp/ip协议族
TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。

tcp五层网络协议

TCP与UDP的区别

1、基于连接与无连接 
2、TCP要求系统资源较多,UDP较少; 
3、UDP程序结构较简单 
4、流模式(TCP)与数据报模式(UDP); 
5、TCP保证数据正确性,UDP可能丢包 
6、TCP保证数据顺序,UDP不保证 

分布式环境下的session(举例两种):

GIT和SVN的区别

1、GIT是分布式的,SVN不是。 
2、GIT把内容按元数据方式存储,而SVN是按文件。 
3、GIT分支和SVN的分支不同。 
4、GIT没有一个全局的版本号,而SVN有。 
5、GIT的内容完整性要优于SVN。 
(一般问会不会用,知道这些区别貌似也没卵用)

BIO、NIO和AIO的区别

适用场景分析:

java中常说的堆和栈,分别是什么数据结构;另外,为 什么要分为堆和栈来存储数据

为什么要划分堆和栈

为什么要用线程池
那先要明白什么是线程池
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。

使用线程池的好处

msyql优化经验

悲观锁和乐观锁的区别,怎么实现

悲观锁的实现: 
0.开始事务 
begin;/begin work;/start transaction; (三者选一就可以) 
//1.查询出商品信息 
select status from t_goods where id=1 for update; 
//2.根据商品信息生成订单 
insert into t_orders (id,goods_id) values (null,1); 
//3.修改商品status为2 
update t_goods set status=2; 
//4.提交事务 
commit;/commit work; 
乐观锁的实现 
1.查询出商品信息 
select (status,status,version) from t_goods where id=#{id} 
2.根据商品信息生成订单 
3.修改商品status为2 
update t_goods 
set status=2,version=version+1 
where id=#{id} and version=#{version}; 

GC何时开始:

有了以上这些铺垫之后开始回答GC何时开始:

对什么东西操作,即垃圾回收的对象是什么:

做了什么东西:

垃圾回收器的类型: 
串行垃圾回收器( Serial Garbage Collector ) 
并行垃圾回收器( Parallel Garbage Collector ) 
并发标记扫描垃圾回收器( CMS Garbage Collector ) 
G1垃圾回收器( G1 Garbage Collector ) 
垃圾回收算法: 
引用计数法 
标记清除法 
复制算法 
标记压缩算法 
分代算法 
分区算法 

类在虚拟机中的加载过程

强引用、软引用、弱引用、虚引用与GC的关系

强引用:new出的对象之类的引用,只要强引用还在,永远不会回收。 
软引用:引用但非必须的对象,内存溢出异常之前回收。 
弱引用:非必须的对象,对象只能生存到下一次垃圾收集发生之前。 
虚引用:对生存时间无影响,在垃圾回收时得到通知。

面向对象的特征有哪些方面?

说一下你了解的几种进程间的通信方式

下列叙述中错误的是( )

A.线性表是由n个元素组成的一个有限序列 
B.线性表是一种线性结构 
C.线性表的所有结点有且仅有一个前件和后件 
D.线性表可以是空表 

答案:C
线性表是一种线性结构,由n(n≥0)个元素组成,所以线性表可以是空表。但是在线性表中,第一个结点没有前驱,最后一个结点没有后继,其他结点有且只有一个前驱和后继,所以选项C是错误的。

已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为( )

A.GEDHFBCA 
B.DGEBHFCA 
C.ABCDEFGH 
D.ACBFEDHG 

答案:B
二叉树的遍历有3种:前序、中序和后序。
先序:先访问根结点、左结点、右结点
中序:先访问左结点、根结点、右结点
后序:先访问左结点、右结点、根结点
本题根据前序遍历和中序遍历的结果可以得出二叉树的结构,然后再对其进行后序遍历。

栈和队列的共同点是( )

A.都是先进先出 
B.都是先进后出 
C.只允许在端点处插入和删除元素 
D.没有共同特点 

答案:C
栈是只允许在表的一端进行插入和删除的操作,队列是允许在表的一端进行插入,另一端进行删除的操作。

下列关于修饰符混用的说法,错误的是()

A.abstract不能与fifinal并列修饰同一个类 
B.abstract类中不可以有private的成员 
C.abstract方法必须在abstract类中 
D.static方法中能处理非static的数据 

答案:D
静态方法是属于类的,而普通方法是属于对象的。
属于类的静态方法可以在对象不存在的时候就能访问到,而普通方法必须先new一个对象才能用这个对象访问。
当我们访问调用静态方法的时候(使用类名.静态方法名)这个时候就没有对象创建,所以普通方法是访问不到的。为了避免这种错误,所以java就不允许在静态方法中访问非静态方法。

Java能不能不通过构造函数创建对象()

A、能 B、不能 

答案:A
Java创建对象的几种方式:
(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函
数 ;(4)是从文件中还原类的对象,也不会调用构造函数。

下列哪个叙述是正确的()

A.子类继承父类的构造方法。 
B.abstract类的子类必须是非abstract类。 
C.子类继承的方法只能操作子类继承和隐藏的成员变量。 
D.子类重写或新增的方法也能直接操作被子类隐藏的成员变量。 

答案:C
子类是不继承父类的构造方法的,而是必须调用其父类的构造方法。
abstract类的子类可以是abstract类,如果是非abstract类,就必须重写父类中所有的abstract方法。
D中子类新增的方法是不能直接操作被子类隐藏的成员变量的。

下列选项中,不属于模块间耦合的是( )

A.数据耦合 
B.标记耦合 
C.异构耦合 
D.公共耦合 

答案:C
模块之间的耦合程度反映了模块的独立性,也反映了系统分解后的复杂程度。 按照耦合程度从弱
到强,可以将其分成7级。
分别是非直接耦合、数据耦合、标记耦合、控制 耦合、外部耦合、公共耦合和内容耦合。其中没
有异构耦合这种方式。

下列说法正确的是()

A.一个文件里可以同时存在两个public修饰的类 
B.构造函数可以被重写(override) 
C.子类不能访问父类非public和protected修饰的属性 
D.fifinal修饰的类可以被继承 

答案:C
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则 无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。
重写是子类继承父类后对父类的方法进行修改。方法名,参数,返回值必须一样。 不能重写被标示
为fifinal的方法。如果不能继承一个方法,则不能重写这个方法。

扩展:重写override,重载overload的区别

关于 JAVA 堆,下面说法错误的是( )

A.所有类的实例和数组都是在堆上分配内存的 
B.对象所占的堆内存是由自动内存管理系统回收 
C.堆内存由存活和死亡的对象,空闲碎片区组成 
D.数组是分配在栈中的 

答案:D
首先数组是分配在堆中的,故D的说法不正确。
Java堆的结构:JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的 时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。
一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

在使用super 和this关键字时,以下描述正确的是()

A.在子类构造方法中使用super()显示调用父类的构造方法; 
super()必须写在子类构造方法的第一行,否则编译不通过 
B.super()和this()不一定要放在构造方法内第一行 
C.this()和super()可以同时出现在一个构造函数中 
D.this()和super()可以在static环境中使用,包括static方法和static语句块 

答案:A
Java关键字this只能用于方法方法体内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一 个引用自身的指针,这个指针的名字就是this。
因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。
super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的 成员变量和成员成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)

下列语句哪一个正确()

A.Java程序经编译后会产生machine code 
B.Java程序经编译后会产生byte code 
C.Java程序经编译后会产生DLL 
D.以上都不正确 

答案:B
Java字节码是Java源文件编译产生的中间文件
java虚拟机是可运行java字节码的假想计算机 java的跨平台性也是相对与其他编程语言而言的 。
先介绍一下c语言的编译过程:c的文件经过C编译程序编译后生成windows可执行文件exe文件然后在windows中执行。
再介绍java的编译过程:java的文件由java编译程序将java字节码文件就是class文件在java虚拟机中执行。机器码是由CPU来执行的;Java编译后是字节码。
电脑只能运行机器码。Java在运行的时候把字节码变成机器码。C/C++在编译的时候直接编译成机器码

下列哪一种叙述是正确的()

A.abstract修饰符可修饰字段、方法和类 
B.抽象方法的body部分必须用一对大括号{ }包住 
C.声明抽象方法,大括号可有可无 
D.声明抽象方法不可写出大括号 

答案:D
abstract修饰符用来修饰类和成员方法
用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。
用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不 提供具体的实现。
Abstract是Java中的一个重要关键字,可以用来修饰一个类或者一个方法。
修饰一个方法时,表示该方法只有特征签名(signature),没有具体实现,而是把具体实现留给继承该类的子类,所以不能有大括号。

将元数据配置到Spring容器,下面哪个方法是不正确的()

A,通过编组与解组对象 
B,注解基础配置 
C,Java基础配置 
D,XML基础配置 

正确答案:A
有三种方式向Spring 容器提供元数据:1,XML配置文件;2,基于注解配置;3,基于Java的配置,死概念记住即可。

以下关于被private修饰的成员变量的说法正确的是

A、只能被同一个包中的类访问 
B、只能被该类自身所访问和修改 
C、可以被两种类访问和引用:该类本身、该类的所有子类 
D、可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类 

正确答案:B
扩展:


二、多线程并发

Java内存模型

到目前位置,介绍了线程离开运行状态的3种方法:

除了以上三种方式外,还有下面几种特殊情况可能使线程离开运行状态:

一些常见问题

ServerSocket
在客户/服务器通信模式中,服务器端需要创建监听特定端口的 Serversocket,Serversocke t负责接收客户连接请求。 java 提供了一个 ServerSocket 类表示服务器 Socket 。
服务器 Socket 在服务器上运行,监听入站ftp连接。每个服务器Socket监听服务器上的一个特定端口。
当远程注解上的一个客户端尝试这个端口时,服务器就会被唤醒,协商建立客户端与服务器端的连接,
并返回一个常规的 Socket 对象,表示2台主机之间的 Socket 。
也是就说服务器端 Socket 接受到客户端 Socket 发送过来的连接时,服务器端会生成一个常规的
Socket对象,用于向客户端发送数据,数据总是通过常规socket进行传输。

ServerSocket生命周期
ServerSocket 服务器的基本生命周期包含以下几个:

出现阻塞的情况大体分为如下5种:

  1. 线程调用 sleep 方法,主动放弃占用的处理器资源。
  2. 线程调用了阻塞式 IO 方法,在该方法返回前,该线程被阻塞。
  3. 线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
  4. 线程等待某个通知。
  5. 程序调用了 suspend 方法将该线程挂起。此方法容易导致死锁,尽量避免使用该方法。
    run() 方法运行结束后进入销毁阶段,整个线程执行完毕。

每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列。就绪队列存储了将要获得锁的线程,阻塞
队列存储了被阻塞的线程。一个线程被唤醒后,才会进入就绪队列,等待CPU的调度;反之,一个线程被
wait 后,就会进入阻塞队列,等待下一次被唤醒。
注意:wait,notify必须使用在synchronized同步方法或者代码块内。


三、数据库

索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询

1、把创建了索引的列的内容进行排序 
2、对排序结果生成倒排表 
3、在倒排表内容上拼上数据地址链 
4、在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据 

创建索引的原则(重中之重)
索引虽好,但也不是无限制的使用,最好符合一下几个原则

百万级别或以上的数据如何删除
关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。
所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

  1. 所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)
  2. 然后删除其中无用数据(此过程需要不到两分钟)
  3. 删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。
  4. 与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。
    来源:https://www.cnblogs.com/a8457013

视图概述(技术文):

1)什么是视图?
视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字
段。视图并不在数据库中以存储的数据值集形式存在,而是存在于实际引用的数据库表中,视图的构成可以是单表查询,多表联合查询,分组查询以及计算(表达式)查询等。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

2)视图的优点:

3)视图的缺点:

4)视图使用场景(其实就是需要用到视图上面的几个优点的时候):

5)视图的分类:

视图的使用: 
1、创建视图 
1. create or replace view v_test asselect * fromuser; 
加上OR REPLACE表示该语句还能替换已有的视图 

2、调取视图 
1. select * from v_test; 

3、修改视图 
1. alter view v_test asselect * from user1; 

4、删除视图 
1. drop view if exists v_test; 

5、查看视图 
1. show tables; 
视图放在information_schema数据库下的views表里 

6、查看视图的定义 
show table status from companys like'v_test'; 

在这之前,我们必须明确!增删改最终都是修 改到基础表。且视图中虽然可以更新数据,但 是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全 面考虑在视图中更新数据的限制,就可能会造 成数据更新失败。

视图的算法——存在两种执行的算法

四、视图使用注意点:

对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系或者特殊的没有约束的一对多字段。还有一些特定的其他结构,这类结构会使得视图不可更新。

不可更改的情况如下:视图中含有以下的都不可被修改了。 
(一)聚合函数(SUM(), MIN(), MAX(), COUNT()等)。 
(二)DISTINCT。如下错误。 
(三)GROUP BY 
(四)HAVING 
(五)UNION或UNION ALL 
(六)位于选择列表中的子查询 
(八)FROM子句中的不可更新视图 
(九)WHERE子句中的子查询,引用FROM子句中的表。 
(十)ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

什么是主从复制:
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

主从复制的作用(好处,或者说为什么要 做主从)重点!:

主从复制的原理(重中之重,面试必问):

步骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db

需要知道的是,面试过程中原理不会让你讲那 么久,一般的,只要把1234点讲出来,然后说简略说下三个线程,这就满分了!

三步轻松构建主从:

一、Master主服务器上的配置(103.251.237.42) 
1.编辑my.cnf (命令查找文件位置:fifind / -name my.cnf) 
在[mysqld]中注释掉 bind-address = 127.0.0.1 不然mysql无法远程 
server-id = 1 中 1 是可以自己定义的,但是需要保持它的唯一性,是服务器的唯一标识 
1.log_bin 启动MySQL二进制日志 
2.binlog_do_db 指定记录二进制日志的数据库 
3.binlog_ignore_db 指定不记录二进制日志的数据库。 
注释掉 binlog_do_db 和 binlog_ignore_db ,则表示备份全部数据库做完这些后,重启下数据库 
2.登陆主服务器mysql 创建从服务器用到的账户和权限; 
@之后IP可访问主服务器,这里值定从服务器IP 
新建密码为masterbackup的masterbackup 用户,并赋予replication slave 权限 
可以看到用户masterbackup 已经添加 
3.查看主数据库的状态 
记录 mysql-bin.000007 以及 276,编写以下命令待用; 
change master to 
master_host='103.251.237.42',master_port=3306,master_user='masterbackup',master_password 
='masterbackup',master_log_fifile='mysql-bin.000007',master_log_pos=276; 
二、Slave从服务器配置上的配置(103.251.237.45) 
1.编辑my.cnf(命令查找文件位置:fifind / -name my.cnf) 
在[mysqld]中 
relay-log = slave-relay-bin 
relay-log-index = slave-relay-bin.index 
暂时不清楚这是做什么的。加入这两条。 
重启mysql服务 
登陆mysql,停止同步命令 
执行用上面准备的命令; 登录Slave从服务器,连接Master主服务器: 
重新启动数据同步; 
查看Slave信息;如图两句都为yes,则状态正常 
三、从主从服务器测试结果 
在主服务器创建一个数据库 
在从服务器上查看刚才创建的数据库 
可以查到,主从服务器配置完成。(技术文)当然,还有主主复制,如果有感兴趣的朋友可以留言。 
其实主从复制也存在一些问题: 
1. 负载均衡,由于复制的时间差,不能保证同步读,而且写仍然单点,没法多点写,我对这个理解就是半吊子的读写均衡。 
2. 容灾,基本都是有损容灾,因为数据不同步,谁用谁知道,半吊子的容灾。 
可能只是提供一种成本较低的数据备份方案加不完美的容灾和负载均衡吧,这种方案注定是一种过渡方案,个人认为必须更新了。当然,在不是体量巨大的情况下,还是不失为一个优化的解决办法。 

面试题干货分析(如果问到数据库主从问题,必问以下问题):
1、主从的好处是?
2、主从的原理是?
3、从数据库的读的延迟问题了解吗?如何解决?
4、做主从后主服务器挂了怎么办?


四、常见面试题

TCP 粘包/拆包的原因及解决方法?

TCP粘包/分包的原因:

解决方法

了解哪几种序列化协议?

XML

JSON,是一种轻量级的数据交换格式。

Fastjson,采用一种“假定有序快速匹配”的算法。

Thrift,不仅是序列化协议,还是一个RPC框架。

Avro,Hadoop的一个子项目,解决了JSON的冗长和没有IDL的问题。

Protobuf,将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。

其它

说一下 JVM 有哪些垃圾回收算法?

说一下 JVM 有哪些垃圾回收器?

详细介绍一下 CMS 垃圾回收器?

新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

说一下 JVM 的主要组成部分?及其作用?

类加载器(ClassLoader) 
运行时数据区(Runtime Data Area) 
执行引擎(Execution Engine) 
本地库接口(Native Interface) 

组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区
(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

说一下堆栈的区别?

功能方面:堆是用来存放对象的,栈是用来执行程序的。 
共享性:堆是线程共享的,栈是线程私有的。 
空间大小:堆大小远远大于栈。 

队列和栈是什么?有什么区别?

队列和栈都是被用来预存储数据的。 
队列允许先进先出检索元素,但也有例外的情况,Deque 接口允许从两端检索元素。 
栈和队列很相似,但它运行对元素进行后进先出进行检索。

说一下 JVM 运行时数据区?
不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:

说一下类装载的执行过程?
类装载分为以下 5 个步骤:

Hibernate工作原理及为什么要使用Hibernate?

工作原理: 
1.读取并解析配置文件 
2.读取并解析映射信息,创建SessionFactory 
3.打开Session 
4.创建事务Transation 
5.持久化操作 
6.提交事务 
7.关闭Session 
8.关闭SesstionFactory 

为什么要使用Hibernate(即它的优点):

  1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化
    DAO层的编码工作
  3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  4. hibernate映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关
    系。

Hibernate中get和load方法的区别

具体介绍:

Hibernate是如何延迟加载?
Hibernate3 提供了属性的延迟加载功能。当Hibernate在查询数据的时候,数据并没有存在于内存之 中,而是当程序真正对数据的操作时,对象才存在于内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

Hibernate中怎样实现类之间的关系?
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们在程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many进 行操作。

Hibernate中的update()和saveOrUpdate()的区别?

saveOrUpdate(): 
1,如果对象已经在本session中持久化了,不做任何事 
2,如果另一个与本session关联的对象拥有相同的持久化标识(identififier),抛出一个异常 
3,如果对象没有持久化标识(identififier)属性,对其调用save() 
4,如果对象的持久标识(identififier)表明其是一个新实例化的对象,对其调用save() 
5,如果对象是附带版本信息的(通过 <version> 或 <timestamp> )并且版本属性的值表明其是 
一个新实例化的对象,调用save()。否则update() 这个对象。 
update() : 
是将一个游离状态的实体对象直接更新。 

说说Hibernate的缓存机制。

如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多 
2.灵活使用单向一对多关联 
3.不用一对一,用多对一取代 
4.配置对象缓存,不使用集合缓存 
5.一对多集合使用Bag,多对多集合使用Set 
6. 继承类使用显式多态 
7. 表字段要少,表关联不要怕多,有二级缓存撑腰 

谈谈hibernate的延迟加载和openSessionInView

简要阐述struts2的工作流程

1、客户端浏览器发出HTTP请求。 
2、根据web.xml配置,该请求被FilterDispatcher接收。 
3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。 
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。 
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。 
6、返回HTTP响应到客户端浏览器。

说下Struts的设计模式
MVC模式

1,web应用程序启动时就会加载并初始化ActionServlet; 
2,用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据; 
3,ActionServlet根据Struts-confifig.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法; 
4,Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件; 
5,ActionForward对象指定的jsp生成动 态的网页,返回给客户。 

Struts的优缺点
优点:

缺点:


五、实际面试整理

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

是否可从一个 static 方法内发出对非 static 方法的调用?
不可以。

ClassLoader 如何加载 class ?
jvm 里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap 类加载负责加载 jre/lib/rt.jar 中的类, 我们平时用的 jdk 中的类都位于 rt.jar 中。extclassloader 负责加载ar/lib/ext/*.jar 中的类,appclassloader 负责 classpath 指定的目录或 jar 中的类。除了 bootstrap之外,其他的类加载器本身也都是 java 类,它们的父类是 ClassLoader。

Servlet 的生命周期?

构造器 Constructor 是否可被 override?
构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法?

只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstract 方法。

Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?
Overload 是重载的意思,Override 是覆盖的意思,也就是重写。

至于 Overloaded 的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?
这个题目很模糊。如果几个 Overloaded 的方法的参数列表不一样,它们的返回者类型当然也
可以不一样。
但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它 们的返回值不同来实现重载 Overload。
这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用 map.remove(key)方法时,虽然 remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java 就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
override 可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

overload 对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM 就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

java 中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

abstract class 和 interface 有什么区别?

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

下面接着再说说两者在应用上的区别:

备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等 6 个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。

内部类可以引用它的包含类的成员吗?有没有什么限制?

完全可以。如果不是静态内部类,那没有什么限制! 
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员 
变量,而只能访问外部类中的静态成员,例如,下面的代码: 
class Outer { 
	static int x; 
	static class Inner { 
		void test() { 
			syso(x); 
		} 
	} 
}

答题时,也要能察言观色,揣摩提问者的心思,显然人家希望你说的是静态内部类不能访问外部类的成员,但你一上来就顶牛,这不好,要先顺着人家,让人家满意,然后再说特殊情况,让人家吃惊。

Anonymous Inner Class (匿名内部类) 是否可继承其它类,是否可以 implements 接口?
可以继承其他类或实现其他接口。不仅是可以,而是必须!因为匿名内部类就是在抽象类和
接口的基础上发展起来的。

String s = “Hello”;s = s + " world!";这两行代码执行后,原始的 String 对象中的内容到底变了没有?

没有

通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用 String 来代表字符串的话会引起很大的内存开销。
因为 String 对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个 String 对象来 表示。这时,应该考虑使用 StringBuffer 类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都 new 一个 String。
例如我们要在构造器中对一个名叫 s 的 String 引用变量进行初始化,把它设置为初始值,应当这样做:

public class Demo { 
	private String s; 
	public Demo() { 
		s = "Initial Value"; 
	}
}
而非 s = new String("Initial Value"); 

String s = new String(“xyz”);创建了几个 String Object? 二者之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String 每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新 String 对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

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

error 和 exception 有什么区别?

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

当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象其它方法?

分几种情况: 
1.其他方法前是否加了 synchronized 关键字,如果没加,则能。 
2.如果这个方法内部调用了 wait,则可以进入其他 synchronized 方法。 
3.如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不能。 
4.如果其他方法是 static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是 this。

链表和数组的区别?

两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

能不能自己写个类,也叫 java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载 jre.jar 包中的那个 java.lang.String。
由于在 tomcat 的 web 应用程序中,都是由 webapp 自己的类加载器先自己加载 WEB-INF/classess 目录中的类,然后才委托上级的类加载器加载,如果我们在 tomcat 的 web 应用程序中写一个java.lang.String,这时候 Servlet 程序加载的就是我们自己写的 java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String 类的都将出现问题。
虽然 java 提供了 endorsed 技术,可以覆盖 jdk 中的某些类。但是,能够被覆盖的类是有限制范围,反正不包括 java.lang 这样的包中的类。

HTTP 请求的 GET 与 POST 方式的区别
Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的 GET 和 POST 方法。二者主要区别如下:

说一说 Servlet 的生命周期?

servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。 
这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。

Servlet API 中 forward()与 redirect()的区别?
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用 forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 sendRedirect()方法。

详细描述 MVC
基于 Java 的 Web 应用系统采用 MVC 架构模式,即 model(模型)、view(视图)、control(控制)分离设计;这是目前 WEB 应用服务系统的主流设计方向。

MVC 的各个部分都有那些技术来实现?如何实现?
MVC 是 Model-View-Controller 的简写。
Model 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现)
View 是应用的表示面(由 JSP 页面产生)
Controller 是提供应用的处理过程控制(一般是一个 Servlet)
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现
这些组件可以进行交互和重用

** javascript 的优缺点和内置对象。**

谈谈你对 Hibernate 的理解。

AOP 的作用

Hibernate 有哪 5 个核心接口?

什么是 ORM?

名词解释:①WEB SERVICE ②JAXP ③JAXM ④SOAP ⑤UDDI ⑥WSDL

BS 与 CS 的联系与区别。
C/S 是 Client/Server 的缩写。服务器通常采用高性能的 PC、工作站或小型机,并采用大型数据库系统,如 Oracle、Sybase、InFORMix 或 SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator 或 Internet Explorer,服务器安装 Oracle、Sybase、InFORMix 或 SQL Server 等数据库。在这种结构下,用户界面完全通过 WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

C/S 与 B/S 区别:

标签:JAVA,对象,宝典,视图,面试,线程,一个,Java,方法
来源: https://blog.csdn.net/zzhaolxy/article/details/122030050