我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化
java基础
1.java跨平台
由于各个操作系统的指令不完全一样,在不同的操作系统执行不同的程序代码,java开发了java虚拟机来屏蔽系统之间的差异,针对不同的系统安装不同的虚拟机即可。
2.int数据占32字节
8中基本类型:byte(8)、short(16)、int(32)、long(64)、float(32)、double(64)、char(16)、Boolean(1)
3.java的三大属性,封装,多态,继承,java四大特征,分别是抽象,封装,多态,继承。
继承:继承是从已有的类得到继承信息创建新的类的过程,继承可以表示为 is-a 关系 。
多态:方法重载(Overload):编译时的多态性(也就是前绑定),方法可以根据不同参数类型进行不同调用,方法名字一致。的
方法重写(Override):运行时的多态(也称为后绑定)。
要实现方法重写需要做:①.方法重写,也就是子类继承父类并重写了父类已经有的方法。 ②.用父类型引用来引用子类型对象,这样可以实现调用同样的方法会根据子类对象的不同表示出不一样的行为。
封装:将对象封装为一个高度自治和封闭的个体,对象状态由这个对象自己的行为来读取和改变。(一个人的姓名、身高、体重由自己的方法获取或改变)
抽象:将相同的类的共同特征总结出来,构造成类的过程。包括数据抽象以及行为抽象。数据抽象变成类的成员变量,行为抽象变成类的成员函数。抽象只关心成员变量以及成员函数,并不关系具体的实现细节。
4.有基本类型 为啥要装箱类型
装箱:把基本类型转换为包装类型,就是Integer
拆箱:把包装类型转换为基本类型
java 是面对对象语言,基本的数据类型不具备面向对象的特性。
integer和int作为ID 。integer直接判断是否为空即可,int既要判断是否为0还要判读为空
对象缓存:对象缓存
5.“==”与“equals”
== 直接用来判断两个变量的值是否相等,如果是基本类型课直接比较,如果是引用类型要比较对应内存结构首地址
equals 用来判断变量对象内容是否一样
String=“123”; string= new string(“123”); 用==比较不相等
6.string 、stringBuilder、stringbuffer 字符串就是多个字符的集合
String 是内容不可变的的字符串
StringBuilder和stringbuffer可变,底层实现用可变数组(没有用final修饰)
StringBuilder是线程不安全的,效率高
stringbuffer是线程安全的,效率低(底层实现用到了同步锁)
7.java中的集合,集合分为value 和 key-value
List 是有序,可以重复
Set 是无序的 不可以重复,是根据equals 和 hashcode判断
map
8.ArrayList 底层实现用数组,使用在查询比较多,插入删除比较少
LinkedList 底层实现用的是链表,与一样相反
数组查询比较快,插入与修改比较慢(需要在内存中是一块连续的内存,插入修改需要运动内存)
链表插入与修改比较快,查询比较慢(内存不要求连续,查询需要查找引用地址)
9.HashMap和HashTable
①.都是可key-Value
②.hashmap可以用null作为key或value
③.Hashmap是线不安全的,效率高
④.ConcurrentHashMap和CopyOnWriteArrayList保留了线程安全的同时,也提供了更高的并发性。
10.拷贝文件用字符流还是字节流。
用字节流,因为拷贝文件时,不确定文件是否包含字节流(图片、声音、图像等),为通用选择字节流。
11.线程的几种实现方式
实现方式
1.通过Thread实现
2.runnable接口实现
继承扩展性不强,java总只支持单继承,如果一个类型继承了thread就不能继承其他的类
怎么启动
怎么区分
给线程设置名称
12.线程并发库
java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得的心应手。
该包提供了线程的运行,线程池的创建,线程生命周期的控制.
Java通过 Executors提供四个静态方法创建四种线程池,分别为:
①.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
②.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
③.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
④.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
其中:FIFO为先进先出(类似于队列);LIFO为后进先出(类似于栈)
作用:1 限制线程的个数,防止系统崩溃,内存溢出
13.设计模式:可以解决过程中可以反复使用的,可以解决特定问题的的设计方式
单体:饱汉模式和饥饿模式
①.构造方法私有化,除自己之外不能创建
②.在自己的类中创建一个单实例(饱汉模式是一开始就创建饥饿模式是需要的时候会创建)
③.提供一个方法获取实例对象
工厂模式:SpringIOC的实现
代理模式:SpringAOP根据动态代理实现
java Web基础
14.get与post 都是http请求
get 查询 post 改 put增 delete 删除
get 请求数据在地址栏显示,地址栏参数有限制(1024)
post 请求参数不会在地址栏显示,参数长度不会显示,安全性搞一下
15.servlet全称 java servlet 是java编写的服务器端程序,主要作用是交互式浏览和修改数据,生成动态的web内容。
16.servlet生命周期
加载、实例化、初始化、处理请求、服务结束
启动时加载,加载完成后servet会被实例化,然后容器进行初始化,请求到达时响应请求、完成响应时关闭请求。
17.servlet中forward() 与redirect()的区别
forward()服务器端转向 在地址栏不会改变转向后的地址,这个方法更加高效,尽量使用
redirect() 客户端跳转 浏览器会得到跳转的地址,重新发送请求
18.jsp与servlet的相同与区别
jsp是servlet的技扩展,jsp会被翻译为一个继承httpservlet的类
servlet是在java中写html 侧重逻辑控制
jsp是在html中写java 侧重视图
19.jsp的作用域
pagecontext
request
session
application
20.session与cookie都是会话跟踪技术
cookie 是在客户端记录信息
session是在服务器存在数据 安全 数据量大占内存(购物车的实现)
cookie是在客户端是可以禁用的,这时要用cookie+数据库测试
主要信息存放在session
21.MVC
model 模型 javabean
view 视图 html、jsp
controller 控制器 servlet action
经典:JSP+Servlet+javaBean
数据库基础
22.数据库分类
关系型数据库(三范式):mysql Oracle SqlServer
非关系数据库:redis memcache mogodb Hadoop
第一范式:数据的不可分割
第二范式:每一行可以被唯一标识 主键
第三范式:数据库表中不包含其他数据库的非主键字段 外键
23.事务:并发控制的单位
原子性、一致性、隔离线、持久性
24.mysql默认最大连接数 100
数据库只能设置一定数目同时连接
25 mysql分页和Oracle分页
当数据量很大的时候进行分段显示
mysql通过limit进行分页查询,limit offset size
Oracle用到的是一个三层嵌套查询
26.触发器
27.存储过程
28.调用jdbc过程(详细有七部)
加载驱动
获取连接
设置参数
释放连接
29.prepareStatement与statement的好处
①.prepareStatement是预编译的,比statement快
②.代码的客户维护性和可读性
③.prepareStatement可以防止sql注入
30.数据库连接池的作用
①.限制数据库的个数,不会因为数据连接过多导致系统奔溃
②.数据库连接不需要每次都去创建或者销毁,节约了资源
③.不需要每次都去创建,响应时间更快
前端基础
31.html css js的定位
html 超文本标记语言 定义网页结构
css层叠样式表,美化页面
js 验证表单 做动态交互
32.ajax
异步的js和xml
作用:异步刷新页面,完成局部更新
33.js 和jQuery
jQuery是js的框架,封装了js的方法。增强了js的功能,使用便利
34.jQuery选择
ID选择器 通过ID获取选择器
class选择器,通过标签选择器
标签选择器,通过标签获取
通用选择器,获取所有的元素 div.myCls
增次选择器
儿子选择器 后代选择器
属性选择器 获取拥有标签属性的信息
35.jQuery页面加载事件
36.html5是最新版版本的html,增加了像画板、声音、视频、web存储等高级功能,但是太强调语义,导致选择标签困难
css3
盒子的边框
盒子和文字的阴影
渐变
转换、移动、缩放、旋转
过渡、动画都可以做动画
可以使用媒体查询实现响应式网站
缺点:根据不同浏览器处理兼容性,对于有处理工具
37.bootstarp是移动设备优先的UI框架
38.Struts2的执行过程
拦截 判断 寻找 执行 响应
拦截:通过StrutsPrepareAndExecuteFilter拦截
判断:通过ActionMapper判断是否需要寻找Action,如果需要请求交给ActionProxy,ActionProxy通过Configuration Manager范文Struts.xml,找到类
执行:创建ActionInvocations实例,调用action中对应的结果name
响应:通过name知道对应结果集响应浏览器
39.SpringMvC 的原理
①.用户发送请求,被spring前端控制servlet dispatcherServlet捕获
②.dispatcherServlet对请求url进行解析,得到请求资源标识符(Url),然后根据url调用HandMapping获得Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
③.dispatcherServlet根据获取的Handler,选择一个合适的HandlerAdapter。提取Request中的模型数据,填充Handler入参,开始执行Handler(controller),Handler执行完成后,向dispatcherServlet返回一个ModelAndView对象
④.dispatcherServlet根据返回的ModelAndView,选择合适的ViewReSolver(必须是已经注册到Spring容器中的)ViewReSolver
⑤.通过ViewReSolver结合Model和View,来渲染dispatcherServlet将渲染结果返回给客户端。
** 核心控制器捕获请求,查找Handler,执行Handler,选择ViewReSolver,通过ViewReSolver渲染视图并返回
40.Struts2和springMVC的区别
①.核心控制器不同:Struts2是filter SpringMVC 是servlet
②.springMVC快一些,Struts2是基于对象设计,每次请求都会实例一个action,但是springMVC是基于方法
③.管理方式不同:SpringMVC 提供了注解方式进行管理,各种功能的注解都比较全,使用简单,而Struts2需要采用xml配置参数来管理
④.参数传递:Struts2通过ValueStack继续传递和赋值,而springMVC是通过方法的参数来传递
⑤.intercepter的实现机制:Struts有自己的intercepter机制,但是SpringMVC用的是独立AOP方式。,这样springmvc更加简洁,开发效率更加高效
⑥.ajax返回方式是springMVC是通过注解的方式@responseBody 但是Struts使用插件的方式进行处理
41.Spring 两大核心,spring是j2EE应用程序框架
①.IOC(控制反转)原理:工厂模式+反射+配置文件
②.AOP(面向切面编程) 原理:动态代理在执行前后或者出现异常执行相关逻辑
42.事务传播特性
Required 存在一个事务则支持当前事务,如果没有事务则开启
supports 存在事务,支持当前事务,如果没有则非实物的执行
mandatory 必要的 存在一个事务则支持当前事务,如果没有事务则抛出异常
required_new 总是开启新事物 存在一个事务则将这个存在的事务挂起
NOT_SUpport 总是非事务执行,并挂起任何存在的事务
Never 总是非事务执行,如果存在抛出异常
Nested 嵌套 如果有就嵌套,没有就开启事务
43.spring事务隔离级别
44.ORM 对象关系映射
ORM框架:为了解决面对对象与关系数据库存在相互不匹配的现象的技术。
MyBatis hibernate
45.MyBatis hibernate的区别
MyBatis 好处:屏蔽jdbc api的底层访问细节,将sql和java代码分离,提供了将结果集自动化封装称为实体对象和对象的集合的功能。queryForlist返回对象集合,用queryForObject返回单个对象,提供了自动将实体对象属性传递给sql语句的参数。
hibernate:hibernate是一个全自动的ORM映射工具,他可以自动生成sql语句并执行返回结果集。
差异:hibernate不能处理复杂的sql
46.hibernate的映射状态
瞬时状态
持久化状态
游离状态
删除状态
47.hibernate缓存
目的:为提供访问速度,变数据库访问为内存访问
一级缓存是session级别,内置不能被卸载
二级缓存是sessionfactory是的,从应用到应用介绍有效果,是可选的,默认没有,需要手动开启
二级缓存适用数据:很少被修改 经常查询 不重要
没有解决分布式缓存,默认不支持,使用redis
48.webservice是soa(面向服务编程)的架构,她不依赖于语言,不依赖于平台,通过internet进行http协议的网络应用间交互。
49.activity 是业务流程管理和工作流系统,核心是超快速、稳定的流程引擎易,易于spring结合。
高级部分
50.查找sql慢查询用explain
51.数据库优化
1.设计遵循第三范式
52.选择存储引擎
MyISAM:对事物要求不高,以查询和插入为主,不支持外键,支持全文索引,支持表锁
innodb:对事务要求高,建议使用,支持外键,不支持全文索引、支持行锁
memory:数据变化频繁,不需要入库,同时频繁查询与修改,速度极快
53.用索引查询变快 但是增删查会变慢
复合索引,不使用第一部分不会使用索引
查询“%kkk%” 不会用到索引
要求所有字段必须使用都必须单独使用时能使用索引
mysql判断,全表查询比索引快是使用索引
54分表
水平分表 按照行数据分表
垂直分表 按照列分表
水平分表策略:
按照时间,具有很强的时效性
按照id范围
通过hash分表,通过一定的算法进行分表
55.优化小技巧
ddl优化:①第一步 插入之前删除key,第二部 批量插入 第三部 恢复key
②关闭唯一校验③变多次提交为一次
dml: 批量插入
dql:order by 多用索引排序 group by中去掉order by null 子查询
56.redis保存对象
json字符串:需要手动转为json字符串,作为字符串存储
字节:需要转换为字节存储,数据量大时使用
转载:https://www.cnblogs.com/LiLiliang/p/9986172.html
推荐内容:
Java和.NET(C#)的开发用到的技术对比总结
Java常考面试题
JAVA框架面试题
Java基础面试题(1)
Java面试通关秘籍汇总集
2年Java开发工作经验面试总结
40个Java多线程面试问题
Java 中的几种线程池,你之前用对了吗
虽然不抱希望但也愿.Net和Java之争暂得平息
阿里面试回来,想和Java程序员谈一谈