2019年面试遇到的问题总结(有点乱)

数据库结构

接口怎么定义 

接口规范是什么?
首先接口分为四部分:方法、uri、请求参数、返回参数
1、方法:新增(post) 修改(put) 删除(delete) 获取(get)
2、uri:以/a开头,如果需要登录才能调用的接口(如新增、修改;前台的用户个人信息,资金信息等)后面需要加/u,即:/a/u;中间一般放表名或者能表达这个接口的单词;get方法,如果是后台通过搜索查询列表,那么以/search结尾,如果是前台的查询列表,以/list结尾;url参数就不说了。
3、请求参数和返回参数,都分为5列:字段、说明、类型、备注、是否必填
字段是类的属性;说明是中文释义;类型是属性类型,只有String、Number、Object、Array四种类型;备注是一些解释,或者可以写一下例子,比如负责json结构的情况,最好写上例子,好让前端能更好理解;是否必填是字段的是否必填。
4、返回参数结构有几种情况:1、如果只返回接口调用成功还是失败(如新增、删除、修改等),则只有一个结构体:code和message两个参数;2、如果要返回某些参数,则有两个结构体:1是code/mesage/data,2是data里写返回的参数,data是object类型;3、如果要返回列表,那么有三个结构体,1是code/mesage/data,data是object,里面放置page/size/total/totalPage/list 5个参数,其中list是Arrary类型,list里放object,object里是具体的参数。

tail -f /var/log/messages

IO

数据库  存储过程 

4

Spring

Spring是一个轻量级的IoC和AOP容器框架。

spring属于低侵入式设计,代码的污染极低 方便解耦,简化开发

AOP是面向切面的编程,将程序中的交叉业务逻辑,封装成一个切面,然后注入目标对象;是一种编程思想 支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理

IOC就是控制反转,是指创建对象的控制权的转移Spring管理

Spring的IOC有三种方式注入
1、根据属性注入—set方法注入
2、根据构造方法注入
3、根据注解注入

请解释Spring Bean的生命周期?

 首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;

@Autowired 注解 自动装配  工厂模式  单例模式

 

 

@Autowired@Resource的区别   

默认情况下必须要求依赖对象必须存在

@Autowired默认按类型装配默认情况下必须要求依赖对象必须存在

@Resource,默认安装名称进行装配,名称可以通过name属性进行指定

@Autowired        属于Spring的注解 

@Resource   不属于Spring的注解

 

 

程式事务管理②声明式事务管理

spring配置事务JDBC事务

声明式事务,切点一般是扫描service层实现类,通过方法名匹配配置传播特性,决定哪些方法上加事务,哪些不需要事物。

@Transactional注解方式配置AOP事务  使用Spring的事务管理

!-- 1.声明事务管理组件:定义具体平台事务管理器

   2.开启事务组件注解扫描:注册事务注解处理器 如果方法发生运行期错误unchecked(RuntimeException),事务会进行回滚

通过xml配置AOP事务

<!-- 1.声明事务管理组件:定义具体平台事务管理器 -->

2.基于xml配置的声明事务范围及类型  定义通知, 通知中要处理的就是事务

配置具体方法事务属性              事务隔离级别 事务超时时间 事务传播行为

<!-- 3.配置aop -->切入点配置切面指定扫描包

 

 

Spring配置

applicationContext.xml

<!-- 配置数据源 --> 

<!-- 配置事务管理器 -->

<!-- 配置业务bean -->

  <!-- 使用XML来使用事务管理-->  

 <!-- 配置一个切面,和需要拦截的类和方法 -->

<!-- 配置一个事务通知 -->

 

架构配置 spring

web.xml中配置servlet及其映射关系  
  1. 加载spring容器  配置一个监听器
  2. 配置前端控制器  springmvc加载的配置文件 适配器、处理映射器等
  3. DispatcherServlet进行解析   post乱码过滤器

 

 

架构配置 pringMVC

  1. 配置视图解析器  使用前缀和后缀
  2. 使用组件扫描的方式可以一次扫描多个Controller
  3. 配置注解的处理器映射器和处理器适配器
  4. 定义拦截器  拦截所以路径请求
  5. 配置上传文件数据解析器
  6. 定义全局异常处理器
 
applicationContext-dao.xml配置文件
  1. 加载数据库连接的资源文件
  2. 配置数据源   dbcp数据库连接池
  3. 配置sqlSessionFactory   数据库连接池  加载Mybist配置文件
  4. 配置mapper扫描器  扫描路径
  5. 映射mapper映射文件配置   扫描批量加载映射文件配置

 

SpringMVC

轻量级Web框架

 

https://i-blog.csdnimg.cn/blog_migrate/67d51b5c6ceeed923e26d7efa8b72e07.png

 

(1)转发:在返回值前面加"forward:",譬"forward:user.do?name=method4"

(2)重定向:在返回值前面加"redirect:",譬"redirect:http://www.baidu.com"

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。

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

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

 

SpringMvc里面拦截器 实现HandlerInterceptor接口

 

 

 

Mybatis

一个半ORM(对象关系映射)框架它内部封装了JDBC,开发时只需要关注SQL语句本身

SQL写在XML里 同意管理sql语句 灵活度高  各种数据库兼容

通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

通常一个Xml映射文件,都会写一个Dao接口与之对应Dao接口即Mapper接口

  Mybatis使用RowBounds对象进行分页

 <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>

MyBatis实现一对一

通过在resultMap里面配置association节点配置一对一的类

MyBatis实现一对多

通过在resultMap里面的collection节点配置一对多的类

 

Redis

Redis 是一个基于内存的高性能key-value数据库。

 基于内存查询速度快

支持丰富数据类型,支持stringlistsetsorted sethash 

可用于缓存

基于内存储存不能存储海量数据 受到物理磁盘影响 挂机信息就没了所以要做个

 AOF持久化 快照 存在物理磁盘里  也可以搭载集群 主从模式

Redis有过期淘汰机制 保证数据的热度

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

 

 

Rabbitmq

消息队列协议的一种消息队列技术

在分布式系统下具备异步,削峰,负载均衡等一系列高级功能

拥有持久化的机制,进程消息,队列中的信息也可以保存下来

服务间异步通信

 

如果你要确保说写rabbitmq的消息别丢,可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每个消息id的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。

Spring boot

spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用

快速创建独立运行的spring项目与主流框架集成 
-使用嵌入式的servlet容器,应用无需打包成war包 
-starters自动依赖与版本控制 
-大量的自动配置,简化开发,也可修改默认值 

响应式编程webflux

mono: 单一对象 User

Flux:数组列表对象 List<User>

/**  mono Collection

    * 功能描述:根据id找用户

   @GetMapping("find")

   public Mono<User> findByid(final String id){

      return userService.getById(id);

   }

   /** mono Service

    * 功能描述:根据id查找用户

   public Mono<User> getById(final String id){

   returnMono.justOrEmpty(UserService.dataMap.get(id));

   }

/** Flux Collection

    * 功能描述:列表

@GetMapping(value="list",produces=MediaType.APPLICATION_STREAM_JSON_VALUE)

   public Flux<User> list(){

      return userService.list().delayElements(Duration.ofSeconds(2));

   }

/** Flux  Service

    * 功能描述:根据id删除用户

    * @param id

    * @return

    */

   public Mono<User> del(final String id){

      return Mono.justOrEmpty(UserService.dataMap.remove(id));

   }

  

DevTools)模块 热部署工具 无需重新服务器

模板引擎  解析页面

springboot默认读取配置文件为application.properties或者是application.yml

spring-boot-starter-activemq依赖关系

在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration 
会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean

 

根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring

 

springboot常用的starter有哪些 
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持 
spring-boot-starter-data-jpa 数据库支持 
spring-boot-starter-data-redis redis数据库支持 
spring-boot-starter-data-solr solr支持 
mybatis-spring-boot-starter 第三方的mybatis集成starter

 

线程

调用Runnable接口

继承Thread

start()方法被用来启动新创建的线程

 

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量 的值也和预期的是一样的,就是线程安全的

 

 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

Dubbo

分布式服务框架

Dubbo需要四大基本组件:Registry、Monitor、Provider、Consumer。

Dubbo链接超时?因为网路链接受到瓶颈  传输数据超过Dubbo本身上线

dubbo都支持什么协议  

dubbo://(推荐  rmi://    hessian://   http://   webservice:// https://img-blog.csdnimg.cn/img_convert/65efe7f57a9d40408fd12ca997b238bf.png

Zookeeper 作为注册中心

3、Dubbo在安全机制方面是如何解决的 
Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。

1 面试题:Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么? 
可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用

 

Java的方法重载 类中可以创建多个方法,它们具有相同的名字

重写 子类可继承父类中的方法重写父类的方法

 

List,Set都是继承自Collection接口,Map则不是

List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉

3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

 

stringbuffer和stringbuiller区别和应用场景

  StringBuffer:字符串变量  (线程安全) 效率快

  StringBuilder:字符串变量 (非线程安全)  

用于拼接参数

接口可以继承接口。抽象类可以实现(implements)接口

65.接口与抽象类有什么区别?

抽象类有构造方法,接口没有构造方法
抽象类只能单继承,接口可以多继承
抽象类可以有普通方法,接口中的所有方法都是抽象方法
接口的属性都是public static final修饰的,而抽象的不是

 

mysql在指定的一个字段后面添加一个字段

 

举个栗子:alter table inquiry add error_code varchar(3) after add_time;

说明:alter table + 表名 + add + 要添加的字段 字段类型 +  after  + 要跟随的字段名

 

 

ArrayList和LinkedList区别

 

ArrayList 底层数组结果 查询快增删慢   LinkedList 底层链表结果 查询慢增删快

HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行 非线程安全,效率上可能高于Hashtable

Map适合储存键值对的数据

 

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象

Hashcode冲突解决方法

1.开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
2.再哈希法
3.链地址法(Java hashmap就是这么做的)
4.建立一个公共溢出区

 

 

 

内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现

select * from a_table a inner join b_table bon a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/7b91df0cd0b3a51cad96c3d0387a0978.png

 

 

左连接(左外连接)

 

select * from a_table a left join b_table bon a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/cca0a46e3b531c9c58e0d05094a06418.png

右连接(右外连接)

select * from a_table a right outer join b_table b on a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/3b85bbc6ab154ca2908908bfc700897e.png

 

 

 

 

 

1.重复数据完全一样,使用distinct

  select distinct * from table

 

 

2.id列不同,id类型为int,自增字段,使用聚合函数max或其他

select * from  table where id in(

  select MAX(id)

  FROM table  group by “分组字段”having COUNT(*)>1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 
delete from people 
where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1) 
and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1) 

 

MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持

 

 

支付接口参数 需要

签名  账户  密码  订单号 商品名称  支付类型  总金额    跳转地址  和 回掉地址

 

 

 

https://images2018.cnblogs.com/blog/1120165/201711/1120165-20171124223229656-408723583.png

 

 

 

 

 

 

 

 

一、Java基础

1.JDK 和 JRE 有什么区别?

 

JDK: Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境

JRE: Java Runtime Environment 的简称,Java 运行环境,为 Java 运行提供环境

 

具体来说,JDK 包括 JRE,同时还包含了编译 Java 源码的编译器 javac,还包含了Java程序调试和分析的工具

 

2.== 和 equals 的区别是什么?

equals :基本类型,比较两个值是否相等基本类型一个数字,一个字符  int

== :引用类型,比较的是引用是否相等 引用类型 对象类型name

List集合里的排序比较大小用比较器 Comparator比较俩个值相减

 

使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值

方法:在mapper中指定keyProperty属性

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">

    insert into user(userName,password,comment)

    values(#{userName},#{password},#{comment})

</insert>

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode

 两个obj,如果equals()相等,hashCode()一定相等。
  两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
不对,两个对象的 hashCode()相同,则 equals()不一定为 true

 

4.final 在 java 中有什么作用?

final 修饰类,不能被继承
final 修饰的方法不能被重写

 

  1. java 中操作字符串都有哪些类?它们之间有什么区别?

StringBuffer 和 StringBuilder 可以在原有对象的基础上进行操作,所以经常改变字符串的内容。StringBuffer 是线程安全的,StringBuilder 是非线程安全的,但 StringBuilder 的性能高于 StringBuffer,所以建议多线程下使用StringBuffer,单线程下使用 StringBuilder

 

  1. 如何将字符串反转?
    使用 StringBuffer 的 reverse 方法,或者使用 StringBuilder 的 reverse 方法
  2. 普通类和抽象类有哪些区别?
    普通类不能包含抽象方法,抽象类可以包含抽象方法
  3. 接口和抽象类有什么区别?

接口用 interface 声明、implement 实现;抽象类用 abstract 声明、extends 继承
接口不能由构造函数,而抽象类可以
接口中的方法默认使用 public ,抽象类中的方法可以使用任意修饰符
类可以实现很多接口,类只能继承一个类

10. List、Set、Map 之间的区别是什么?

List储存元素是有序的 可以存重复数据 

Set储存元素是无序的 不可以存重复数据

Map存储键值对的  不可重复

HashSet与HashMap的区别:

HashMap

HashSet

实现了Map接口

实现Set接口

存储键值对

仅存储对象

调用put()向map中添加元素

调用add()方法向Set中添加元素

HashMap使用键(Key)计算Hashcode

HashSet使用成员对象来计算hashcode值,

对于两个对象来说hashcode可能相同,

所以equals()方法用来判断对象的相等性,

如果两个对象不同的话,那么返回false

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象

HashSet较HashMap来说比较慢

 

 

  1. HashMap 和 Hashtable 有什么区别?

Hashtable所有的元素操作都是synchronized修饰的,而HashMap并没有。

HashMap 可以存储null值null建   Hashtable 不能

线程不安全                         线程安全    HashMap 快

Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。

12. 说一下 HashMap 的实现原理?

底层数组链表加红黑树实现的

13. ArrayList 和 LinkedList 的区别是什么?

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

LinkedList底层链表结构  查询慢 增删快

14. 如何实现数组和 List 之间的转换arrayList.toArray(new String[size])

15. 并行和并发有什么区别?

并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。

  同步就是一件事,一件事情一件事的做。
        异步就是,做一件事情,不引响做其他事情。

16. 线程和进程的区别?

一个线程有多个进程

17. 创建线程有哪几种方式?

创建Thread子类

Runnable接口

17.5怎么保证事物的原子性?

 数据库使用锁的方式保证隔离性(也就是最终数据保证了一致性)

 

18. 线程有哪些状态?

创建  就绪 堵塞 死亡 

19. 创建线程池有哪几种方式

newSingleThreadExecutor

创建一个单线程的线程池

newFixedThreadPool

创建固定大小的线程池

newCachedThreadPool

创建一个可缓存的线程池。

newScheduledThreadPool

创建一个大小无限的线程池

 

20. 在 java 程序中怎么保证多线程的运行安全

加同步锁

21. 动态代理是什么?有哪些应用?

当想要给实现了某个接口的类中的方法,加一些额外的处理

动态代理的应用:Spring的AOP,加事务,加权限,加日志。

 

反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

22. 解释一下什么是 aop?

AOP是面向切面的编程,将程序中的交叉业务逻辑,封装成一个切面,然后注入目标对象;是一种编程思想 支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理

23. 解释一下什么是 ioc?

IOC就是控制反转,是指创建对象的控制权的转移Spring管理

Spring的IOC有三种方式注入
1、根据属性注入—set方法注入
2、根据构造方法注入
3、根据注解注入

24.spring几种 bean 的作用域?

Request  session

25. spring 自动装配 bean 有哪些方式

XML中进行显示配置  自动装配

26. spring 事务实现方式有哪些

原子性  一致性  隔离性  持久性

事务的隔离级别  都未提交  都已提交  脏读  幻读 

事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 
事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。

 

27.为什么使用springboot

spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。

28. spring boot 核心配置文件是什么

application (.yml 或者 .properties)  .yml 

29. spring boot 配置文件有哪几种类型?它们有什么区别?

不同“等级” 用冒号隔开
2. 次等级的前面是空格,不能使用制表符(tab)
3. 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着

 

30. rabbitmq 有哪些重要的组件

Exchange: 就是顺丰和韵达。

routingkey: 就是邮件地址的概念.

queue: 就是邮箱接收软件,但是可以接收多个地址的邮件,通过bind实现。

producer: 消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

 

 

 

31. rabbitmq 的消息是怎么发送的

  1.  applicationContext  .getBean方法取消息

 

发送者

1.一个ConnectionFactory连接工厂connectionFactory

2.connectionFactory设置RabbitMQ所在IP等信息

//指定端口  用户名密码

3.通过connectionFactory创建一个连接connection

4.通过connection创建一个频道channel

5.通过channel指定一个队列  发送的消息

6.channel向队列中添加消息,第一个参数是转发器,使用空的转发器(默认的转发器,类型是direct

//7.关闭频道 

8.关闭连接

接收者

        1. 一个ConnectionFactory连接工厂connectionFactory
        2. 2.通过connectionFactory设置RabbitMQ所在IP等信息
        3. 3.通过connectionFactory创建一个连接connection
        4. 4.通过connection创建一个频道channel
        5. 5.通过channel指定队列
        6. 6.创建一个消费者队列consumer,并指定channel
        7. channel指定消费者
        8. consumer中获取队列中的消息,nextDelivery是一个阻塞方法,如果队列中无内容,则等待

项目部署服务器上步骤

1打war

2连接到Linux服务器

3copy空的Tomcat项目到linux服务器中,改端口,还要测试是否已经有了jdk等Tomcat运行的基本服务,启动Tomcat看能不能成功

4war包拖动到右边tomcat的webapp目录下

5点击执行命令窗口,运行命令./startup.sh 启动Tomcat服务器

6关闭Tomcat服务器的命令为./shutdown.sh

查看启动的服务有多少个,可以使用命令ps -ef|grep tomcat

  1. ps aux # 查看系统所有的进程数据
  2. ps ax # 查看不与terminal有关的所有进程
  3. ps -lA # 查看系统所有的进程数据
  4. ps axjf # 查看连同一部分进程树状态

 

 

 

 

 

. hibernate是全自动,而mybatis是半自动

hibernate数据库移植性远大于mybatis

sql直接优化上,mybatis要比hibernate方便很多

易于上手和掌握。

2. sql写在xml里,便于统一管理和优化

sql依赖于数据库,导致数据库移植性差。

 

 

RPCHTTP的区别?

1.RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议

2. 同步和异步的区别。

 

ajax

 

$(function(){

    $('#send').click(function(){

         $.ajax({

             type: "GET",

             url: "test.json",

             data: {username:$("#username").val(), content:$("#content").val()},

             dataType: "json",

             success: function(data){

                         $('#resText').empty();   //清空resText里面的所有内容

                         var html = '';

                         $.each(data, function(commentIndex, comment){

                               html += '<div class="comment"><h6>' + comment['username']

                                         + ':</h6><p class="para"' + comment['content']

                                         + '</p></div>';

                         });

                         $('#resText').html(html);

                      }

         });

    });

});

 

 

代理模式:为其他对象提供一个代理以便控制这个对象的访问。

单例模式:某个类只能有一个实例,提供一个全局的访问点。

工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。

适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

 

 

Struts2的工作原理

 

  1. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
  2. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
  3. 询问ActionMapper来决定这个请求是否需要调用某个Action
  4. 把请求的处理交给ActionProxy
  5. 询问框架的配置文件,找到需要调用的Action类;
  6. ActionProxy创建一个ActionInvocation的实例。
  7. 在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

 

Hibernate入门这一篇就够了

配置文件

<!-- 1. 数据库连接配置 -->

<!-- 2.2 格式化sql -->

<!--3. 加载所有映射-->

 

//创建对象

//创建Session工厂对象

//开启事务

//持久化操作

//提交事务

//关闭Session

 

 

字符流与字节流的区别

  • 字节流默认不使用缓冲区;字符流使用缓冲区。

字节流通常用于处理二进制数据不支持直接写入或读取

字符流通常处理文本数据,它支持写入及读取

 

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

 

 

生产者

 

//获取连接

//从连接中获取一个通道

//声明交换机

//发送消息

 

 

 

消费者

//获取连接

//从连接中获取一个通道

//声明交换机

//声明队列

//将队列绑定到交换机

//定义消费者

//当消息到达时执行回调方法

//设置手动应答

//监听队列

 

 

 

3.https 协议需要到ca申请证书,http不需要。

4.http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

get是从服务器上获取数据,post是向服务器传送数据。

get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式

 

HashSet如何实现去重:

* 是通过调用元素内部的hashCode和equals方法实现去重,首先调用hashCode方法,比较两个元素的哈希值,如果哈希值不同,直接

* 认为是两个对象,停止比较。如果哈希值相同,再去调用equals方法,返回true,认为是一个对象。返回false,认为是两个对象

 

 

 

 

项目经验面试真题 

1,高并发情况下,我们系统是如何支撑大量的请求的 ?

尽量使用缓存 优化数据库查询语句HTML静态化 

 

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助

 

调用其他系统http接口超时了,如何处理

尝试多调用一次

回滚数据

catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚。让对方的系统重新调用。 
备注:宁愿没有数据,也不要存储脏数据。

 

5、如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化) 
设计缓存,使用memcached、redis,读写分离,数据库优化(优化表结构、索引、查询语句等),使用集群,升级硬件, 

 

6、100万条记录实现导出

分页查询 开多线程分批导出

 

建立索引的原则:

1) 定义主键的数据列一定要建立索引。

2) 定义有外键的数据列一定要建立索引。

3) 对于经常查询的数据列最好建立索引。

4) 对于需要在指定范围内的快速或频繁查询的数据列;

更新频繁的字段不适合创建索引

占用存储空间少的字段更适合选作索引的关键字

 

秒杀设计

采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。

 

mongodb

文档的形式存储

二级索引、动态查询、全文搜索 、聚合框架 高可用 大文件存储GridFS

不支持原子事务

MongoDB 使用JSONJavaScript ObjectNotation)文档存储记录。

BSON格式

db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});

MongoDB适用场景

网站数据、缓存等大尺寸、低价值的数据

在高伸缩性的场景,用于对象及JSON数据的存储。

优点

l  文档结构的存储方式,能够更便捷的获取数据

l  内置GridFS,支持大容量的存储

l  内置Sharding,分片简单

l  海量数据下,性能优越

l  支持自动故障恢复(复制集)

缺点

l  不支持事务操作

l  占用空间过大

l  MongoDB没有如MySQL那样成熟的维护工具

l  无法进行关联表查询,不适用于关系多的数据

l  复杂聚合操作通过mapreduce创建,速度慢

| 模式自由,  自由灵活的文件存储格式带来的数据错误

 

 

加密

//为RSA算法创建一个KeyPairGenerator对象

//初始化KeyPairGenerator对象,密钥长度

//生成密匙对

//得到公钥

//得到私钥

密钥字符串(经过base64编码)

 

 

海量数据的解决方案

1 使用缓存

2 页面静态化---不想解释,还有什么值得去解释呢?

3 数据库优化

3.1 数据库表结构涉及

3.2 数据类型的选用

3.3 sql优化

3.4 索引优化

3.5 配置优化

 

Mysql执行计划是什么?

  执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看。

Mysql视图可以被看成是虚拟表或存储查询。

存储过程
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
   可以在单个存储过程中执行一系列 SQL 语句。
   可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
   存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

1、使用了存过程,很多相似性的删除,更新,新增等操作就变得轻松了,并且以后也便于管理!

2、存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。  

3、存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。    

4、存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。    

5、存储过程主要是在服务器上运行,减少对客户机的压力。  

6、存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。  

7、存储过程可以在单个存储过程中执行一系列SQL语句。  

8、存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

 

 

  1. 在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的
    必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理其并发情况。当接到用户秒杀提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,处理失败在将数据递增1(加锁/解锁),否则表示交易成功。
    当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。
  2. 2、这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大,要用缓存。
    把你要卖出的商品比如10个商品放到缓存中;然后在redis里设置一个计数器来记录请求数,这个请求书你可以以你要秒杀卖出的商品数为基数,比如你想卖出10个商品,只允许100个请求进来。那当计数器达到100的时候,后面进来的就显示秒杀结束,这样可以减轻你的服务器的压力。然后根据这100个请求,先付款的先得后付款的提示商品以秒杀完。

Java通过WSDL文件来调用webserviceXML格式的WSDL文件

任务类可以不实现Job接口

<!--false表示等上一个任务执行完后再开启新的任务--><!-- 调度触发器 --><!-- 调度工厂

饿汉式单列模式

 

public class Singleton {

    private static Singleton instance=new Singleton();

    private Singleton(){

       

    }

    public static Singleton getInstance(){

        return instance;

    }

}

 

sql语句中where与having的区别

Where 是一个约束声明,使用Where约束来自数据库的数据

Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数

 

 

目前知道的三种主流的Web服务实现方案为: 

REST:表象化状态转变 (软件架构风格) 

SOAP:简单对象访问协议  

XML-RPC:远程过程调用协议 

数据库结构

接口怎么定义 

接口规范是什么?
首先接口分为四部分:方法、uri、请求参数、返回参数
1、方法:新增(post) 修改(put) 删除(delete) 获取(get)
2、uri:以/a开头,如果需要登录才能调用的接口(如新增、修改;前台的用户个人信息,资金信息等)后面需要加/u,即:/a/u;中间一般放表名或者能表达这个接口的单词;get方法,如果是后台通过搜索查询列表,那么以/search结尾,如果是前台的查询列表,以/list结尾;url参数就不说了。
3、请求参数和返回参数,都分为5列:字段、说明、类型、备注、是否必填
字段是类的属性;说明是中文释义;类型是属性类型,只有String、Number、Object、Array四种类型;备注是一些解释,或者可以写一下例子,比如负责json结构的情况,最好写上例子,好让前端能更好理解;是否必填是字段的是否必填。
4、返回参数结构有几种情况:1、如果只返回接口调用成功还是失败(如新增、删除、修改等),则只有一个结构体:code和message两个参数;2、如果要返回某些参数,则有两个结构体:1是code/mesage/data,2是data里写返回的参数,data是object类型;3、如果要返回列表,那么有三个结构体,1是code/mesage/data,data是object,里面放置page/size/total/totalPage/list 5个参数,其中list是Arrary类型,list里放object,object里是具体的参数。

tail -f /var/log/messages

IO

数据库  存储过程 

4

Spring

Spring是一个轻量级的IoC和AOP容器框架。

spring属于低侵入式设计,代码的污染极低 方便解耦,简化开发

AOP是面向切面的编程,将程序中的交叉业务逻辑,封装成一个切面,然后注入目标对象;是一种编程思想 支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理

IOC就是控制反转,是指创建对象的控制权的转移Spring管理

Spring的IOC有三种方式注入
1、根据属性注入—set方法注入
2、根据构造方法注入
3、根据注解注入

请解释Spring Bean的生命周期?

 首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;

@Autowired 注解 自动装配  工厂模式  单例模式

 

 

@Autowired@Resource的区别   

默认情况下必须要求依赖对象必须存在

@Autowired默认按类型装配默认情况下必须要求依赖对象必须存在

@Resource,默认安装名称进行装配,名称可以通过name属性进行指定

@Autowired        属于Spring的注解 

@Resource   不属于Spring的注解

 

 

程式事务管理②声明式事务管理

spring配置事务JDBC事务

声明式事务,切点一般是扫描service层实现类,通过方法名匹配配置传播特性,决定哪些方法上加事务,哪些不需要事物。

@Transactional注解方式配置AOP事务  使用Spring的事务管理

!-- 1.声明事务管理组件:定义具体平台事务管理器

   2.开启事务组件注解扫描:注册事务注解处理器 如果方法发生运行期错误unchecked(RuntimeException),事务会进行回滚

通过xml配置AOP事务

<!-- 1.声明事务管理组件:定义具体平台事务管理器 -->

2.基于xml配置的声明事务范围及类型  定义通知, 通知中要处理的就是事务

配置具体方法事务属性              事务隔离级别 事务超时时间 事务传播行为

<!-- 3.配置aop -->切入点配置切面指定扫描包

 

 

Spring配置

applicationContext.xml

<!-- 配置数据源 --> 

<!-- 配置事务管理器 -->

<!-- 配置业务bean -->

  <!-- 使用XML来使用事务管理-->  

 <!-- 配置一个切面,和需要拦截的类和方法 -->

<!-- 配置一个事务通知 -->

 

架构配置 spring

web.xml中配置servlet及其映射关系  
  1. 加载spring容器  配置一个监听器
  2. 配置前端控制器  springmvc加载的配置文件 适配器、处理映射器等
  3. DispatcherServlet进行解析   post乱码过滤器

 

 

架构配置 pringMVC

  1. 配置视图解析器  使用前缀和后缀
  2. 使用组件扫描的方式可以一次扫描多个Controller
  3. 配置注解的处理器映射器和处理器适配器
  4. 定义拦截器  拦截所以路径请求
  5. 配置上传文件数据解析器
  6. 定义全局异常处理器
 
applicationContext-dao.xml配置文件
  1. 加载数据库连接的资源文件
  2. 配置数据源   dbcp数据库连接池
  3. 配置sqlSessionFactory   数据库连接池  加载Mybist配置文件
  4. 配置mapper扫描器  扫描路径
  5. 映射mapper映射文件配置   扫描批量加载映射文件配置

 

SpringMVC

轻量级Web框架

 

https://i-blog.csdnimg.cn/blog_migrate/67d51b5c6ceeed923e26d7efa8b72e07.png

 

(1)转发:在返回值前面加"forward:",譬"forward:user.do?name=method4"

(2)重定向:在返回值前面加"redirect:",譬"redirect:http://www.baidu.com"

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。

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

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

 

SpringMvc里面拦截器 实现HandlerInterceptor接口

 

 

 

Mybatis

一个半ORM(对象关系映射)框架它内部封装了JDBC,开发时只需要关注SQL语句本身

SQL写在XML里 同意管理sql语句 灵活度高  各种数据库兼容

通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

通常一个Xml映射文件,都会写一个Dao接口与之对应Dao接口即Mapper接口

  Mybatis使用RowBounds对象进行分页

 <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>

MyBatis实现一对一

通过在resultMap里面配置association节点配置一对一的类

MyBatis实现一对多

通过在resultMap里面的collection节点配置一对多的类

 

Redis

Redis 是一个基于内存的高性能key-value数据库。

 基于内存查询速度快

支持丰富数据类型,支持stringlistsetsorted sethash 

可用于缓存

基于内存储存不能存储海量数据 受到物理磁盘影响 挂机信息就没了所以要做个

 AOF持久化 快照 存在物理磁盘里  也可以搭载集群 主从模式

Redis有过期淘汰机制 保证数据的热度

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

 

 

Rabbitmq

消息队列协议的一种消息队列技术

在分布式系统下具备异步,削峰,负载均衡等一系列高级功能

拥有持久化的机制,进程消息,队列中的信息也可以保存下来

服务间异步通信

 

如果你要确保说写rabbitmq的消息别丢,可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每个消息id的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。

Spring boot

spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用

快速创建独立运行的spring项目与主流框架集成 
-使用嵌入式的servlet容器,应用无需打包成war包 
-starters自动依赖与版本控制 
-大量的自动配置,简化开发,也可修改默认值 

响应式编程webflux

mono: 单一对象 User

Flux:数组列表对象 List<User>

/**  mono Collection

    * 功能描述:根据id找用户

   @GetMapping("find")

   public Mono<User> findByid(final String id){

      return userService.getById(id);

   }

   /** mono Service

    * 功能描述:根据id查找用户

   public Mono<User> getById(final String id){

   returnMono.justOrEmpty(UserService.dataMap.get(id));

   }

/** Flux Collection

    * 功能描述:列表

@GetMapping(value="list",produces=MediaType.APPLICATION_STREAM_JSON_VALUE)

   public Flux<User> list(){

      return userService.list().delayElements(Duration.ofSeconds(2));

   }

/** Flux  Service

    * 功能描述:根据id删除用户

    * @param id

    * @return

    */

   public Mono<User> del(final String id){

      return Mono.justOrEmpty(UserService.dataMap.remove(id));

   }

  

DevTools)模块 热部署工具 无需重新服务器

模板引擎  解析页面

springboot默认读取配置文件为application.properties或者是application.yml

spring-boot-starter-activemq依赖关系

在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration 
会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean

 

根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring

 

springboot常用的starter有哪些 
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持 
spring-boot-starter-data-jpa 数据库支持 
spring-boot-starter-data-redis redis数据库支持 
spring-boot-starter-data-solr solr支持 
mybatis-spring-boot-starter 第三方的mybatis集成starter

 

线程

调用Runnable接口

继承Thread

start()方法被用来启动新创建的线程

 

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量 的值也和预期的是一样的,就是线程安全的

 

 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

Dubbo

分布式服务框架

Dubbo需要四大基本组件:Registry、Monitor、Provider、Consumer。

Dubbo链接超时?因为网路链接受到瓶颈  传输数据超过Dubbo本身上线

dubbo都支持什么协议  

dubbo://(推荐  rmi://    hessian://   http://   webservice:// https://img-blog.csdnimg.cn/img_convert/65efe7f57a9d40408fd12ca997b238bf.png

Zookeeper 作为注册中心

3、Dubbo在安全机制方面是如何解决的 
Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。

1 面试题:Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么? 
可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用

 

Java的方法重载 类中可以创建多个方法,它们具有相同的名字

重写 子类可继承父类中的方法重写父类的方法

 

List,Set都是继承自Collection接口,Map则不是

List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉

3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

 

stringbuffer和stringbuiller区别和应用场景

  StringBuffer:字符串变量  (线程安全) 效率快

  StringBuilder:字符串变量 (非线程安全)  

用于拼接参数

接口可以继承接口。抽象类可以实现(implements)接口

65.接口与抽象类有什么区别?

抽象类有构造方法,接口没有构造方法
抽象类只能单继承,接口可以多继承
抽象类可以有普通方法,接口中的所有方法都是抽象方法
接口的属性都是public static final修饰的,而抽象的不是

 

mysql在指定的一个字段后面添加一个字段

 

举个栗子:alter table inquiry add error_code varchar(3) after add_time;

说明:alter table + 表名 + add + 要添加的字段 字段类型 +  after  + 要跟随的字段名

 

 

ArrayList和LinkedList区别

 

ArrayList 底层数组结果 查询快增删慢   LinkedList 底层链表结果 查询慢增删快

HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行 非线程安全,效率上可能高于Hashtable

Map适合储存键值对的数据

 

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象

Hashcode冲突解决方法

1.开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
2.再哈希法
3.链地址法(Java hashmap就是这么做的)
4.建立一个公共溢出区

 

 

 

内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现

select * from a_table a inner join b_table bon a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/7b91df0cd0b3a51cad96c3d0387a0978.png

 

 

左连接(左外连接)

 

select * from a_table a left join b_table bon a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/cca0a46e3b531c9c58e0d05094a06418.png

右连接(右外连接)

select * from a_table a right outer join b_table b on a.a_id = b.b_id;

https://i-blog.csdnimg.cn/blog_migrate/3b85bbc6ab154ca2908908bfc700897e.png

 

 

 

 

 

1.重复数据完全一样,使用distinct

  select distinct * from table

 

 

2.id列不同,id类型为int,自增字段,使用聚合函数max或其他

select * from  table where id in(

  select MAX(id)

  FROM table  group by “分组字段”having COUNT(*)>1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 
delete from people 
where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1) 
and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1) 

 

MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持

 

 

支付接口参数 需要

签名  账户  密码  订单号 商品名称  支付类型  总金额    跳转地址  和 回掉地址

 

 

 

https://images2018.cnblogs.com/blog/1120165/201711/1120165-20171124223229656-408723583.png

 

 

 

 

 

 

 

 

一、Java基础

1.JDK 和 JRE 有什么区别?

 

JDK: Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境

JRE: Java Runtime Environment 的简称,Java 运行环境,为 Java 运行提供环境

 

具体来说,JDK 包括 JRE,同时还包含了编译 Java 源码的编译器 javac,还包含了Java程序调试和分析的工具

 

2.== 和 equals 的区别是什么?

equals :基本类型,比较两个值是否相等基本类型一个数字,一个字符  int

== :引用类型,比较的是引用是否相等 引用类型 对象类型name

List集合里的排序比较大小用比较器 Comparator比较俩个值相减

 

使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值

方法:在mapper中指定keyProperty属性

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">

    insert into user(userName,password,comment)

    values(#{userName},#{password},#{comment})

</insert>

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode

 两个obj,如果equals()相等,hashCode()一定相等。
  两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
不对,两个对象的 hashCode()相同,则 equals()不一定为 true

 

4.final 在 java 中有什么作用?

final 修饰类,不能被继承
final 修饰的方法不能被重写

 

  1. java 中操作字符串都有哪些类?它们之间有什么区别?

StringBuffer 和 StringBuilder 可以在原有对象的基础上进行操作,所以经常改变字符串的内容。StringBuffer 是线程安全的,StringBuilder 是非线程安全的,但 StringBuilder 的性能高于 StringBuffer,所以建议多线程下使用StringBuffer,单线程下使用 StringBuilder

 

  1. 如何将字符串反转?
    使用 StringBuffer 的 reverse 方法,或者使用 StringBuilder 的 reverse 方法
  2. 普通类和抽象类有哪些区别?
    普通类不能包含抽象方法,抽象类可以包含抽象方法
  3. 接口和抽象类有什么区别?

接口用 interface 声明、implement 实现;抽象类用 abstract 声明、extends 继承
接口不能由构造函数,而抽象类可以
接口中的方法默认使用 public ,抽象类中的方法可以使用任意修饰符
类可以实现很多接口,类只能继承一个类

10. List、Set、Map 之间的区别是什么?

List储存元素是有序的 可以存重复数据 

Set储存元素是无序的 不可以存重复数据

Map存储键值对的  不可重复

HashSet与HashMap的区别:

HashMap

HashSet

实现了Map接口

实现Set接口

存储键值对

仅存储对象

调用put()向map中添加元素

调用add()方法向Set中添加元素

HashMap使用键(Key)计算Hashcode

HashSet使用成员对象来计算hashcode值,

对于两个对象来说hashcode可能相同,

所以equals()方法用来判断对象的相等性,

如果两个对象不同的话,那么返回false

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象

HashSet较HashMap来说比较慢

 

 

  1. HashMap 和 Hashtable 有什么区别?

Hashtable所有的元素操作都是synchronized修饰的,而HashMap并没有。

HashMap 可以存储null值null建   Hashtable 不能

线程不安全                         线程安全    HashMap 快

Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。

12. 说一下 HashMap 的实现原理?

底层数组链表加红黑树实现的

13. ArrayList 和 LinkedList 的区别是什么?

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

LinkedList底层链表结构  查询慢 增删快

14. 如何实现数组和 List 之间的转换arrayList.toArray(new String[size])

15. 并行和并发有什么区别?

并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。

  同步就是一件事,一件事情一件事的做。
        异步就是,做一件事情,不引响做其他事情。

16. 线程和进程的区别?

一个线程有多个进程

17. 创建线程有哪几种方式?

创建Thread子类

Runnable接口

17.5怎么保证事物的原子性?

 数据库使用锁的方式保证隔离性(也就是最终数据保证了一致性)

 

18. 线程有哪些状态?

创建  就绪 堵塞 死亡 

19. 创建线程池有哪几种方式

newSingleThreadExecutor

创建一个单线程的线程池

newFixedThreadPool

创建固定大小的线程池

newCachedThreadPool

创建一个可缓存的线程池。

newScheduledThreadPool

创建一个大小无限的线程池

 

20. 在 java 程序中怎么保证多线程的运行安全

加同步锁

21. 动态代理是什么?有哪些应用?

当想要给实现了某个接口的类中的方法,加一些额外的处理

动态代理的应用:Spring的AOP,加事务,加权限,加日志。

 

反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

22. 解释一下什么是 aop?

AOP是面向切面的编程,将程序中的交叉业务逻辑,封装成一个切面,然后注入目标对象;是一种编程思想 支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理

23. 解释一下什么是 ioc?

IOC就是控制反转,是指创建对象的控制权的转移Spring管理

Spring的IOC有三种方式注入
1、根据属性注入—set方法注入
2、根据构造方法注入
3、根据注解注入

24.spring几种 bean 的作用域?

Request  session

25. spring 自动装配 bean 有哪些方式

XML中进行显示配置  自动装配

26. spring 事务实现方式有哪些

原子性  一致性  隔离性  持久性

事务的隔离级别  都未提交  都已提交  脏读  幻读 

事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 
事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。

 

27.为什么使用springboot

spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。

28. spring boot 核心配置文件是什么

application (.yml 或者 .properties)  .yml 

29. spring boot 配置文件有哪几种类型?它们有什么区别?

不同“等级” 用冒号隔开
2. 次等级的前面是空格,不能使用制表符(tab)
3. 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着

 

30. rabbitmq 有哪些重要的组件

Exchange: 就是顺丰和韵达。

routingkey: 就是邮件地址的概念.

queue: 就是邮箱接收软件,但是可以接收多个地址的邮件,通过bind实现。

producer: 消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

 

 

 

31. rabbitmq 的消息是怎么发送的

  1.  applicationContext  .getBean方法取消息

 

发送者

1.一个ConnectionFactory连接工厂connectionFactory

2.connectionFactory设置RabbitMQ所在IP等信息

//指定端口  用户名密码

3.通过connectionFactory创建一个连接connection

4.通过connection创建一个频道channel

5.通过channel指定一个队列  发送的消息

6.channel向队列中添加消息,第一个参数是转发器,使用空的转发器(默认的转发器,类型是direct

//7.关闭频道 

8.关闭连接

接收者

        1. 一个ConnectionFactory连接工厂connectionFactory
        2. 2.通过connectionFactory设置RabbitMQ所在IP等信息
        3. 3.通过connectionFactory创建一个连接connection
        4. 4.通过connection创建一个频道channel
        5. 5.通过channel指定队列
        6. 6.创建一个消费者队列consumer,并指定channel
        7. channel指定消费者
        8. consumer中获取队列中的消息,nextDelivery是一个阻塞方法,如果队列中无内容,则等待

项目部署服务器上步骤

1打war

2连接到Linux服务器

3copy空的Tomcat项目到linux服务器中,改端口,还要测试是否已经有了jdk等Tomcat运行的基本服务,启动Tomcat看能不能成功

4war包拖动到右边tomcat的webapp目录下

5点击执行命令窗口,运行命令./startup.sh 启动Tomcat服务器

6关闭Tomcat服务器的命令为./shutdown.sh

查看启动的服务有多少个,可以使用命令ps -ef|grep tomcat

  1. ps aux # 查看系统所有的进程数据
  2. ps ax # 查看不与terminal有关的所有进程
  3. ps -lA # 查看系统所有的进程数据
  4. ps axjf # 查看连同一部分进程树状态

 

 

 

 

 

. hibernate是全自动,而mybatis是半自动

hibernate数据库移植性远大于mybatis

sql直接优化上,mybatis要比hibernate方便很多

易于上手和掌握。

2. sql写在xml里,便于统一管理和优化

sql依赖于数据库,导致数据库移植性差。

 

 

RPCHTTP的区别?

1.RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议

2. 同步和异步的区别。

 

ajax

 

$(function(){

    $('#send').click(function(){

         $.ajax({

             type: "GET",

             url: "test.json",

             data: {username:$("#username").val(), content:$("#content").val()},

             dataType: "json",

             success: function(data){

                         $('#resText').empty();   //清空resText里面的所有内容

                         var html = '';

                         $.each(data, function(commentIndex, comment){

                               html += '<div class="comment"><h6>' + comment['username']

                                         + ':</h6><p class="para"' + comment['content']

                                         + '</p></div>';

                         });

                         $('#resText').html(html);

                      }

         });

    });

});

 

 

代理模式:为其他对象提供一个代理以便控制这个对象的访问。

单例模式:某个类只能有一个实例,提供一个全局的访问点。

工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。

适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

 

 

Struts2的工作原理

 

  1. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
  2. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
  3. 询问ActionMapper来决定这个请求是否需要调用某个Action
  4. 把请求的处理交给ActionProxy
  5. 询问框架的配置文件,找到需要调用的Action类;
  6. ActionProxy创建一个ActionInvocation的实例。
  7. 在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

 

Hibernate入门这一篇就够了

配置文件

<!-- 1. 数据库连接配置 -->

<!-- 2.2 格式化sql -->

<!--3. 加载所有映射-->

 

//创建对象

//创建Session工厂对象

//开启事务

//持久化操作

//提交事务

//关闭Session

 

 

字符流与字节流的区别

  • 字节流默认不使用缓冲区;字符流使用缓冲区。

字节流通常用于处理二进制数据不支持直接写入或读取

字符流通常处理文本数据,它支持写入及读取

 

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

 

 

生产者

 

//获取连接

//从连接中获取一个通道

//声明交换机

//发送消息

 

 

 

消费者

//获取连接

//从连接中获取一个通道

//声明交换机

//声明队列

//将队列绑定到交换机

//定义消费者

//当消息到达时执行回调方法

//设置手动应答

//监听队列

 

 

 

3.https 协议需要到ca申请证书,http不需要。

4.http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

get是从服务器上获取数据,post是向服务器传送数据。

get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式

 

HashSet如何实现去重:

* 是通过调用元素内部的hashCode和equals方法实现去重,首先调用hashCode方法,比较两个元素的哈希值,如果哈希值不同,直接

* 认为是两个对象,停止比较。如果哈希值相同,再去调用equals方法,返回true,认为是一个对象。返回false,认为是两个对象

 

 

 

 

项目经验面试真题 

1,高并发情况下,我们系统是如何支撑大量的请求的 ?

尽量使用缓存 优化数据库查询语句HTML静态化 

 

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助

 

调用其他系统http接口超时了,如何处理

尝试多调用一次

回滚数据

catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚。让对方的系统重新调用。 
备注:宁愿没有数据,也不要存储脏数据。

 

5、如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化) 
设计缓存,使用memcached、redis,读写分离,数据库优化(优化表结构、索引、查询语句等),使用集群,升级硬件, 

 

6、100万条记录实现导出

分页查询 开多线程分批导出

 

建立索引的原则:

1) 定义主键的数据列一定要建立索引。

2) 定义有外键的数据列一定要建立索引。

3) 对于经常查询的数据列最好建立索引。

4) 对于需要在指定范围内的快速或频繁查询的数据列;

更新频繁的字段不适合创建索引

占用存储空间少的字段更适合选作索引的关键字

 

秒杀设计

采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。

 

mongodb

文档的形式存储

二级索引、动态查询、全文搜索 、聚合框架 高可用 大文件存储GridFS

不支持原子事务

MongoDB 使用JSONJavaScript ObjectNotation)文档存储记录。

BSON格式

db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});

MongoDB适用场景

网站数据、缓存等大尺寸、低价值的数据

在高伸缩性的场景,用于对象及JSON数据的存储。

优点

l  文档结构的存储方式,能够更便捷的获取数据

l  内置GridFS,支持大容量的存储

l  内置Sharding,分片简单

l  海量数据下,性能优越

l  支持自动故障恢复(复制集)

缺点

l  不支持事务操作

l  占用空间过大

l  MongoDB没有如MySQL那样成熟的维护工具

l  无法进行关联表查询,不适用于关系多的数据

l  复杂聚合操作通过mapreduce创建,速度慢

| 模式自由,  自由灵活的文件存储格式带来的数据错误

 

 

加密

//为RSA算法创建一个KeyPairGenerator对象

//初始化KeyPairGenerator对象,密钥长度

//生成密匙对

//得到公钥

//得到私钥

密钥字符串(经过base64编码)

 

 

海量数据的解决方案

1 使用缓存

2 页面静态化---不想解释,还有什么值得去解释呢?

3 数据库优化

3.1 数据库表结构涉及

3.2 数据类型的选用

3.3 sql优化

3.4 索引优化

3.5 配置优化

 

Mysql执行计划是什么?

  执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看。

Mysql视图可以被看成是虚拟表或存储查询。

存储过程
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
   可以在单个存储过程中执行一系列 SQL 语句。
   可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
   存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

1、使用了存过程,很多相似性的删除,更新,新增等操作就变得轻松了,并且以后也便于管理!

2、存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。  

3、存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。    

4、存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。    

5、存储过程主要是在服务器上运行,减少对客户机的压力。  

6、存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。  

7、存储过程可以在单个存储过程中执行一系列SQL语句。  

8、存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

 

 

  1. 在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的
    必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理其并发情况。当接到用户秒杀提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,处理失败在将数据递增1(加锁/解锁),否则表示交易成功。
    当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。
  2. 2、这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大,要用缓存。
    把你要卖出的商品比如10个商品放到缓存中;然后在redis里设置一个计数器来记录请求数,这个请求书你可以以你要秒杀卖出的商品数为基数,比如你想卖出10个商品,只允许100个请求进来。那当计数器达到100的时候,后面进来的就显示秒杀结束,这样可以减轻你的服务器的压力。然后根据这100个请求,先付款的先得后付款的提示商品以秒杀完。

Java通过WSDL文件来调用webserviceXML格式的WSDL文件

任务类可以不实现Job接口

<!--false表示等上一个任务执行完后再开启新的任务--><!-- 调度触发器 --><!-- 调度工厂

饿汉式单列模式

 

public class Singleton {

    private static Singleton instance=new Singleton();

    private Singleton(){

       

    }

    public static Singleton getInstance(){

        return instance;

    }

}

 

sql语句中where与having的区别

Where 是一个约束声明,使用Where约束来自数据库的数据

Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数

 

 

目前知道的三种主流的Web服务实现方案为: 

REST:表象化状态转变 (软件架构风格) 

SOAP:简单对象访问协议  

XML-RPC:远程过程调用协议 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值