JAVA 自集面试题 杭州 日常收集

  1. java基础
  2. 设计模式
  3. Jvm回顾一下,类加载器之类
  4. Struts和mvc区别
  5. 支付业务
  6. 对自己写的项目流程,以及要说的流程进行梳理
  7. 金融业务稍微熟悉一下
  8. 离职原因

 

 

  • java基础

https://blog.csdn.net/zhang150114/article/details/90479181

 

基本数据类型:

8种,byte\short\char\int\float\long\double\boolean

8\16\16\32\32\64\64  

boolean:只有true和false两个取值。

 

 

包装类型:

包装类型是对基本数据类型不足之处的补充。

基本数据类型的传递方式是值传递,包装类型是引用传递,同时和提供了多种数据类型装换的方法。

JAVA1.5之后支持自动拆箱装箱。

进行一个归类: 
Integer派别:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的Boolean也是类似,在正负128之内,不是用新创建对象,从而节约内存。 


Double派别:Double、Float的valueOf方法的实现是类似的。每次都返回不同的对象。

 private static final Integer[] SMALL_VALUES = new Integer[256];

public static Integer valueOf(int i) {

return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];

}

public static final Boolean TRUE = new Boolean(true);

public static final Boolean TRUE = new Boolean(false);

public static Boolean valueOf(boolean b) {

 return b ? Boolean.TRUE : Boolean.FALSE;

}

装箱操作会创建对象,频繁的装箱操作会消耗许多内存,影响性能,所以可以避免装箱的时候应该尽量避免。

 

总结:“==”符号俩边操作数【比较值】是否相同的,equals比较值和类型,

Integer款部分不用创建对象,Double款全部需要创建对象,因为-128~128 小数的值,没法确定,integer就256种

 

 

 

JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。 JDK = 开发环境 + 运行环境 ,JRE = 运行环境

 

 

== 和 equals 的区别是什么?

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;

String、Integer等因为重写了equals变成了比较值,本来引用类型的,== 和equals 都是比较 引用的。

 

final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

先初始化,不能被修改,不能被继承,不能被重写

java 中的 Math.round(-1.5) 等于多少?

向上取整,-1

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

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

 

String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

String 类的常用方法都有那些?

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

 

抽象类必须要有抽象方法吗?

普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。

抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,

接口和抽象类有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

 

java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

集合

List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。

Set:无序、不可重复。

Map:键值对、键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对 map 集合遍历时先得到键的 set 集合,对 set 集合进行遍历,得到相应的值。

 

多线程

新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。

运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务

就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。

休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。

终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。

 

 

 

很可能会问到的问题?

  1. string stringBuffer区别
  2. Hashmap hashtable 区别
  3. Get 与post请求区别
  4. 数据库左右连接,全连接
  5. Spring框架知识
  6. Mybatis 与 ibatis
  7. 集合
  8. Linux 基本命令 ,777 等等权限
  9. 冒泡排序,选择排序
  10. 去重复字符串
  11. 多线程实现资源同步问题
  12. 谈了谈简历上的项目

 

 

 

 

 

  1. string stringBuffer区别

string是不可变长的对象,stringbuffer 是可变长线程安全的,适合多线程的开发环境。

  1. Hashmap hashtable 区别

1、继承的父类不同

  Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2、线程安全性不同

Hashtable是线程安全的,内部通过sync方式实现。Hashmap 是线程不安全的,不适合多线程的时候使用,内部是一个Entry数组,在进行多线程新增和删除操作的时候,存在安全并发问题。

  1. 对null key和null value的支持不同

HashTable不允许null值(key和value都不可以),HashMap允许使用null值(key和value)都可以

 

  1. Get 与post请求区别

都是属于http协议的一种请求方式,不同的请求方式不同的工作模式。

get请求不能提交正文数据,post可以,get请求都是通过queryString的方式提交数据。同时也需要转码,遇到中文会出现乱码。get请求会缓存页面,post请求不会,所以需要设置时间戳或者随机数来处理。

因为get请求存在缓存,如果参数暴露在外,所以存在安全问题,post请求更加安全

 

  1. 数据库左右连接,全连接区别

主要区别:以那个表为主,辅表辅助补空,全连接就是舍弃不同的数据不显示,显示都存在的数据。

  1. Spring框架知识

什么是spring?:

它是一种轻量级的控制反转(IoC)和面向切面(AOP)的容器框架为了解决企业应用开发的复杂性而创建的,只要通过依靠javaBean对框架进行管理。

Springioc 原理?

控制权由应用代码中转到了外部容器,由Spring对bean进行统一对管理。Spring通过解析xml或者注解的形式,获取bean信息,通过反射创建实例,对bean进行管理,获得控制权。

依赖注入:

Spring找到相应对注入注解,对目标赋值

 

 

  1. Mybatis 与 ibatis

ibatis是mybatis的前身,提供了对原生jdbc数据库操作的优化。

Mybatis 则更是在ibatis的基础上做了优化。

1.是一个半orm框架,内部封装JDBC,只需要面向sql语句编程即可,灵活性更高

2.使用xml和注解来映射原生信息,避免了几乎所有的 JDBC 操作的缺点。

优点:

与jdbc相比,减少了代码量,增加来灵活性

可以与Spring完美整合

兼容多种数据库

提供映射标签,支持对象与数据库orm字段关系映射。

缺点:

sql语句编写工作量大

对sql依赖性大,导致数据库可移植性差,不能随便更换数据库

 

14、MyBatis和Hibernate有什么异同

相同点:屏蔽JDBC API 的底层方问细节,使我们不用于JDBC API打交道就可以访问数据库

不同点:Hibernate是全自动的ORM映射工具,可以自动生成SQL语句,Mybatis需要在xml配置文件中写SQL语句;因为Hibernate是自动生成SQL语句的,在写复杂查询时,Hibernate实现比Mybatis复杂的多

 

 

 

  1. 集合

Collection和Map,是集合框架的根接口。

List集合 、Set】, 【abstractMap、concurrentMap、sortedMap】    

 

有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)

LinkedList:双向链表实现,增删快,查询慢 (线程不安全)

Vector:数组实现,重量级  (线程安全、使用少)

 

  1. Linux 基本命令 ,777 等等权限

linux系统644、755、777权限详解,0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入+执行)

语法为:chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

 

  1. 冒泡排序,选择排序
  2. 去重复字符串(string.indexOf与string.lastIndexOf)

   

  1. 多线程实现资源同步问题

通过锁的机制,来控制资源的同步。手动锁lock,比sync更适合,lock使用的是乐观锁的方式,对cpu把控更加合理,通过cpu提供对特殊指令,自动更新更新数据。使用起来比较灵活。

 

  1. 几个排序算法

冒泡排序,选择排序,快速排序

选择排序

Int[] a = {4,1,4,6,8,90};

For(int i = 0;i<a.length;i++){

For(int j = i+1;j<a.length;j++){

 If(a[i]>a[j]){

    Int temp = a[j];

    a[j] = a[i];a[i] = temp;

    

}

}

}

冒泡排序

Int[] a = [4,1,4,6,8,90],sortOrderArr = [];

For(int i = 0;i<a.length;i++){

For(int j = 0;j<a.length-1;j++){

If(a[j]>a[j+1]){

    Int temp = a[j];

    a[j] = a[j+1];a[j+1] = temp;

    

}

 

}

}

 

 

  1. Springmvc原理

用户发起请求到前端控制器DispatcherServlet;

前端控制器DispatcherServlet 请求处理器映射器HandlerMappering 去查询对应的处理器 (Handler)

前端控制器DispatcherServlet 调用处理器适配器去执行处理器(Handler),返回视图 (ModelAndView)

前端控制器DispatcherServle 请求视图解析器(ViewResolver)去进行视图解析,返回View

前端控制器DispatcherServle 将View进行渲染 返回用户

请求-》前端控制器-》处理器映射器-》对应的处理器-》调用适配器执行对应处理器,返回视图-》

视图解析器-》View进行渲染,返回用户

  1. Spring原理

内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。  

      Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过  配置类达到的。  

  1. mybatis原理

在 MyBatis 运行开始时需要先通过 Resources 加载全局配置文件.下面 需要实例化 SqlSessionFactoryBuilder 构建器.帮助 SqlSessionFactory 接 口的实现类 DefaultSqlSessionFactory. 在实例化 DefaultSqlSessionFactory 之前需要先创建 XmlConfigBuilder 解析全局配置文件流,并把解析结果存放在 Configuration 中.之后把 Configuratin 传递给 DefaultSqlSessionFactory.到此 SqlSessionFactory 工 厂创建成功. 由 SqlSessionFactory 工厂创建 SqlSession. 每次创建 SqlSession 时,都需要由 TransactionFactory 创建 Transaction 对象,同时还需要创建 SqlSession 的执行器 Excutor,最后实例化 DefaultSqlSession,传递给 SqlSession 接口. 根据项目需求使用 SqlSession 接口中的 API 完成具体的事务操作. 如果事务执行失败,需要进行 rollback 回滚事务. 如果事务执行成功提交给数据库.关闭 SqlSession 到此就是 MyBatis 的运行原理.

Resources 加载全局配置文件-》实例化 SqlSessionFactoryBuilder 构建器-》DefaultSqlSessionFactory  -》Configuratin +DefaultSqlSessionFactory  -》SqlSessionFactory -》SqlSession-》SqlSession +(Transaction +Excutor=》defaultSQLsession) -》最后实现具体的项目需求API事务操作,失败则回滚,成功则提交

  1. redis基本操作

 redis主挂了怎么操作

redis提供了哨兵模式,当主挂了,可以选举其他的进行代替,哨兵模式的实现原理,就是三个定时任务监控,

三次心跳检测之后,就会进行投票,当超过半数以上的时候就会将该节点当做主

redis基本数据类型:

String(字符串):key-value 类型

Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值

List(列表):实现消息队列

Set(集合):利用唯一性

Sorted Set(有序集合):可以进行排序 可以实现数据持久化

 

 

 

 

 

 

Redis和memched有什么区别?为什么单线程的Redis比多线程的Memched效率要高?

支持的数据类型不同,memched只支持简单的key/value数据类型

redis支持数据持久化存储,memched不支持

内存使用方面:使用简单的key-value存储的话,Memcached的内存利用率更高。而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

Memecache把数据全部存在内存之中,Redis有部份存在硬盘上,redis可以持久化其数据

 

 

  1. Quartz

原理:

核心元素为:Scheduler——任务调度器、Trigger——触发器、Job——任务。其中trigger和job是任务调度的元数据,scheduler是实际执行调度的控制器。

Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。

Job用于表示被调度的任务。主要有两种类型的job:无状态的(stateless)和有状态的(stateful)

Scheduler由scheduler工厂创建:DirectSchedulerFactory或者StdSchedulerFactory。第二种工厂StdSchedulerFactory使用较多,因为DirectSchedulerFactory使用起来不够方便,需要作许多详细的手工编码设置。

强大的调度功能,灵活的应用方式,分布式和集群能力

java quartz 停止正在进行的任务解决方案

新建的Job实现InterruptableJob,在Job中实现interrupt()方法。实现中途停止

调用scheduler1.pauseTrigger,可以暂停任务,不可以暂停运行中的任务。

如何得到quartz中Job的执行状态!

int state = scheduler.getTriggerState(triggerName, triggerGroup)

 

 

  1. dubbo与zookeeper原理

启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用。但是在注册中心全部挂掉后增加新的提供者,则不能被消费者发现。

所以消费者本地有一个生产者的列表,他会按照列表继续工作,倒是无法从注册中心去同步最新的服务列表,短时间内注册中心挂掉是不要紧的,但一定要尽快修复。

6.1Dubbo在安全机制方面是如何解决的

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

zookeeper工作原理:

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

  1. 泛型机使用

泛型是Java 1.5的新特性,泛型的本质是参数化类型,也可以叫是伪泛型,有些代码重复性很大,可以使用泛型方法简化 。Java泛型实现原理:类型擦出,在编译期间,所有的泛型信息都会被擦除掉。(因为泛型在编译期间会检查类型)

  1. JSP中的四大作用域
  • page作用域

page直译就是页面的意思,所以page作用域就比较好理解了——page作用域表示只在当前页面有效

  • request作用域

request表示一次客户端的请求,作用域是从一次客户端发起请求到服务端接收并响应该请求。并不会因为forward重定向到另一个页面上而丢失参数和属性

  • session作用域

向服务器发送第一个请求开始,只要页面不关闭,回话未过期,未调用httpsession的invalidate()方法,接下来的会话都是同属于一个范畴的

  • application作用域

application的作用域是最广的,它代表着整个Web应用的全局变量,对每一个页面,每一个Servlet都是有效的。当我们在application中设置属性时,这个属性在任意的一个页面都是可以访问的。

  1. 重定向和跳转的区别,URL是否相同

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

3. RPC 与 HTTP 、TCP 、UDP 、Socket 的区别

TCP/UDP: 都是传输协议,主要区别是 tcp 协议连接需要 3 次握手,断开需要四次挥手,是通过流来传输的,就是确定连接后,一直发送信息,传完后断开。udp 不需要进行连接,直接把信息封装成多个报文,直接发送。所以 udp 的速度更快写,但是不保证数据的完整性。

HTTP: 超文本传输协议是一种应用层协议,建立在 TCP 协议之上

Socket: 是在应用程序层面上对 TCP/IP 协议的封装和应用。

小结: 我们把网络传输类比于一条公路,那 TCP/UDP 就是货车,HTTP 就是货物,而 socket就是发动机。

RPC 是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。所以 RPC 的实现可以通过不同的协议去实现比如可以使 http、RMI 等。

  1. rpc的运行原理

要解决通讯的问题,主要是通过在客户端和服务器之间建立 TCP 连接

要解决寻址的问题,需要通过不同的协议来注册服务地址,比如UDDI、RMI Registry

当 A 服务器上的应用发起远程过程调用时,通过底层网络协议和寻找与传输,将序列化后的二进制发给B服务器

 B 服务器收到请求后,进行相应的反序列化操作,找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。

返回值还要发送回服务器 A 上的应用,也要经过序列化的方式发送

 

 

 

 

SQL的连接方式-左外连接、右外连接、全连接、内连接交叉连接

 

内连接:内部是连接运算,主要由相等连接和自然连接,内连接就是根据每个表指定的字段匹配两个表中的行,例如,检索 students和courses表中学生标识号相同的所有行。   

外连接:包含左外连接、右外连接、全连接

交叉连接:返回左表中所有行,与右表中的所有行组合。

 

 

JVM类加载器:

根类加载器(bootstrap class loader)

扩展类加载器(extensions class loader)

系统类加载器(system class loader)

自定义类加载器

 

类加载机制

JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载

 

Springboot和SpringMVC区别

 

springmvc是spring的一个MVC框架,Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。Spring MVC提供了一种轻度耦合的方式来开发web应用,内部主要基于视图控制器、处理器映射器、视图解析器,开发web应用变得很容易

Spring Boot实现了自动配置,降低了项目搭建的复杂度。内部也整合很多第三方库配置,提升Spring开发者使用效率

 

 

 

 

 

Exception和Error与RuntimeException的区别

首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception是可预料、可捕捉的。又可以分为检查性异常和非检查性异常,

【检查性异常】  必须在编写代码时,使用try catch捕获

【非检查性异常】 在代码编写使,可以忽略捕获操作,空指针,数组下标越界等。所有RuntimeException的子类即为非检查型异常;

Error是不可预料,不可捕捉的,异常的出现会影响jvm正常运行,比如内存溢出等

 

我们比较熟悉的Checked异常有

 

Java.lang.ClassNotFoundException

Java.lang.NoSuchMetodException

java.io.IOException

 

 Java.lang.ArithmeticException

Java.lang.ArrayStoreExcetpion

Java.lang.ClassCastException

Java.lang.IndexOutOfBoundsException

Java.lang.NullPointerException

 

Vector和ArrayList的区别?

Vector是线程安全的集合类,ArrayList并不是线程安全的类。Vector类对集合的元素操作时都加了synchronized,保证线程安全。

Vector与ArrayList本质上都是一个Object[] 数组,ArrayList提供了size属性,Vector提供了elementCount属性,他们的作用是记录集合内有效元素的个数。与我们平常调用的arrayList.size()和vector.size()一样返回的集合内有效元素的个数。

Vector与ArrayList的扩容并不一样,Vector默认扩容是增长一倍的容量,Arraylist是增长50%的容量。

Vector与ArrayList的remove,add(index,obj)方法都会导致内部数组进行数据拷贝的操作,这样在大数据量时,可能会影响效率。

Vector与ArrayList的add(obj)方法,如果新增的有效元素个数超过数组本身的长度,都会导致数组进行扩容。

 

TCP/UDP区别,和使用场景?

Tcp是面向连接,可靠性会高,UDP是基于非连接的,可靠性会低。

Tcp 也可以说是面向流的形式传输,接收到数据是会出现分组的现象,udp则是传输多个报文信息。

udp的实时性较高

 

TCP应用场景,可靠性高的,比如http,HTTPS等

UDP应用场景,可靠性低的,传输速度快

为什么建立连接是三次而断开连接是四次呢?

 

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必可以马上关闭SOCKET,也许你还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的

 

 

Synchronized 和lock 的區別?

1.构成方面:sync是jvm层面,ReenTrantLock是一个具体类,apI层面的锁

2.sync不需要手动释放锁,lock需要手动释放

3.sync不可中断,属于非公平锁,lock可中断,属于公平锁

 

 

 

数据库层面知识

触发器?

是一种特殊的存储过程,通过实践触发执行任务,维护数据的一致性和完整性,可以联级运算

什么是存储过程?用什么来调用?

存储过程是预编译sql语句,如果某次操作需要执行多次sql,使用存储过程会快很多

主要使用场景:用一个命令对象来调用存储过程。

union和union all的 区别?

前者是去除重复数据的,后者是查询全部数据,在性能方面,union all 会比较好。适用于 不存在重复数据的一个场景比较适合。

存储过程的优缺点?

执行效率高,是预编译过的、减少io消耗,代码是存于数据库的、安全性好,执行存储过程需要权限、可以重复利用,减少了代码量和繁琐性。

可移植性差。

什么是事务?什么是锁?

事务是指被绑定在一起的逻辑工作sql分组,执行通过则被提交,反之,则回滚操作。通过ACID审核

锁是保证了事务的一致性和并发性,只有获得使用锁权限的拥有者,才可以对其进行操作。

什么叫视图?游标是什么?

视图就是一个表或多个表行或列的集合,同时也支持对视图进行增删改查操作,使得我们对数据的获取更加简单,相比多表查询。游标:主要特点就是支持逐行处理数据,对查询结果作为一个单位来有效的处理。

视图的优缺点?

对数据库的访问,可以有选择性的读取数据库的一部分

用户通过简单查询从复杂查询中获得结果。

视图可以对多个表检索

对于相同的数据可以产生不同的视图

缺点:性能问题,只能对基本数据表查询,对于复杂的查询,那么就无法修改数据

 

为什么需要三次握手,俩次行吗?断开连接需要四次就是:

对方关闭连接发送final报文通知,可是我这边可能还没数据发完,所以我这边还需要发送final报文一次,代表我也发完了(双方final交互的过程)

 

 

 

 

分布式事务怎么实现?

基于RabbitMQ的双重队列机制,一个执行队列,一个补偿队列

基于RocketMQ的TC事务调节器,发送半消息为就绪状态,本地事务执行成功,通过netty发送commit/rollback通知调节器,对消息状态进行修改,rollback则删除,commit修改为可消费

 

网络问题,netty发送状态码失败,则MQ服务端会定时扫描存储于RMQ_SYS_TRANS_HALF_TOPIC中的消息,进行回检。保证最终一致性。

 

缺点:必须保证下游事务执行成功,不然建议使用tcc使用回滚策略。

 

支付宝即时支付流程?

1、与支付宝签订有效合同,并被支付宝审批通过。

2、下载支付宝需要的工具包,可以在支付宝官网下载,也可以下载我提供的,地址:点击打开链接

3、把下载的工具包解压,放入项目中。

4、创建一个alipay_config.properties文件,设置配置信息参数,appId、同步通知地址、异步通知地址、协议类型等

5、工具类 AlipayConfigUtil.java 加载配置文件properties信息。

6、通过支付宝demo支付页面,发起支付请求,配置信息+订单号+金额等信息,发给支付宝

7、支付宝会先【支付成功后同步通知】,返回一个支付宝账号信息,同步通知只做页面跳转提示。

8、异步通知,业务处理成功后回馈success即可,失败可以不用处理。

 

 

 

数据库优化?

  1. 优化数据表结构:分离查询频率高与频率低的字段,大数据中,表中存在频率低的字段,会影响查询速度。
  2. 合理的优化sql,添加索引
  3. 防止sql注入:按位插入或查询,正则表达式过滤特殊字符。

 

数据传输安全性保证?

重要的数据需要进行md5加密传输,没那么重要的数据进行数据签名生成sign标识,后端通过判断sign是否一致,来确认数据安全

 

Sql注入?

前端:通过调用函数与判断代码来过滤,后端通过正则表达式与采用PreparedStatement预编译语句集,来处理

 

 

Struts2原理?

http请求发送到tomcat,找到对应的web.xml文件,然后把请求交给web.xml中配置的过滤器(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。 FilterDispatcher是控制器的核心,由他来询问ActionMapper来决定需要调用某个Action,FilterDispatcher把请求的处理交给 ActionProxy ,ActionProxy根据struts.xml配置文件,找到需要调用的Action类和方法来处理这请求。

 

Struts2和SpringMVC的区别?

1.Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。前者容器启动之后初始化,后者是请求调用的时候初始化。

2.拦截方面:Struts2框架是类级别的拦截,每次请求就会创建一个Action,SpringMVC是方法级别的拦截,一个方法对应一个Request上下文

3.性能方面:SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

 

Servlet原理?

启动servlet容器,接收到请求之后初始化servlet,根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request找到对应的service,调用内部的doget或dopost方法,完成业务的处理,将信息放入到response并响应到客户端。

 

Jvm中堆内存有哪些?Gc怎么回收内存(怎么判断对象没有引用?具体?详细到java实现机制)?

1.一个Eden,两个survivor。

2.对象存活判定算法:

引用计数算法:添加引用计数器,引用+1,失效-1,0为不可能再被使用,缺点就是对象相互引用问题。

可达性分析算法:选择GC ROOT 对象作为起始点,向下搜索,没有引用链的,则证明对象不可用。

可作为GC Roots 的对象包括如下:
     1:虚拟机栈中引用的对象。
     2:方法区中类静态属性引用的对象。
     3:方法区中常量引用的对象。
     4:本地方法栈中JNI引用的对象

一次标记不代表死亡,需要判断对象没有覆盖finalize()方法

 

垃圾回收算法

1:标记—清除算法:

2:复制算法:

3:标记—整理算法:

4:分代收集算法:

 

 

 

 

Java实现大文件上传?

通过文件大小,判断分割数量,将大文件分割成多个小临时文件.tmp。

【RandomAccessFile】支持分段读写文件。

 

Java实现大文件下载?

使用CountDownLatch(N),开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段。

JAVA线程进程间通信

多线程间通信方式:

  1. 共享变量:volatile基于内存的共享资源、synchronized 指向一个共享实例引用
  2. wait/notify机制 :两条线程分别代表暂停和通知启动
  3. Lock/Condition机制 :使用Lock对像来充当同步监视器,使用Condition对象来暂停指定线程,唤醒指定线程!

 4、管道:管道流是java线程通讯的常用方式之一,通过创建管道输出流和管道输入流。输出流赋给信息输入线程、输入流赋给信息获取线程。缺点是:管道流只能俩个线程之间传递数据,只能单向发送。如果要两个线程之间互通讯,则需要两个管道流

进程与进程间通信:

  1. 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
  2. 命名管道 3.信号4.消息
  1. 共享内存:使得多个进程可以访问同一块内存空间,针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  2. 内存映射
  3. .信号量:主要作为进程间以及同一进程不同线程之间的同步手段。
  4. 套接口:用于不同机器之间的进程间通信

 

https://blog.csdn.net/runrun117/article/details/80304837

mysql的存储引擎有哪些?都有什么特点?

MyISAM: 拥有较高的插入,查询速度,但不支持事务。

InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定

 

Mysql索引实现原理?

mysql存贮索引的文件一般以页为单位,一个节点相当于一页。不同的存贮引擎,索引实现也不同,

 

InnoDB使用的是聚簇索引,即数据文件就是索引文件,这里又分主键索引和非主键索引。

主键索引:将主键映射到B+树中,而叶子节点就是行数据。

非主键索引:存贮的是主键值,再通过主键的值,去搜索主键索引获得数据。

 

MyISM使用的是非聚簇索引:即索引文件和数据文件分开,叶子节点仅仅存贮了数据文件的地址。这点和oracle的B树索引实现类似,都是存贮了地址。myIsm的主键索引和非主键索引没什么区别,只是存贮的键值列不同,叶子节点都是存贮的数据地址。

 

 

 

Mybatis  #和$的区别?

#是为了防止sql注入问题,会为参数 加上引号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值