java面试题(持续更新)

面试宝典

面试究极基础知识

JDK 和 JRE 有什么区别?

JDk是开发用的工具包提供了java开发环境和运行环境

JRE是JDK中的运行环境,为java运行提供了环境

==和equals

==是逻辑运算,基本类型和引用类型

equals是字符串对比,本质是==原因是string和int重写了equals方法,默认是引用类型比较,重写方法的类改为值比较

hashcode()和equals

对象相等哈希值绝对相等 equals不一定相等

equals被覆盖hashcod也一定被覆盖

java中final的作用

当final修饰类的时候这个类就不可以被继承

当final修饰方法的时候这个方法就不可以被重写

当final修饰的变量叫常量 常量必须初始化 初始化的值不可以改变

String 属于基础的数据类型吗?

String 不属于基础类型,基础类型有 8 种:byte,short ,int ,long,float,dobule,char,boolean

String 属于对象。

基本数据类型分类/转换

基本数据类型

整数类型:byte ,short,int,long
浮点型:float,double
字符型:char
布尔类型:boolean

基本数据类型转换

隐式转换:自动转换/直接转换不需要特殊转换 类型的取值范围从小到大
转换的小公式: byte、short、char->int ->long ->float ->double

注意事项:
boolean不可以与其他类型转换
byte、short 不可以直接转换char
byte,short,char 在计算的时候必须要先转换成int在计算
byte/short/char会有一个默认的强制类型转换

引用数据类型转换

向上转型:小的类型(子类或者实现类)转为大的类型(父类或者接口),其实多态就是一种向上转型
向下转型:的类型(父类或者接口)转为小的类型(子类或者实现类)

格式

小的类型 变量名 = (小的类型)大的类型的数据;

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

String 声明对象的时候是不可变的 每次添加都会生成新的string对象

stringBuffer stringBuilder是在原有的对象基础上操作数据

stringBuffer和stringBuilder的区别是 stringBuffer是线程不安全的 stringBuilder是线程安全的 所以stringbuffer性能高于stringBuilder

当多线程的时候使用stringBuilder

单线程使用 stringBuffer

String str="i"与 String str=new String(“i”)一样吗? /设置string 变量和初始化string对象一样吗

不一样 分配的内存不一样

string声明变量的内存是通过java虚拟机分配到常量池中的

string初始化对象是被堆储存的

如何实现数据反转

实例化stringBuffer对象然后appen数据然后用reverse()方法

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

接口的幂等性

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用

经常用于支付,不会应为手误多提交一次申请

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

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

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

不需要,抽象类不一定非要有抽象方法。原因是抽象类实现方法

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

  • calss类可直接实例化 其中不包含抽象方法
  • 抽象类中包含抽象方法 不能实例化对象

抽象类能使用 final 修饰吗?

不可以 原因是抽象类就是让其他类继承的然后重写实现的 final修饰后由于他的特性导致抽象类不可以被继承 所以不可以

java 中 IO 流分为几种?

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

按类型来分:字节流:按8位字符串单位字符流:按16位字符串单位

来输出和输入

BIO、NIO、AIO 有什么区别?

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

Files的常用方法都有哪些?

  • Files.exists():检测文件路径是否存在。

  • Files.createFile():创建文件。

  • Files.createDirectory():创建文件夹。

  • Files.delete():删除一个文件或目录。

  • Files.copy():复制文件。

  • Files.move():移动文件。

  • Files.size():查看文件个数。

  • Files.read():读取文件。

  • Files.write():写入文件。

    java 容器都有哪些?

    java面试题(持续更新)_第1张图片

Collection 和 Collections 有什么区别?

collection是个集合的接口 它提供了对集合对象的基本接口方法 ,然后为集合提供了最大化统一操作 ,他是直接继承了set集合和list集合

collections是个集合工具类,为集合提供了一系列的静态方法 用于对集合中的元素进行排序,搜索及安全的保障

List Set map

list 和 set 都是继承了接口

list 实现类 AbstractList(ArrayList LinkedList Vector(线程安全))

set 实现类 AbstractSet (HashSet LinkedSet TreeSet)

实现方法List比set多了个get方法(add,remove, , contains,size)

List 元素可重复 有序 ------Set 元素不可重复 无序

map 实现类 HashMap HashTable

实现方法比原来多了好几种(put,containsValue,containsKey KeySet, Values)

map元素不可重复 其中HashTable 为线程安全

HashMap ,HashTable 区别

HashMap去掉了HashTable中(Contains)方法但是添加了(containsValue,containsKey )

HashMap 不同步数据 HashTable同步数据 所以HashMao效率会高很多 但是HashTable线程安全

HashMap 允许控制键 HashTable 不允许控制键

如何決定使用HashMap还是TreeMap

增删改定位用HashMap 有序的key遍历用TreeMap

说一下 HashMap 的实现原理?

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值键。此类不保证映射的顺序。

HashMap的数据结构:HashMap是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们向HashMap中添加put元素的时候根据Hash值获取下标

hashMap的初始长度16字节 扩容后为1.5倍

若是map表这个下标有元素则以链表的模式添加到链表的头/尾(最先添加的到链尾 新添加的到链表头) 没有就直接添加到当前位置

Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率冲O(n)—O(long)

说一下 HashSet 的实现原理?

  • HashSet底层由HashMap实现
  • HashSet的值存放于HashMap的key上
  • HashMap的value统一为PRESENT

ArrayList 和 LinkedList 的区别是什么?

ArrayList 有序 查询快插入慢 基础结构是动态数组 支持随机访问

LinKedList 无序 查询慢插入快 基础机构是 双向循环链表 不支持随机访问

如何实现数组和 List 之间的转换?

  • List转换成为数组:调用ArrayList的toArray方法。
  • 数组转换成为List:调用Arrays的asList方法。

ArrayList 和 Vector 的区别是什么?

  • Vector是同步的,而ArrayList不是 考虑访问同步就使用Vector
  • vector因为有同步所以考虑同步性,性能会比ArrayList慢(ArrayList可以手工同步。
  • ArrayList /Vector 自身容量满了后会自增 (ArrayList/50% / Vector /100%) 因此ArrayList更加节省空间
  • ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

Array 和 ArrayList 有何区别?

  • Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
  • Array是指定大小的,而ArrayList大小是固定的。

在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,

poll() 在获取元素失败的时候会返回空,

remove() 失败的时候会抛出异常。

哪些集合类是线程安全的?

  • vector:比ArrayList多了同步化机制
  • statck:堆栈类 先进后出
  • hashtable:比HashMap多了个线程安全
  • enumeration:枚举,相当于迭代器

Iterator 怎么使用?有什么特点?

(1)iterator()要求容器返回一个Iterator。

(2) 使用next()获得序列中的一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator 和 ListIterator 有什么区别?

Iterator 可以用来遍历set和list集合 ListIterator 只能遍历List集合

Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

ListIterator 实现了Iterator 拥有更多功能:增加元素 替换元素 获取前后索引

break和continue 区别

break直接结束当前的执行进程

continue跳出当前循环执行下个循环

java线程

并行和并发有什么区别?

  • 并行是两个或两个以上事件同一时刻发生;并发指两个或多个事件在同一时间间隔发生。

  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

线程和进程的区别?

一个程序至少有一个进程,每一个进程都会有一个线程, 进程在执行过程中拥有独立的内存单元,线程共享内存资源,减少切换次数,从而效率更高。线程是进程的实体, 同一进程中的多个线程之间可以并发执

守护线程是什么?

守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。

创建线程有哪几种方式?

①. 继承Thread类创建线程类

②. 通过Runnable接口创建线程类

③. 通过Callable和Future创建线程

说一下 runnable 和 callable 有什么区别?

有点深的问题了,也看出一个Java程序员学习知识的广度。

  • Runnable接口中的run()方法的返回值是void,就执行run的基础方法
  • Callable接口中的call()方法返回值的是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

线程有哪些状态

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

线程的 run()和 start()有什么区别?

线程run需要继承Thread来实现 run被称为线程体 通过调用start()方法来启动线程

start()启动一个线程,真正实现了多线程运行。无需等run方法代码执行完,就可以直接继续执行下面的代码;调用run方法使线程重就绪-到运行的 run方法 run方法包含了所有需要执行的数据。结束后线程终止 然后cup才会再调用其他线程

多线程执行时多使用start()方法

创建线程池有哪几种方式?

①. newFixedThreadPool(int nThreads):创建一个固定长度的线程池,

②. newCachedThreadPool():创建一个可缓存的线程池

③. newSingleThreadExecutor():这是一个单线程的Executor,它创建单个工作线程来执行任务,

④. newScheduledThreadPool(int corePoolSize)创建了一个固定长度的线程池,以延迟或定时的方式来执行任务

线程池都有哪些状态

线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。

线程池中 submit()和 execute()方法有什么区别?

  • 接收的参数不一样
  • submit有返回值,而execute没有
  • submit方便异常处理

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

线程安全在三个方面体现:

  • 原子性:提供互斥访问,一次只能对一个线程数据操作 (atomic,synchronized);
  • 可见性:一个线程对主内存的修改可以及时地被其他线程看到; (synchronized,volatile);
  • 有序性:程观察其他线程的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序(happens-before原则)

多线程锁的升级原理是什么?

在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。

java面试题中级

什么是反射

动态获取属性 动态获取对象方法

java中的反射机制:在运行的时候 调用class的类中任意一个属性和方法 ,调用任意信任的对象的属性和方法

什么是 java 序列化?什么情况下需要序列化?

简单说就是为了保存在内存中的各种对象的状态

2、什么情况下需要序列化

想把内存数据以文件夹或者数据库形势保存的时候

通过Rmi传输数据的时候

通过套接字传输对象时候

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

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

就动态创建一个类用来代理,这个类拥有原本类的全部方法

而且还添加的而外处理的新类 具有解耦意义和灵活扩展性

为什么要使用克隆?

因为想对数据做改变又怕出问题失去原有的部分然后就需要克隆

如何实现对象克隆?

有两种方式:

1、实现Cloneable接口并重写Object类中的clone()方法;

2、 实现Serializable接口,通过对象的序列化和反序列化实现克隆

jsp 和 servlet 有什么区别?

jsp经编译后就变成了Servlet.(JSP的本质就是Servlet )

jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

jsp 有哪些内置对象?作用分别是什么?

JSP有9个内置对象:

  • request:接收参数设置参数放回参数
  • response:对接收的参数进行放回前端
  • pageContext:通过该对象可以获取其他对象;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • config:Web应用的配置对象;
  • page:JSP页面本身(相当于Java程序中的this);
  • exception:封装页面抛出异常的对象。

JSP中的四种作用域

page、request、session和application

  • page代表与一个页面相关的对象和属性。

  • request请求相关对象属性以及跳转的时候使用

  • session建立联系并存放数据的

  • application全局作用域

    说一下 session 的工作原理?

session在服务器上类似散列表结构,存放了很多数据。

相当于大号的map,里面存放了sessionID键值,当我们向服务器请求时带上存放的数据就可以取出对应的值

如果客户端禁止 cookie 能实现 session 还能用吗?

可以但是比较麻烦

由于session中的数据是由cookie来传递的禁用了他就传输不了数据也就请求不了对相应的值

解决办法 1、手动url传递值 2、以文件形式保存session数据然后调用 3、修改配置文件php.ini让其自动赋值

springMVc和struts区别

拦截机制不同 ,底层结构不同,性能方面不同,配置方面不同

如何避免 sql 注入?

  1. PreparedStatement(简单又有效的方法)
  2. 使用正则表达式过滤传入的参数
  3. 字符串过滤
  4. JSP中调用该函数检查是否包函非法字符
  5. JSP页面判断代码

xss攻击 样式攻击

xxs又叫css 攻击手段是恶意输出Html对正在浏览的用户,通过插入脚本获取用户信息

XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

什么是 CSRF 攻击,如何避免?

跨站请求伪造

攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令

避免
  1. 验证地址 Http Referer字段

  2. 使用验证码

  3. 请求地址中添加自定义数据token进行验证

  4. 在Http头中自定义属性并验证

    通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中

    XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

异常

throw 和 throws 的区别?

throw 抛出指定一个类型异常

throws抛出所有异常

final、finally、finalize 有什么区别?

final 修饰类不可以被继承

finally :异常中常常用存放关闭资源的代码

finalize object中的方法用来垃圾回收

try-catch-finally中catch可以被忽略嘛

可以: try是运行时异常 catch是普通异常

当只有运行时异常的时候可以忽略catch

finally不可以因为他要结尾关闭这个资源

常见的异常类有哪些?

  • NullPointerException:当应用程序试图访问空对象时,则抛出该异常。
  • SQLException:提供关于数据库访问错误或其他错误信息的异常。
  • IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
  • NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
  • FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。
  • IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
  • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
  • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
  • NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。
  • NoSuchMethodException:无法找到某一特定方法时,抛出该异常。
  • SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
  • UnsupportedOperationException:当不支持请求的操作时,抛出该异常。
  • RuntimeExceptionRuntimeException:是那些可能在Java虚拟机正常运行期间抛出的异常的超类。

网络

http 响应码 301 和 302 代表的是什么?有什么区别?

都代表的htpp的url路径转移

  • 301 代表永久性转移
  • 302 代表暂时性转移

forward 和 redirect 的区别?

forward:直接跳转 redirect 重定向

简述 tcp 和 udp的区别?

  • tcp 面对面传输 udp无线传输
  • tcp安全可靠 udp不保证
  • tcp适用于保密数据传输 udp适用于快速传输
  • tcp 只能单个传输 udp可适用于多传输

get和post的区别

get只能请求url编码 post支持多种请求编码

get路径暴露外面不安全 post安全

get的url中传输的参数长度有限 post中没有

get有痕 / post无痕

如何实现跨域

一、图片ping或script标签跨域

图片ping常用于跟踪用户点击页面或动态广告曝光次数。
script标签可以得到从其他来源数据,这也是JSONP依赖的根据。

二、jsonp访问

是数据json的一种使用,可以让网页从别的网域要数据

缺点:

  • 只能使用Get请求

  • 不能注册success、error等事件监听函数,不易确定JSONP请求是否失败

  • 在加载执行的时候, 容易受到跨站请求伪造攻击

    说一下 JSONP 实现原理?

jsonp 动态创建script标签然后用其src获取js脚本 通过这个特性服务器不在放回json格式而是放回某函数js代码 在src=“调用” 上线跨区域访问

工厂设计模式

几个常用的设计模式

单列设计模式

观察者模式

装饰模式

适配器模式

工厂模式

代理模式

spring/spring MVc

为什么要用spring

简洁 轻量 拥有控制反转和切面功能解决了代码之前的松耦合和业务和服务分区 是个ioc容器拥有框架

spring是什么

是个轻量级的控制反转和面向切面框架

通过控制反转来提高代码的松耦合

通过面向切面来分离业务逻辑和系统服务开发

管理bean的对象配置生命周期

是一个简单配置复杂组合的框架

Ioc的作用

ioc容器 控制反转 依赖注入

存储bend, servlet,接口 反射对象 Component用存储到map中

使用时通过依赖注入放射各种对象的属性数据 启动时xml文件就可以读取

在没有的ioc容器中运行中都是需要主动去创建对象去注入

在加入的ioc容器中运行中都是ioc自动创建对象去注入

把控制权交给spring来自动处理

Aop的作用

面向切面 将交叉的java业务逻辑(安全日志事务)封装成切面 然后注入对象

在满足定义的需求是自动注入

ioc是什么

ioc 是spring中控制反转的

ioc容器为一个耦合的大容器各种代码通过这个容器建立联系存储数据

他就像粘合剂成个主体掌控个个区域进来的代码粘合起来发挥作用

控制反转

没有注入ioc容器时 a依赖于b 那么初始化时必须要手动去创建b对象 主动权在自己手中

注入ioc a依赖于b 那么初始化的时候ioc容器会自动创建一个b调用到a需要的地方

吧控制权交个spring去处理

spring 常用的注入方式有哪些?

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

  1. 构造方法注入
  2. setter注入
  3. 基于注解的注入

spring 支持几种 bean 的作用域?

当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

  • singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
  • prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
  • request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
  • session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
  • globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

spring 事务实现方式有哪些?

  1. 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
  2. TransactionProxyFactoryBean 或者@Transactional 的声明式事务管理
  3. AOP 配置事务

spring MVC运行流程

  1. 用户发送请求 被 DispatcherServlet 截取进行url分析
  2. 得到url路径然后调用HandlerMapping获得Handler所有相关对象
  3. DispatcherServlet 获得Handler选择合适的 HandlerAdapter 开始进行拦截
  4. 提取Request中数据填充Handler入参
  5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象
  6. 根据放回的ModelandView选择 ViewResolver 返回给DispatcherServlet
  7. ViewResolver 结合model和view渲染视图
  8. 将结果放回给用户

DispatcherServlet在spring中起到什么作用

DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,与spring IOC容器无缝集成,从而可以获得Spring的优势。

作用

文件上传的解析

通过 HandlerMapping 请求映射到处理器(HandlerExecutionChain异常 处理器 拦截器 HandlerInterceptor )

通过handlerAdapter 支持多种类型的处理器(HandlerExecutionChain中的处理器)

通过ViewResolver解析逻辑视图名到具体视图实现;

ModelAndView怎么添加属性

request.getAttribute()

spring mvc 有哪些组件?

Spring MVC的核心组件:

  1. DispatcherServlet:中央控制器,把请求给转发到具体的控制类
  2. Controller:具体处理请求的控制器
  3. HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
  4. ModelAndView:服务层返回的数据和视图层的封装类
  5. ViewResolver:视图解析器,解析具体的视图
  6. Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

spring MVC中MVC分别代表啥

M:model 模型,业务流程,业务逻辑。
V:视图,渲染数据。
C:控制:接收客户端请求,分配任务。

spring MVC中ViewResolver作用

视图解析器 解析modelAndview对象中的view

将该逻辑视图View对象解析为一个物理视图View对象;

spring 哪些地方用了哪些设计模式

1.工厂模式和模版模式都BeanFactory以及ApplicationContext创建中都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.策略模式 加载资源文件,在Aop的实现中
5.单例模式,在创建bean的时候。

工程模式 工厂方法 代理模式 策略模式 单例模式 适配器模式 观察者模式 装饰器模式 模板方法模式

视图解析器

定位物理解析器 :接收modelAndview/view中的数据

ModelAndview的使用和详解

Modelandview是连接Model(模型层)和View(视图)数据承载工具类

作为载体就是吧model接收的数据传输给view然后渲染前端jsp

Model和ModelAndView区别

Model 利用其addAttribute()方法即可将服务器的值传递到jsp页面中 然后返回视图就好了;
ModelAndView包含model和view两部分,使用时需要自己实例化,利用ModelMap用来传值,

addobject 来设置Attribute参数名和参数值 setViewName设置视图名称 然后解析视图找到路径传输数据

json的作用

json是一种数据交换格式

将后对象和数组分装以json的形式发送到前端 前端用js去调用json加密过的数据渲染页面

优点

安全保密-轻便简介易上手-JavaScript原生支持 最大限度切合后端代码

占用字符数量极少,特别适合互联网传递

Mysql

mysql 的内连接、左连接、右连接有什么区别?

内连接关键字:inner join;左连接:left join;右连接:right join。

SQl优化

建立索引

修改编码方式的改变

子查询中in和exists区别

in先查子表 exists先查主表再查子表然后判断条件

not in 和not exists

not in 那么内外表都进行全表扫描,没有用到索引

not extsts 的子查询依然能用到表上的索引

所以无论那个表大,用not exists都比not in要快。

聚合函数

sum() 求和

avg() 求平均(期望)

max() 最大值

min() 最小值

conut() 计数(求有多少个记录)

last() 最后一条数据

first()第一条数据

Mysql比较运算符

比较运算符 说明
= 等于
< 小于
<= 小于等于
> 大于
>= 大于等于
<=> 安全的等于,不会返回 UNKNOWN
<> 或!= 不等于
IS NULL 或 ISNULL 判断一个值是否为 NULL
IS NOT NULL 判断一个值是否不为 NULL
LEAST 当有两个或多个参数时,返回最小值
GREATEST 当有两个或多个参数时,返回最大值
BETWEEN AND 判断一个值是否落在两个值之间
IN 判断一个值是IN列表中的任意一个值
NOT IN 判断一个值不是IN列表中的任意一个值
LIKE 通配符匹配
REGEXP 正则表达式匹配

order by和group by的区别

order by: 排序 desc降序 asc升序 默认是升序

group by:分组查询

索引

普通索引

加快以莫字段访问速度

主键索引和唯一索引

主键一定是唯一性索引。

但是一张表中可以有多个唯一性索引,所以唯一性索引不一定是主键。

保证数据的唯一性

外键索引

study表中study_name属性和teacher表中的study_name表建立联系

这时就建立起联系study中study_name有的属性 teacher中的study_name才可以入参

好处就是删除study中的属性时teacher中对应的属性也会发生改变

大大减少查询带来的负担 若是没有加索引就是建立了联系需要去删除数据时就会响应很长时间

加了索引就可以快速定位关联数据然后响应

全文索引

Mybatis

mybatis 中 #{}和 ${}的区别是什么?

  • #{}是预编译处理,${}是字符串替换;
  • #{}在mapper.xml中吧条件?变成#{}来条件查询
  • ${}换成变量值
  • 使用#{}可以有效的防止SQL注入,提高系统安全性。

mybatis 有几种分页方式

  1. 数组分页
  2. sql分页
  3. 拦截器分页
  4. RowBounds分页

mybatis 逻辑分页和物理分页的区别是什么?

  1. 逻辑分页:将数据一次性从数据库查出到内存中,在内存中进行逻辑上的分页

  2. 物理分页:直接特定的SQL语句,只从数据库中查询出需要的数据

    mysql自带的RowBounds分页属于逻辑分页

    物理分页优于逻辑分页 (具体看实际)

说一下 mybatis 的一级缓存和二级缓存?

一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

二级缓存:也是采用 PerpetualCache,HashMap 存储,其存储作用域为 Mapper(Namespace),并且可自定义存储源。默认关闭需要自启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

接口如何实现安全性

私密

防止恶意刷 防刷

访问地址加密 实现是由尾连接实现的

接口如何实现安全性

Token授权机制

登录成功后服务器放回前端一个带有一个到规定时间自动销毁的token

Token-UserId以键值对的形式存放在缓存服务器中

发起请求判断token的有效性若是无效则需要重新登录获取新的token

怎样防重放攻击

保证timestamp和nonce针对每个API保持唯一性

基于时间戳(timestamp)的方案
  1. 每次http请求都要把timestamp和其他参数绑定数字签名一起返回
  2. 由于正常一次请求服务器都不会超过60秒,他发送的http请求我们通过时间戳来判断是否超过60若是就认为非法请求

缺点也很明显 一个“逗比“通过连点器在时间戳的60秒内疯狂响应

基于nonce的方案
  1. 每次请求返回仅一次有效的随机数
  2. 每次请求都要保证参数的不同 所以和时间戳有关
  3. 每请求一次都吧nonce保存到数据库中。处理请求就进行判断数据库中是否有存在,若是没有就是非法请求
  4. 因为随机数在成千上百万次的生成难免会出现相同的数所以就是按时间戳来保存的

缺点就是 怎么多数据都保存下来你的服务吃的消嘛

[最佳方案]timestamp和nonce的方案结合

nonce的一次性可以解决timestamp参数时间限制的问题,timestamp可以解决nonce参数在数据库“集合”越来越大的问题。在timestamp方案的基础上,加上nonce参数,由于对参数不能超过60秒的特性,我们只需要储存60秒的nonce参数即可

如何正确生成timestamp

当前时间-当前时间+服务时间

LocalTime2(当前本地时间) - LocalTime1 + ServerTime

怎样防篡改攻击

签名机制

算法:signature(签名) = MD5算法(token+timestamp+nonce+业务参数)

将“API接口中的token、timestamp、nonce、业务参数"进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。

具体流程:

  • 请求参数包括token、timestamp、nonce、业务参数、客户端signature(签名)
  • 将token、timestamp、nonce、业务参数以字母升序(A-Z)排序,按’key1=value1’+ ‘&’ + 'key2=value2’连接所有参数得到字符串signStr
  • 将字符串signStr进行MD5运行得到新的签名newSignature
  • newSignature和客户端发送的signature做比较

IP白名单

给部分人的ip授权其余人不允许访问

总结

只有在token还生效、timestamp未超60秒、缓存服务器中不存在nonce都满足的前提下,接口请求才有效。服务端可以写一个过滤器对token、timestamp和nonce进行过滤和验证

接口可以多实现吗?

  1. ​ 不可以,接口就没有实现一说只有继承
  2. ​ 一个接口可以继承多个接口
  3. 抽象类和普通类一样,因为抽象类中可以有普通的方法(带有方法体),也可以有抽象方法,所以抽象类可以实现多个接口。
  4. 所以抽象类只能单继承 接口多继承

如何加密接口 此内容截取[ 作  者:Testfan Kitty ]( 知乎 (zhihu.com) )

hash算法

对一段用MD5加密的编码用hash算法来解密

摘要算法

对明文编码生成信息摘要,以防止被篡改。比如MD5使用的是Hash,无论多长的输入,MD5都会输出长度为128bits的一个串。

摘要算法不要秘钥,客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文

对称加密

对称加密算法是共享密钥加密算法,在加密解密过程中,使用的密钥只有一个。发送和接收双方事先都知道加密的密钥,均使用这个密钥对数据进行加密和解密。

**数据加密:**在对称加密算法中,数据发送方将明文 (原始数据) 和 加密密钥一起经过加密处理,生成复杂的密文进行发送。

数据解密:数据接收方收到密文后,使用加密的密钥及相同算法的逆算法对加密的密文进行解密,将使其恢复成可读明文。

非对称加密

非对称加密算法,有两个密钥,一个称为公开私钥 (publickey),另一个称为 私有密钥 (private key),加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。

如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密

如果使用私钥 对数据进行加密,只有用对应的公钥才能进行解密

常见加密算法的处理方式

根据上述常见的加密算法,测试人员在测试不同的加密接口可采用下述的方法处理加密接口

**摘要算法(MD5.SHA1 ):**造接口数据前调用MD5,SHA1进行编码,服务端对比编码后的字符串是否一致。

**对称加密算法(AES,DES ):**造接口数据前从开发获取对称公钥,基于对称公钥可以加密请求数据,解密响应报文。

**非对称加密算法(RSA):**造接口数据前从开发获取公钥私钥去加密解密接口数据

下面以Jmete为例介绍如何实现加密接口的处理,目前有一接口在服务器实现逻辑处理以前会对接口数据进行SHA加密,服务器获取到加密接口数据以后先解密和验证数据是否合法有效,再进行逻辑处理。针对这种接口测试的时候,在发起请求以前,我们需要对接口进入如下特殊处理:

和开发沟通接口加密的算法以及需要的信息,如果是SHA加密,和开发沟通获取加密的秘钥,以及加密和编码的关键字符串

发起接口请求以前对接口明文数据进行预处理,在Jmeter的接口实现中,可以通过添加Beanshell脚本,在Beanshell脚本中基于上一个步骤获取到的信息,采用和服务端相同的加密方法和加密流程对接口明文进行加密和编码

基于加密后的密文发起加密请求

如何判断一个人是否在刷接口

对其电脑的ip进行获取若是他一直请求就弹出窗口警搞或者添加滑块和验证码

聚合函数和分组函数的联系

1、是否考虑这个列是否会对这个分组函数造成影响

2、聚合函数不和分组函数的列相关 分组函函数不和聚合函数的列相关

你可能感兴趣的:(面试题,基础,java,面试,开发语言)