Java高频面试题一
- 一、List 和 Set 和 Map 的区别
- 二、HashMap 和ConcurrentHashmap 的区别
- 三、arrarylist,linkedlist;arraylist内部扩容机制是怎样的?
- 四、hashmap,hashtable,为什么hashtable是线程安全的,为什么hashmap不是线程安全的。hashmap扩容机制,HashMap的底层原理hashmap为什么扩容为原来的二倍
- 五、final 和 finally 和 finalize 的区别
- 六、JDK1.8 的新特性
- 七、Java 的异常处理机制
- 八、String、StringBuilder、StringBuffer的区别
- 九、重写equals已经能比较两个对象了,为什么还要重写hashcode方法
- 十、基本数据类型和包装数据类型的区别?
- 十一、什么是多态?举例说明
- 十二、抽象类和接口的区别
- 十三、== 和 equals 的区别
- 十四、Java中的几种基本类型,个占用多少个字节
- 十五、隐式类型转换和强制类型转换?
- 十六、运行时异常有几种
- 十七、Java语言如何进行异常处理:Throw和throws 区别:关键字: throws,throw,try,catch,finally 分别代表什么意义,在 catch 块中可以抛出异常吗?
- 十八、对面向对象的理解?面向对象的特征有哪些?
- 十九、session 和 cookie 之间的区别
- 二十、HTTP 报文由哪几部分组成? Get/Post 有什么区别?
- 二十一、转发(forward)和重定向(redirect)的区别
- 二十二、简单描述 jsp 的九大内置对象
- 二十三、怎么理解 ajax? ajax 是否可以同步? Ajax 的优缺点
- 二十四、图片如何实现上传
- 二十五、说一说 Servlet 的生命周期
- 二十六、跨域问题如何解决
- 二十七、Javaweb 项目中如何实现 jsp 页面跳转,数据的交互?
一、List 和 Set 和 Map 的区别
区别一 结构特点:
List 和 Set 是存储单列数据的集合,Map 是存储键值对这样的双列数据的集合;
List 中存储的数据是有序的,值可以被重复;
Set 中存储的数据是无序的,值不允许有重复,重复的值会被替换掉;
Map 中存储的数据是无序的,键是唯一的不能重复,但是值可以重复;
区别二 实现类:
List 接口有三个实现类
- LinkedList:基于链表实现,链表内存是散乱的,每个元素存储本身内存地址的同时还会存储下一个元素的地址,链表增删快,查找慢
- ArrayList:基于数组实现的,非线程安全,效率高,便于索引(查询),但不便于插入删除
- Vector:基于数组实现的,线程安全,效率低
Set 接口有两个实现类
- HashSet:底层是由 HashMap 实现的,不允许集合中有重复的值,使用该方式时需要重写 equals() 和 hashCode() 方法
- LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap
Map 接口有三个实现类
- HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键
- HashTable:线程安全,低效,不支持 null 值和 null 键
- TreeMap:能够把它保存的记录根据键排序,默认是键值的升序排序
二、HashMap 和ConcurrentHashmap 的区别
ConcurrentHashmap 是线程安全的,多线程读写使用;而hashMap不是线程安全的,单线程读写使用
ConcurrentHashmap 的操作都是原子操作,hashMap不是
三、arrarylist,linkedlist;arraylist内部扩容机制是怎样的?
arraryList 默认大小是10,当集合个数大于容量的时候,就会以1.5的容量进行扩容;
LinkedList 是一个双向链表,没有初始化大小,也没有扩容机制,就是一直在前面或者后面新增就好;
四、hashmap,hashtable,为什么hashtable是线程安全的,为什么hashmap不是线程安全的。hashmap扩容机制,HashMap的底层原理hashmap为什么扩容为原来的二倍
hashtable 的方法都提供了同步机制
hashmap 的方法不提供同步机制
也就是说hashmap采用2倍扩容,可以尽可能的减少元素位置的移动
五、final 和 finally 和 finalize 的区别
final:Java中的关键字,修饰符
用来修饰属性 方法 和类
修饰的属性不能被更改,修饰的方法不能被重载,修饰的类不能被继承
finally:Java的一种异常处理机制
finally 是异常处理的一部分,不管怎么样都会执行
finalize:Java中的一个方法名
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法
Java 技术 使用 finalize() 方法在垃圾收集器将对象清理出内存之前会先调用它的 finalize 方法(这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的),做一些清理工作,通常这部分内存是非Java内存,如socket,finalize只会被调用一次
六、JDK1.8 的新特性
Lambda 表达式
接口中的默认方法和静态方法
函数式接口
方法引用和构造器调用
量限制
Stream API
新时间日期API
七、Java 的异常处理机制
抛出异常 和 捕获异常
异常处理的5个关键字:try , catch ,finally,throw,throws
try:监控区域
catch:用于捕获异常
finally:处理善后工作,finally,即使catch没有捕获到,最后也一定会被执行
throw:主动在方法里抛出异常(是语句抛出一个异常,自己手动抛出某些特定类型的异常)
throws:在方法上面抛出异常(是方法可能出现的异常用于throws声明,交给上层调用,自身并不主动处理)
八、String、StringBuilder、StringBuffer的区别
String 字符串常量 不可变 使用字符串拼接时是不同的 2 个空间
StringBuffer 字符串变量 可变 线程安全 字符串拼接直接在字符串后追加
StringBuilder 字符串变量 可变 非线程安全 字符串拼接直接在字符串后追加
九、重写equals已经能比较两个对象了,为什么还要重写hashcode方法
提高效率
保证是同一个对象
十、基本数据类型和包装数据类型的区别?
- 包装数据类型是对象,拥有方法和字段,对象的调用时通过引用对象的地址
基本数据类型不是 - 包装数据类型是引用的传递
基本数据类型是值的传递 - 声明方式不同
基本数据类型不需要 new 关键字
包装数据类型需要 new 在堆内存中通过 new 来分配内存空间 - 存储位置不同
基本数据类型直接将值保存在值栈中
包装数据类型将对象放在堆中,通过对象的引用来调用他们 - 初始值不同
基本数据类型 int 初始值为0,Boolean 类型初始值为 false
包装数据类型初始值为 null - 使用方式不同
基本数据类型直接赋值就能使用
包装数据类型是在集合,如 coolectionMap时使用
十一、什么是多态?举例说明
通俗的说,多态就是不同对象对同一物体或事件发出不同的反应或响应。比如stuendt是一个父类,那么在操场上上体育课的学生和在教室里面的学生就是它的子类。这时上课铃声响了,上体育课的学生去操场,在教室里面上课的学生则是回教室,不同的学生有着不同的反应,这就是多态。
实现多态的条件:
1.继承:必须要有子类继承父类的继承关系。
2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
十二、抽象类和接口的区别
- 抽象类不能被实例化,即不能使用 new 关键字来实例化对象,只能被继承;接口是绝对抽象的,不可以被实例化
- 有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法
- 类可以实现多个接口,但是只能继承一个抽象类
- 类如果要实现一个接口,就必须要实现接口中声明的所有方法,但是类可以不实现抽象类中声明的的所有方法
- 抽象类可以在不提供接口实现方法的情况下实现接口
- 接口中声明的变量默认都是 final,抽象类可以包含非 final 的变量
- 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protecte 或者是 public
十三、== 和 equals 的区别
“==” 是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
equals 是 Object 的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
十四、Java中的几种基本类型,个占用多少个字节
- 布尔型 Boolean 8位
- 字节型 byte 8位
- 字符型 char 16位
- 短整型 short 16位
- 整型 int 32位
- 浮点型 float 32位
- 长整型 long 64位
- 双精度 double 64位
十五、隐式类型转换和强制类型转换?
低级向高级转换 — 自动转换:隐式转换
高级到低级转换—强制转换
十六、运行时异常有几种
- 空指针异常
- 下标越界异常
- 类转换异常
- 算数异常
- 安全异常
- 非法参数异常
十七、Java语言如何进行异常处理:Throw和throws 区别:关键字: throws,throw,try,catch,finally 分别代表什么意义,在 catch 块中可以抛出异常吗?
try:尝试着执行可能会出现异常的代码
catch:如果try中的代码在执行过程中,出现了异常,捕获该异常,如果没有异常,就不执行。
finally:其中的代码块是不管报不报错都会执行的,通常用来释放资源。
throw:主动在方法里抛出异常(是语句抛出一个异常,自己手动抛出某些特定类型的异常)
throws:在声明方法上抛出异常(是方法可能出现的异常用于throws声明,交给上层调用,自身并不主动处理)
throw
在方法体内使用,throws
在方法声明上使用;
throw
后面接的是异常对象,只能接一个。throws
后面接的是异常类型,可以接多个,多个异常类型用逗号隔开;
十八、对面向对象的理解?面向对象的特征有哪些?
面向对象就是吧事务分成一个一个的对象
eg:
1、打开洗衣机—> 2、放衣服—> 3、放洗衣粉—> 4、清洗—> 5、烘干
面向对象:会拆分出人和洗衣机两个对象。
人:1、打开洗衣机—> 2、放衣服—> 3、放洗衣粉
洗衣机:1、清洗—> 2、烘干
三大特征:封装 继承 多态
十九、session 和 cookie 之间的区别
-
数据的存放位置不同
cookie 直接将数据存放在客户端浏览器上
session 将数据存放在服务器中 -
安全程度不同
cookie 不是很安全,别人可以分析存放在本地的 cookie 进行 cookie 欺骗
考虑到安全应使用 session -
性能使用程度不同
session 会在一定时间内保存在服务器上, 当访问数据量增多,会比较占用服务器性能
考虑到减轻服务器性能方面应使用 cookie -
数据存储大小不同
单个 cookie 保存的数据不能超过 4K,很多浏览器都是限制一个站点最多保存 20 个 cookie
session 则是存储在服务器中,浏览器对其并没有限制 -
会话机制不同
session 会话机制是一种服务器端机制,类似与哈希表的结构来存储数据
二十、HTTP 报文由哪几部分组成? Get/Post 有什么区别?
HTTP 报文由请求报文和相应报文两部分组成
- 请求报文:请求行、请求头、空行、请求体
请求行:包括请求方法、请求的url(路径)、http协议及版本;
请求头:一大堆的键值对;
空行:当服务器在解析请求头的时候,如果遇到了空行,则表明,后面的内容是请求体;
请求体:数据部分。
注意:get 方法发起的请求是没有空行和请求体的
- 相应报文:状态行、响应头、空行、响应体
状态行:http协议及版本、状态码及状态描述;
其它部分都是响应回来的东西,跟请求报文的内容对应的。
请求方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
get : 请求指定的页面信息,并返回实体主体。
head : 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
post : 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
put : 从客户端向服务器传送的数据取代指定的文档的内容。
delete : 请求服务器删除指定的页面。
connect : HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
options : 允许客户端查看服务器的性能。
trace: 回显服务器收到的请求,主要用于测试或诊断。
patch: 是对 PUT 方法的补充,用来对已知资源进行局部更新 。
- get:获取资源;
- post:传输资源
- put:更新资源;
- delete:删除资源
- head:获得报文首部
GET 和 POST 的区别
- get 在浏览器回退的时候是无害的,而 post 会再次提交数据
- get 请求会被浏览器主动缓存,而 post 不可以
- get 请求产生的 url 路径地址是可以被收藏的,而 post 不可以
- post 请求比 get 请求安全,因为 get 请求的参数直接暴露在请求的路径中,所以一些比较敏感的数据就不要用 get 请求来传递
- get 请求只接收 ASCII 码字符的参数类型,而 post 没有限制
- get 请求在 url 中传递的参数都有大小限制,基本是 2kb,不同的浏览器略有不同,而 post 没有限制
- get 请求的参数会保留在浏览器的历史记录里,而 post 不会
二十一、转发(forward)和重定向(redirect)的区别
forward 是服务器行为 redirect 是客户端行为
forward 只能是同一个 web 内的 url;redirect 可以是任意的 url
froward
客户端发送请求—>服务器接收—>调用内部的方法处理请求并转发—>将目标资源信息发送给客户
redirect
客户发送请求—>服务器接收并响应新的location给客户—>客户会接收到一个新的location地址
- 从地址显示来说
forward 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来, 然后把这些读取到的内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址
redirect 是服务端根据逻辑发送一个状态码,告诉浏览器重新去请求哪个地址,所以地址栏显示的是新的 URL - 从数据共享来说
forward 转发页面和转发到的页面可以共享 request 里面的数据
redirect:不能共享数据 - 从运用地方来说
forward 一般用于用户登陆的时候,根据角色转发到相应的模块
redirect 一般用于用户注销登陆或返回主页面和跳转到其它的页面使用 - 从效率来说
forward 效率高
redirect 效率低
二十二、简单描述 jsp 的九大内置对象
request: 封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
response: 封装服务器对客户端的响应;
pageContext: 通过该对象可以获取其他对象;
session: 封装用户会话的对象;
application: 封装服务器运行环境的对象;
out: 输出服务器响应的输出流对象;
config: Web 应用的配置对象;
page: JSP 页面本身(相当于 Java 程序中的 this);
exception: 封装页面抛出异常的对象。
二十三、怎么理解 ajax? ajax 是否可以同步? Ajax 的优缺点
Ajax 是一种通过后台与服务器进行少量数据,使页面实现异步更新,不需要再重新加载页面,就能对页面中的某一部分进行数据更新
优点:
-
实现了异步交互,提高了用户体验。
-
不需重新加载整个网页,只需要与服务器进行少量的数据交换,就能够实现对网页中的某一部分进行更新,从而减少了带宽的占用。
-
Ajax 是在客户端运行的,它承载了本来是由服务器承担的工作,减少了大量用户下的服务器负载
缺点:
-
安全性问题,大量的使用 Ajax 暴露了服务器交互的细节
-
不容易调试
-
对搜索引擎的支持比较弱
二十四、图片如何实现上传
前端上传图片调用后端接口,后端上传成功后返回一个路径,再把这个路径放在标签里,最后一起保存入数据库。其中生成的UUID是为了上传照片解决重名的问题
二十五、说一说 Servlet 的生命周期
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁
当服务器第一次接收到请求的时候,容器会察看对应的 Servlet 对象是否存在,如果不存在,需要先创建 Servetl,
Servlet 被服务器实例化后
容器会调用 init() 方法进行初始化
初始化完成后调取 service() 方法, service 方法自动派遣,运行与请求对应的 doXXX 方法(doGet,doPost)等,
当服务器决定将实例销毁的时候调用其 destroy 方法。
实例化阶段
1.1 当客户端首次发送第一次请求后,由Servlet容器去解析请求,根据请求找到是否有对应的servlet。
1.2 判断是否有Servlet实现类的对象存在?存在则直接使用,不存在则先创建一个servlet实现类的对象。
初始化阶段
Servlet 初始化是其生命周期的第一个阶段,也是其他阶段的基础。只有完成了初始化,Servlet 才能处理来自客户端的请求。
Servlet 初始化阶段分为 2 步:
- 加载和实例化 Servlet
- 调用 init() 方法进行初始化
请求响应阶段
初始化完成后调取 service() 方法,由 service() 判断客户端的请求方式是 doGet 方法还是 doPost 方法。
处理方法完成后会作出相应的结果返回给客户端,单次请求处理完毕。
当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init(),而直接执行service方法调取doGet() / doPost()方法。
服务终止阶段
当服务器关闭,重启或移除 Servlet 实例时 Servlet 调取 destroy() 方法进行销毁,宣告生命周期的结束。
二十六、跨域问题如何解决
跨域:跨域就是当在页面上发送ajax请求时,由于浏览器同源策略的限制,要求当前页面和服务端必须同源,也就是协议、域名和端口号必须一致。
http://localhost:8081
http:协议
localhost:域名
8081:端口号
1. JSONP方式解决跨域
jsonp的原理就是利用了script标签不受浏览器同源策略的限制,然后和后端一起配合来解决跨域问题的。
2. document.domain + iframe跨域
3. location.hash + iframe
4. window.name + iframe跨域
5. postMessage跨域
6. 跨域资源共享(CORS)
7. nginx代理跨域
8. nodejs中间件代理跨域
9. WebSocket协议跨域
二十七、Javaweb 项目中如何实现 jsp 页面跳转,数据的交互?
页面跳转:
1.提交表单
2.Javascript window.location = 页面
3.转发request.getRequestDispatcher(页面).forward(request, response)
4.重定向 response.setHeader()和response.sendRedirect()
数据交互:
1.setAttribute()和getAttribute()方法传递参数
2.使用request对象获取客户端提交的信息
3.利用隐藏域传递数据
4.通过超链接传递数据