java面试题回顾

1、 重载(overload)和重写(override)的区别?重载的方法能否根据返回类型 进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态 性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为 重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方 法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

方法重载的规则:

1.方法名一致,参数列表中参数的顺序,类型,个数不同。

2.重载与方法的返回值无关,存在于父类和子类,同类中。

3.可以抛出不同的异常,可以有不同修饰符。

方法重写的规则:
1.参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致。

2.构造方法不能被重写,声明为 final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。

3.访问权限不能比父类中被重写的方法的访问权限更低。

4.重写的方法能够抛出任何非强制异常(UncheckedException,也叫非运行时异常),无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则 可以。

2、抽象类(abstract class)和接口(interface)有什么异同?

不同:

抽象类:

1.抽象类中可以定义构造器
2.可以有抽象方法和具体方法
3.接口中的成员全都是 public 的
4.抽象类中可以定义成员变量

5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

6.抽象类中可以包含静态方法

7.一个类只能继承一个抽象类

接口:

1.接口中不能定义构造器
2.方法全部都是抽象方法
3.抽象类中的成员可以是 private、默认、protected、public

4.接口中定义的成员变量实际上都是常量

5.接口中不能有静态方法
6.一个类可以实现多个接口

相同:

1.不能够实例化

2.可以将抽象类和接口类型作为引用类型

3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要 被声明为抽象类

3、String 、StringBuilder 、StringBuffer 的区别

(1)、可变不可变
String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。

StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。

(2)、线程是否安全

String:对象定义后不可变,线程安全。

StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据。

StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。

(3)、共同点

StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。

StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(...)。 只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。

4、Java 的基本数据类型都有哪些各占几个字节

四类

八种

字节数

数据表示范围

整型

byte

1

-128~127

short

2

-32768~32767

int

4

-2147483648~2147483647

long

8

-263~263-1

浮点型

float

4

-3.403E38~3.403E38

double

8

-1.798E308~1.798E308

字符型

char

2

表示一个字符,如('a','A','0','家')

 

布尔型

boolean

1

只有两个值 true 与 false

5、下面 Integer 类型的数值比较输出的结果为?

如果不明就里很容易认为两个输出要么都是 true 要么都是 false。

简单的说,如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer 对象,而是直接引用常量池 中的 Integer 对象,所以上面的面试题中 f1==f2 的结果是 true,而 f3==f4 的结果是 false。

6、java IO流

字节流如何转为字符流:

字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。

字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

 7、ArrayList、LinkedList、voctor

ArrayList 底层结构是数组,底层查询快,增删慢。

LinkedList 底层结构是链表型的,增删快,查询慢。

voctor 底层结构是数组 线程安全的,增删慢,查询慢。

8、 HashMap 和 HashTable 有什么区别?

HashMap 是线程不安全的,HashMap 是一个接口,是 Map 的一个子接口,是将键映射到值得对象,不允许键值重复, 允许空键和空值;由于非线程安全,HashMap 的效率要较 HashTable 的效率高一些.

HashTable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者 Value 值

9、Collection 和 Map 的集成体系

Collection:

Map

 

10、线程和进程的区别

进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位。

线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立运行的基本单位。

特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各自内存单元相互独立,线程之间 内存共享,这使多线程编程可以拥有更好的性能和用户体验

11、请说出同步线程及线程调度相关的方法?

wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理 InterruptedException 异常;

notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关;

notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态

12、说说你对 Java 中反射的理解

Java 中的反射首先是能够获取到 Java 中要反射类的字节码,获取字节码有三种方法:

1.Class.forName(className)

2.类名.class

3.this.getClass()。

然后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类

13、 说下原生 jdbc 操作数据库流程?

第一步:Class.forName()加载数据库连接驱动,如:Class.forName("com.mysql.jdbc.Driver");

第二步:DriverManager.getConnection()获取数据连接对象;

第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;

第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();

第五步:关闭结果集、关闭会话、关闭连接。

示例:https://blog.csdn.net/qq_29542611/article/details/52426006

14、http 中重定向和请求转发的区别?

本质区别:转发是服务器行为,重定向是客户端行为。

重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。

请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。

15. Cookie 和 Session 的区别

Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。 以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。

Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在 应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

Cookie 和 session 的不同点:
1、无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。

2、在存储的数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象。

16、在单点登录中,如果 cookie 被禁用了怎么办?

单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie, 然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录的关键不是 cookie,而是通过 cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。除了 cookie,还通常使用 HTTP 请求头来传 输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。

17、jsp九大内置对象

 

生命周期

作用域

使用情况

Request

一次请求

只在 Jsp 页面内 有效

用于接受通过 HTTP 协议传送到服务器 的数据(包括头信息、系统信息、请 求方式以及请求参数等)。

Reponse

一次响应

只在 Jsp 页面内 有效

表示服务器端对客户端的回应。主要 用于设置头信息、跳转、Cookie 等

 

Session

从存入数据开始,默认闲置 30 分钟后失 效

会话内有效

用于存储特定的用户会话所需的信息

Out

http://www.cnblogs.com/leirenyuan/p/601 6063.html

 

用于在 Web 浏览器内输出信息,并且 管理应用服务器上的输出缓冲区

PageContext

详细了解:

http://www.cnblogs.com/leirenyuan/p/601 6063.html

 

用于存取其他隐含对象,如 request、 reponse、session、application 等对 象。(实际上,pageContext 对象 供 了对 JSP 页面所有的对象及命名空间的 访问。

Page

http://www.cnblogs.com/leirenyuan/p/601 6063.html

 

page 对象代表 JSP 本身(对应 this), 只有在 JSP 页面内才是合法的

Exception

http://www.cnblogs.com/leirenyuan/p/601 6063.html

 

显示异常信息,必须在 page 指令中设 定< %@ page isErrorPage="true" %>才能 使用,在一般的 JSP 页面中使用该对象 将无法编译 JSP 文件

Application

服务器启动发送第一个请求时就产生了 Application 对象,直到服务器关闭。

 

用于存储和访问来自任何页面的变量 所有的用户分享一个 Application 对象

Config

http://www.cnblogs.com/leirenyuan/p/601 6063.html

 

取得服务器的配置信息

18、数据库引擎MyISAM和InnoDB

MyISAM 是 MySQL 官方提供默认的存储引擎,其特点是不支持事务、表锁和全文索引,插入、查询速度快,对于一些 OLAP(联机 分析处理)系统,操作速度快。

InnoDB 存储引擎支持事务,主要面向 OLTP(联机事务处理过程)方面的应用,其特点是行锁设置、支持外键, 并支持类似于 Oracle 的非锁定读,即默认情况下读不产生锁。

19、事务的四大特征是什么?

数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离 性(Isolation)、持久性(Durability)。

(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执 行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相 同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称 为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。

(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

20、oracle分页

select * from
  ( select rownum r,a from tabName where rownum <= 20 )
where r > 10

21、SpringMVC 常用注解都有哪些?

@requestMapping 用于请求 url 映射。

@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。

@ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户。

22、 BeanFactory 与 AppliacationContext 有什么区别

1. BeanFactory
基础类型的 IOC 容器,提供完成的 IOC 服务支持。如果没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。

2.ApplicationContext

ApplicationContext 是在 BeanFactory 的基础上构建,是相对比较高级的容器实现,除了 BeanFactory 的所有支持外,ApplicationContext 还提供了事件发布、国际化支持等功能。ApplicationContext 管理的对象,在容器启动 后默认全部初始化并且绑定完成。

24、怎样开启注解装配?

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在 Spring 配置文件中配 置 <context:annotation-config/>元素。

25、使用 MyBatis 的 mapper 接口调用时有哪些要求?

1. Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同

2. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同

3. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

4. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

26、MyBatis 在 insert 插入操作时返回主键 ID

数据库为 MySql 时:

“keyProperty”表示返回的 id 要保存到对象的那个属性中,“useGeneratedKeys”表示主键 id 为自增长模式。

27、 拦截器和过滤器有哪些区别?

* 拦截器是基于 java 的反射机制的,而过滤器是基于函数回调
* 拦截器不依赖 servlet 容器,而过滤器依赖 servlet 容器
* 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用
* 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能
* 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一 次

28 、Hibernate 和 Mybatis 的区别?

两者相同点:
1)Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML 配置文件生成 SessionFactory,然后由SessionFactory 生成 Session,最后由 Session 来开启执行事务和 SQL 语句。其中 SessionFactoryBuider, SessionFactory,Session 的生命周期都是差不多的。

2)Hibernate 和 MyBatis 都支持 JDBC 和 JTA 事务处理。

Mybatis 优势:

1)MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。

2)MyBatis 容易掌握,而 Hibernate 门槛较高。

Hibernate 优势:

1)Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。

2)Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。

3)Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。

4)Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。

29、hibernate 的缓存机制。

Hibernate 缓存分为两层:Hibernate 的一级缓存和 Hibernate 二级缓存。
1.Hibernate 一级缓存(Session 的缓存):
(1)Session 实现了第一级 Cache,属于事务级数据缓冲。一旦事务结束,缓存随之失效。一个 Session 的生命周期 对应一个数据库事务或一个程序事务。
(2)Session-Cache 总是被打开并且不能被关闭的。
(3)Session-Cache 保证一个 Session 中两次请求同一个对象时,取得的对象是同一个 Java 实例,有时它可以避免 不必要的数据冲突。

a.在对于同一个对象进行循环引用时,不至于产生堆栈溢出。

b.当数据库事务结束时,对于同一数据表行,不会产生数据冲突。因为对于数据库中的一行,最多有一个对象来表示它。

c.一个事务中可能会有很多个处理单元,在每一个处理单元中做的操作都会立即被其他的数据单元得知。

2.Hibernate 二级缓存(SessionFactory 的缓存):
(1)二级缓存是 SessionFactory 范围内的缓存,所有的 Session 共享同一个二级缓存。在二级缓存中保存持久化实 例的散装形式的数据。
(2)持久化不同的数据需要不同的 Cache 策略,比如一些因素将影响 Cache 策略的选择:数据的读/写比例、数据表 是否能被其他的应用程序所访问等。
(3)设置 Hibernate 二级缓存需要分两步:首先,确认使用什么数据并发策略。然后,配置缓存过期时间并设置 Cache 提供器。

30、解释一下什么是 Servlet, 说一说 Servlet 的生命周期

Servlet 是一种服务器端的 Java 应用程序,具有独立于平台和协议的特性,可以生成动态的 Web 页面。 它担当客 户请求(Web 浏览器或其他 HTTP 客户程序)与服务器响应(HTTP 服务器上的数据库或应用程序)的中间层。 Servlet 是位于 Web 服务器内部的服务器端的 Java 应用程序,与传统的从命令行启动的 Java 应用程序不同,Servlet 由 Web 服务器进行加载,该 Web 服务器必须包含支持 Servlet 的 Java 虚拟机

Servlet 生命周期可以分成四个阶段:加载和实例化、初始化、服务、销毁。

当客户第一次请求时,首先判断是否存在 Servlet 对象,若不存在,则由 Web 容器创建对象,而后调用 init()方 法对其初始化,此初始化方法在整个 Servlet 生命周期中只调用一次。

完成 Servlet 对象的创建和实例化之后,Web 容器会调用 Servlet 对象的 service()方法来处理请求。 当 Web 容器关闭或者 Servlet 对象要从容器中被删除时,会自动调用 destory()方法。

31、Redis与Memcached的区别与比较

1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。

2 、Redis支持数据的备份,即master-slave模式的数据备份。

3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中

4、 redis的速度比memcached快很多

5、Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。
 

32、使用redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2)支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
 

33、Redis常见数据结构使用场景
1. String

    常用命令: set,get,decr,incr,mget 等。

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
常规key-value缓存应用;
常规计数:微博数,粉丝数等。
2.Hash

    常用命令: hget,hset,hgetall 等。

Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 比如我们可以Hash数据结构来存储用户信息,商品信息等等。

举个例子: 最近做的一个电商网站项目的首页就使用了redis的hash数据结构进行缓存,因为一个网站的首页访问量是最大的,所以通常网站的首页可以通过redis缓存来提高性能和并发量。我用jedis客户端来连接和操作我搭建的redis集群或者单机redis,利用jedis可以很容易的对redis进行相关操作,总的来说从搭一个简单的集群到实现redis作为缓存的整个步骤不难。
3.List

    常用命令: lpush,rpush,lpop,rpop,lrange等

list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
4.Set

    常用命令:
    sadd,spop,smembers,sunion 等

set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值