Jave基础:
Q:说一下抽象类和接口的区别
A:接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的
Q:说一下OOP的基本特性?
A:OOP是由抽象、继承、封装、多态;
封装:就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系;
继承:子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
怎么实现:可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
多态:多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,多态性增强了软件的灵活性。
怎么实现:实现多态,有二种方式,覆盖(Overriding),重载(Overloading)。
Overriding:它是父类与子类之间多态性的一种表现.
Overloading:一个类中多态性的一种表现.
override(重写,覆盖)
(1)方法名、参数、返回值相同。
(2)子类方法不能缩小父类方法的访问权限。
(3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
(4)存在于父类和子类之间。
(5)方法被定义为final不能被重写。
(6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload(重载,过载)
(1)参数类型、个数、顺序至少有一个不相同。
(2)不能重载只有返回值不同的方法名。
(3)针对于一个类而言。
(4)不能通过访问权限、返回类型、抛出的异常进行重载;
(5)方法的异常类型和数目不会对重载造成影响;
Q:说一下I/O流、TCP/UDP编程、多线程。
I/O流分为字节流和字符流两大类。
怎么实现:字节流是指数据传输已字节的形式来实现,字符流是指数据传输以字符的形式实现。
我们拷贝文件不确定是包含字符流,有可能包含字节流(图片、声音、视频等),为考虑通用性要使用字节流。
TCP/UDP编程:TCP/UDP是传输层主要的协议。
TCP: 一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。
特点 : (1)面向连接
(2) 点到点的通信
(3) 高可靠性:三次握手
(4)占用系统资源多、效率低
在哪用到了:HTTP
UDP: 一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
特点: (1)非面向连接,传输不可靠,可能丢失
(2) 发送不管对方是否准备好,接收方收到也不确认
(3) 可以广播发送
(4) 非常简单的协议,开销小
在哪用到了:DNS
谈谈你对多线程的理解:
线程Thread
1.进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。
2.线程又被称为轻量级进程(lightweight process)
3. 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程
线程特点 : 轻量级进程 、独立调度的基本单位 、可并发执行 、共享进程资源。
线程的创建:
1.继承Thread类,并重写run()方法;
2.实现Runnable接口,并是实现run()方法;【常用】
3.实现Callable接口(优点:可以有返回值,支持泛型的返回值 ,可以抛出异常 ;缺点:繁琐)
线程同步:也称为并发,是多个线程访问同一份资源,确保资源安全(线程安全)。
实现线程安全的方法是加锁(synchronized关键字)
Lock和synchronized的区别
1.Lock是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是隐式锁
2.Lock只有代码块锁,synchronized有代码块锁和方法锁
3.使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)
死锁 :当两个线程相互等待对方释放“锁”时就会发生死锁;出现死锁后,不会出现异常,不会出 现提示,只是所有的线程都处于阻塞状态,无法继续 ;多线程编程时应该注意避免死锁的发生。
线程池的好处 :
1.提高响应速度(减少了创建新线程的时间)
2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
3.提高线程的可管理性:避免线程无限制创建、从而销耗系统资源,降低系统稳定性,甚至内 存 溢出或者CPU耗尽
线程池的创建:一般情况下会使用Executors创建线程池,目前不推荐,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor方式,这样的处理方式可以更加明确线程池的运行规则,规避资源耗尽的风险。(使用谷歌的guava包来创建)
Q:Java中NIO、BIO、AIO分别是什么?
A:BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
Q:说一下反射
A:在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
在哪用到过:Class clazz=Class.forName(“类的地址”);用来获取一个这个类的class对象
web项目中servlet的查找就用到了反射(web.xml中servlet路径的配置)
Q:hashmap的原理
A:HashMap采用数组散列+链表的方式来储存键值对。主要的储存依赖hash值的计算,因此选用String,Integer这些类做为键会提高HashMap的效率,因为String等对象一旦放入Map中就不会发生变化,因此其hash值也不会发生改变,获取对象的速度将大大提高。
hashmap扩容:如果HashMap的大小超过了负载因子定义的容量,HashMap将会创建一个原来两倍的bucket数组,将原来的对象放入新的数组中,扩大hashMap的容量。(负载因子初始0.75)在JDK 8中,如果hash相同的key的数量大于8,会使用平衡树代替链表。(jdk1.8的新特性红黑树)(hash算法)
Q:异常怎么捕获?异常最后有谁处理?
A:异常由Try-catch捕获,由catch来处理。
throw抛出的异常最终由jvm来处理
Q:谈一谈你对事务的理解
A:事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一 个不可分割的工作单位。
事务必须要满足4大特征:
1.原子性:表示事务内操作不可分割,要么都成功,要么都失败。
2.一致性:要么都成功,要么都失败,后面的失败了要对前面的操作进行回滚。
3.隔离性:一个事务开始后,不能手其他事务的干扰。
4.持久性/持续性:表示食物开始了,就不能终止。
Q:xml解析方式
A :XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。
我们公司用的是DOM4J解析XML,DOM4j是一个Java的XML API,类似于jdom,用来读写XML文件的。他的优点是:①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。②支持XPath。③有很好的性能。缺点是:大量使用了接口,API较为复杂。
Q:乐观锁和悲观锁的区别,乐观锁用于什么情况
A:悲观锁,就是总觉得有刁民想害朕,每次访问数据的时候都觉得会有别人修改它,所以每次拿数据时都会上锁,确保在自己使用的过程中不会被他人访问。乐观锁就是很单纯,心态好,所以每次拿数据的时候都不会上锁,只是在更新数据的时候去判断该数据是否被别人修改过。
大多数的关系数据库写入操作都是基于悲观锁,缺点在于如果持有锁的客户端运行的很慢,那么等待解锁的客户端被阻塞的时间就越长。Redis的事务是基于乐观锁的机制,不会在执行WATCH命令时对数据进行加锁,只是会在数据已经被其他客户端抢先修改了的情况下,通知执行WATCH命令的客户端。乐观锁适用于读多写少的情况,因为在写操作比较频繁的时候,会不断地retry,从而降低性能。
J2EE部分:
Q:servlet的生命周期
A :见下图
Q:说一下你对MVC的理解
A:MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给 控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。
如在项目中要对应MVC的话:View 对应项目中Jsp,Controler对应Action(控制层),Model 对应service+dao层的业务逻辑和持久层的操作。
Q:spring boot的使用
A: 1、新建一个Maven Project;
2、需要在pom.xml文件添加相应的依赖
<!-spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。 -->
org.springframework.boot
spring-boot-starter-parent
1.4.1.RELEASE
java.version 指定jdk版本号:
<java.version>1.8</java.version>
添加spring-boot-starter-web依赖
org.springframework.boot
spring-boot-starter-web
3、新建一个Controller类
4、新建启动类(App – Main方法)
5、测试代码
Spring Boot 集成Mybatis:
1、新建一个新的Maven Project;
2、需要在pom.xml文件添加相应的依赖,
比如:mysql驱动;
PageHelper分页插件,需要版本号;
3、编写启动类,大部分和之前的代码是一样的,需要的注意的是:
需要添加一个注解@MapperScan --指定MyBatis持久类的位置;
4、编写一个测试的实体类Demo;
5、编写一个DemoMapper,使用@Select和@Save进行数据库操作;
使用@Options配置返回的主键信息;
6、编写DemoService;
7、编写DemoController;
8、添加分页配置信息,需要添加一个MyBatisConfiguration;
9、使用PageHelper.startPage(pageNum,pageSize)进行分页;
Q:讲一讲spring IOC和AOP
A:IOC的核心是依赖反转,将创建对象和对象之间的依赖管理交给IOC容器来做,完成对象之间的解耦(工厂模式)
AOP主要利用代理模式,把许多接口都要用的又和接口本身主要的业务逻辑无关的部分抽出来,写成一个切面,单独维护,比如权限验证。这样可以使接口符合"单一职责原则",只关注业务逻辑,也提高了代码的重要性。
Q:spring中用到的设计模式有哪些?
A:工厂模式:IOC容器;代理模式:AOP(面向切片编程)
策略模式:在String采取动态代理时,根据代理的类有无实现接口,有JDK和CGLIB两种代理方式,就是采用策略模式来实现的。
单例模式:默认情况下spring中的bean只存在一个实例。
Q:AOP的应用场景
A:权限,日志,处理异常,事务等等,个人理解就是把许多接口都要用的又和接口本身主要的业务逻辑无关的部分抽出来,写成一个切面,单独维护,比如权限验证。这样可以使接口符合“单一职责原则”,只关注主要的业务逻辑,也提高了代码的重用性。
设计模式
Q:谈一谈你对单例模式了解
A:单例模式的定义: 确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。
单例模式的实现:在单线程环境下,单例模式根据实例化对象时机的不同,有两种经典的实现:一种是 饿汉式单例(立即加载),一种是 懒汉式单例(延迟加载)。饿汉式单例在单例类被加载时候,就实例化一个对象并交给自己的引用;而懒汉式单例只有在真正使用的时候才会实例化一个对象并交给自己的引用。
算法
Q:什么是二叉树?
A:二叉树由节点的有限集合构成。这个集合或者为空集,或者为由一个根节点(root)和两棵树相互相交,分别称为这个根的左子树(left subtree)和右子树(right subtree)的二叉树组成的集合。
Redis相关
Q:Redis提供哪几种数据结构
A:一共有5种,字符串,散列,列表,集合,有序集合。
Q:Redis支持集群么,从哪个版本开始支持集群的
A:支持集群,从3.0版本开始
Q:Redis集群中,如何将一个对象映射到对应的缓存服务器
A:一般就是hash%N,就是用对象的hash值对缓存服务器的个数取余
Q:项目中具体是怎样使用Redis的(暂时未用到)
A:我是主要做权限控制时用到了Redis,将用户Id和权限Code拼接在一起作为一个key,放到 Redis的集合中,在验证某一用户是否有指定权限时,只需验证集合中是否有用户Id和权限Code拼接的key即可
数据库
Q:说一下范式有哪些
A:第一范式(1NF):确保每一列的原子性,如果每列是都不可再分的最小单位,即满足第一范式。
第二范式(2NF):满足了第一范式并且确保每列都与主键相关,既满足第二范式。
第三范式(3NF):满足了第二范式,并且确保每列都与主键直接相关,而不是间接相关,则满足第三范式。
Q:varchar与char的区别
A:varchar往往用来保存可变长度的字符串。
char采用的是固定长度的存储方式。