1.Java基础方面
1.面向对象的三大特征,详细介绍。
1.封装
- 封装就是隐藏对象的属性和实现细节,只对外提供接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合形成“类”,其中属性和方法都是类的成员。
- 封装的目的是增强安全性和简化编程,提高代码的复用性。使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的权限来使用类的成员即可。
2.继承
- 子类继承父类
- 子类可以拥有父类的非私有的属性和方法
- 并且子类拥有扩展父类的能力,可以在自己的类中写一些父类没有的方法和属性
- 构造方法不能被继承
- java中只存在单继承,接口的存在代替了多继承
- 如果一个类没有显式的继承,那么隐式的继承Object
3.多态
- 同一操作作用于不同的对象,可以有不同的解释,产生不同的结果,这就是多态性,简单的说就是:基类的引用指向子类的对象。就是对象的多种形态。
- 继承是多态的基础。
- 关于重载是不是多态,网上说法都不太一样,之前我也一直以为重载也是多态的表现,但也有很多人说不是,大家可以查阅资料,在面试时说明自己的观点即可,目前我搜集了全网的资料,都没有一个明确的答案,如果有人知道,欢迎评论!
4.五大基本原则
- 单一职责原则
- 一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
- 开放封闭原则
- 对象或者实体应该对外扩展开放,对修改封闭。
- 里氏替换原则
- 在对象x为类型T时q(x)成立,那么当S是T的子类时,对象y为类型S时q(y)也应该成立。(即对父类的调用同样适用于子类)
- 依赖倒置原则
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象,具体实现应该依赖于对象,而不是抽象依赖与实现。
- 接口隔离原则
- 不应该强迫客户端实现一个它用不上的接口,或者说客户端不应该被迫依赖他们不使用的方法,使用多个专门的接口比使用单个接口好的多。
2.Java中的数据类型
1.基本数据类型
- 包括:byte, short, int, long, float, double, char, boolean
- 所占内存空间:1,2,4,8,4,8,2,1,关于它们的范围自行查阅常用的即可。
2.引用数据类型
- 包括:类,接口,数组
3.排序算法了解哪些?
1.冒泡排序
2.快速排序
3.选择排序
4.插入排序
5.归并排序
6.基数排序
7.希尔排序
4.HashMap和HashTable的区别?
1.相同点
- 底层实现都是哈希表,存储方式都是键值对形式
2.不同点
- 线程安全方面:
- HashMap不是线程安全的,HashTable是线程安全的,因为操作其的方法都被synchronized关键字修饰。
- 扩容机制方面
- HashMap扩容时以2倍于原来的大小去扩容,而HashTable扩容是2倍 + 1
- 存放值
- HashMap,HashTable的键不能重复,值可以重复
- 但是,HashMap的键和值都允许为null,HashTable的键和值都不允许为null
- 继承类不同
- HashMap继承的是AbstractMap类,而HashTable继承的是Dictionary类
5.常见的运行时异常有哪些?
- 下标越界异常IndexOutOfBoundsException / ArrayIndexOutOfBoundsException
- 类型转换异常ClassCastException
- 类没有找到异常ClassNotFoundException
- 算术异常ArithmeticException
- 空指针异常NullPointerException
- 数字格式异常NumberFormatException
6.抽象类和接口的区别?
- 他们都不能被实例化,接口的实现类和抽象类的子类只有在实现了接口中的方法和抽象类中的方法才能实例化。
- 关键字:抽象类为abstract,接口是interface
- 接口中都是抽象方法,而抽象类中可以没有抽象方法
- 一个类可以实现多个接口,但只能继承一个抽象类
- 接口中的方法默认都是public,而抽象类中的方法可以是public,protected,和缺省这些修饰符修饰
- 从设计层面来说,抽象类是对类的抽象,是一种模板的设计,而接口是对行为的抽象,是一种行为的规范。
7.jsp和servlet的区别?
- jsp是servlet技术的扩展,本质上就是servlet,但是两者的创建方式不一样
- Servlet完全是java程序代码组成的,擅长于流程控制和事务处理,通过servlet来生成动态网页很不直观,于是jsp就出现了
- jsp是有html代码和jsp标签组成,可以方便的编写动态网页
8.jsp中的九大内置对象
- 1.out
- 2.request
- 3.response
- 4.session
- 5.page
- 6.application
- 7.pageContext
- 8.config
- 9.exception
2.数据库方面
1.学过哪些数据库?mysql和oracle的区别?
- 1.对事务的提交
- mysql中默认对事务进行提交,而oracle默认不提交,需要程序员自己去提交,commit
- 2.value,values
- 在mysql中,没有value的写法,在oracle中则是二者都可以实现,只不过在数据量越大时,value的执行更快
- 3.分页查询
- mysql中使用limit关键字进行分页查询,而oracle需要用到伪列ROWNUM和嵌套查询实现
- 4.类型和成本
- mysql是一个轻量级的关系型数据库,是开源免费的
- oracle是一个重量级的对象关系型数据库,是收费的
- 事务隔离级别
- mysql中默认的事务隔离级别为不可重复读,而oracle中默认的事务隔离级别为已提交读
2.怎么优化查询语句?索引的相关知识
- 利用索引
- 联合索引只会在a,ab,abc情况下使用到
- 索引的失效情景,网上有很多,这里就不列举了
- 索引会在什么条件下用到
- where后
- order by后
- group by on后
3.数据库事务以及隔离级别
- 事务的四大特性:
- 原子性
- 一致性
- 隔离性
- 持续性
- 隔离级别:
- 未提交读
- 已提交读
- 可重复读
- 串行化读
4.数据库连接池用过没有?为什么要使用数据库连接池?
- druid连接池
- 好处:
- 连接复用:避免了之前频繁的进行创建和销毁的过程引起的系统开销
- 更快的系统响应速度,在数据库连接池初始化时,其中就已经包含了一些已经创建好的数据库连接
- 新的资源分配手段,对于多应用共享一个数据库的系统而言,可以在应用层通过对数据库连接的配置,实现对数据库的连接
- 统一的连接管理,避免数据库连接泄漏
5.delete和truncate的区别?
-
truncate是不可以进行事务回滚的(整表数据,ddl语句,隐式提交),而delete可以(一行一行删除)
-
truncate删除后不会保存索引,即id从0开始,delete不会删除索引
-
delete删除可以返回影响行数,delete可以按条件删除表中数据,而truncate不能返回影响行数,并且不支持按条件删除
-
两者都是只删除数据,不删除表结构
-
ps:drop是直接删除表,并且不能回滚
6.mysql和oracle在分页查询时有什么不一样
- mysql是使用limit关键字,比如select * from table where salary > 10000 limit 0, 3,起始行为1,显示三条数据
- oracle中是通过使用ROWNUM和嵌套查询来实现的,比如:select * from (select A.*, ROWNUM r from(select * from B) A) where r between 1 and 10 ,可以显示1到10条记录
3.Spring方面
1.Spring的IOC和DI,以及AOP的理解?
- IOC
- 控制反转,从字面的意思理解就是控制权的反转,那么是怎么反转的呢?
- 我们回想,如果类A中对类B有依赖关系,需要用到B中的一些方法,那么我们是怎么做的,不用说,我们会在A中去new一个B的对象,然后通过该实例调用方法,这时候两个对象的耦合度就很高,不利于后期的维护,所以这时候,我们是主动new了一个B对象,因此控制权在我们这,现在呢?
- 我们不这么干,我们将我们设计好的B类,去交给一个容器去负责管理,我们要用的时候,他们再给我们,这样就减少了耦合度,更方便于维护,在这个过程中,我们没有去控制new B的过程,而是让容器负责,这种权力上的转换,就称为控制反转。这个概念非常的抽象,所以之后引入DI的概念帮助我们来理解
- DI:
- 依赖注入:在上述过程中,我们要用对象时,spring容器帮我们完成实例化的工作,通过依赖注入的方式,拿到我们想要的东西。现在最常用的注入方式就是属性注入,以及构造方法注入。
- 这样设计有什么好处吗?
- 解耦,使用者不必关心所用对象的实现细节。方便后期的维护。
- AOP
- 是oop的延伸,名为面向切面编程,它是将那些那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
- 动态代理:
- 使用jdk动态代理,需要实现接口,需要用到proxy类(newProxyInstance)和invocationHandler(invoke)类
- 使用CGLIB实现动态代理
2.SpringMVC的工作流程
- 1.用户发送请求给前端控制器DispatcherServlet
- 2.DispatcherServlet接收到请求之后调用处理器映射器HandlerMapping
- 3.处理器映射器根据请求的url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet
- 4.DispatcherServlet根据处理器Handler获取处理器适配器(HandlerAdapter),并执行一系列的操作,如:参数封装,数据格式转换,数据验证等操作
- 5.执行处理器Handler
- 6.处理器执行完成返回ModelAndView
- 7.HandlerAdapter将ModelAndView返回给DispatcherServlet
- 8.DispatcherServlet将ModelAndView传给视图解析器ViewReslover
- 9.解析后返回具体view
- 10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)
- 11.DispatcherServlet响应用户
3.SpringMVC中的常用注解?
- @Controller,控制器
- @RequestMapping,请求处理地址映射
- @ResponseBody,返回的对象
- @RequestParam,获取参数
- @Autowired和@Resource,bean的注入
- @ModelAttribute和@SessionAttributes,该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法中,可以把这个@ModelAttribute特性,应用在BaseController中,@SessionAttribute即将值放到session作用域中,写在class上面
- @PathVariable,取出uri模板中的变量作为参数
- @Component,当不知道一些类归到哪个层时使用
- @Repository,用于注解dao层
4.项目方面(自由发挥)
1.数据库表怎么设计的?有哪些表?
- 明确需求
- 根据需求设计出所有的功能
- 根据功能中所用到的东西,进行模型的建立,有很多这种软件,navicat就可以
- 建完之后找对应的关系,联合起来
2.项目中遇到过什么技术难点?怎么解决的?有哪些是你难忘的?
- 自由发挥,要多准备一些
5.多线程
1.wait()和sleep()的区别?
- wait是Object类下方法,sleep是Thread类下的方法
- 二者都可以实现线程的暂停,只不过,sleep是没有释放锁和资源的,而wait是释放的
- sleep需要捕获异常,wait不需要
- wait只能在同步控制块或者同步控制方法中使用,而sleep都可以
2.run()和start()的区别?
- run是Thread中的一个普通方法,调用它并不会启动多线程,而是会在主线程中运行,程序中依然只有主线程只一个线程,还是要等待run方法执行完毕之后才可继续执行下面的代码。
- start方法可以启动多线程,这时无需等待run方法代码执行完毕而直接继续执行下面的代码。在等到cpu分配的时间片时就去执行run方法
3.创建线程方法?
- 继承Thread类,重写run方法
- 实现Runnable接口,实现run方法
- 通过线程池创建
4.了解线程池吗?线程池的好处有哪些?
- 线程的创建和销毁及调度都是很麻烦的,需要占用很多的系统资源,实际上像很多的框架底层都用到了线程池
- 线程池是帮助我们管理线程的工具,它维护了多个线程,可以降低资源的消耗,提高系统的性能,提供附加的功能
- 并且通过线程池,我们开发人员可以更好的把精力放在任务代码上,而不去管线程是如何执行的,实现任务提交和执行的解耦。
- 线程池是一种池化的技术,类似的还有数据库连接池等
- 池化的思想主要时为了减少每次获取和结束时资源的消耗,提高对资源的利用率
- 常用的线程池:
- ThreadPoolExecuter 普通
- ScheduledThreadPoolExecutor 可以定时执行
5.volatile关键字
- 首先,如果一个共享变量,如类的成员变量,类的静态成员变量被volatile修饰之后,那么就具备了两层语义
- 1.保证了不用线程之间对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对于其他线程来说都是立即可见的
- 2.禁止进行指令的重排序(通过内存屏障实现)
6.其他
1.maven的打包方式
- mvn clean package
2.Spring使用了哪些设计模式?
- 单例模式
- 工厂模式
- 代理模式
- 观察者模式
- 适配器模式
- 策略模式
- 模板方法模式
…
3.为这次面试做了哪些准备?
- 自由发挥,如实说就好
4.职业规划
- 自由发挥,这个确实要好好想想!
5.项目有什么出彩的地方,有什么技术难点,详细说一下?
6.目前遇到的最大的困难是什么?你是怎么解决的?
7.你是怎么看待这个行业加班的情况的?
8.对公司的了解?如果想进公司,最好多关注一下公司的动态。
7.常用的一些linux命令
- ls显示文件或目录
- ls -l :列出文件详细信息
- ls -a:列出当前目录下所有文件及目录
- mkdir 创建目录
- p 创建目录,若没有父目录,那么就创建p
- cd 切换目录
- touch 创建空文件
- echo 创建带有内容的文件
- cat 查看文件内容
- cp 拷贝
- mv 移动或重命名
- rm 删除文件
- find 在文件系统中搜索某文件
- wc 统计文本中行数
- rmdir 删除空目录
- pwd 显示当前目录
- stat 显示指定文件的详细信息
- who 显示在线登录用户
- hostname 显示主机名
- ifconfig 查看网络情况
- ping 测试网络连通
- netstat 显示网络状态信息
- clear 清屏
- kill 杀死进程
- tar 打包压缩
- shutdown 关机
- reboot 重启
- sudo
- vim 三种模式:命令模式,插入模式,编辑模式,使用esc或者i或者:来切换模式
- q 退出
- q!强制退出
- wq 保存并退出
- yum 命令,下载各种软件包