话术(自用)


Day01

Equals和==的区别,重写时需要和hashcode一起重写吗?   compareable接口

所有类的基类是什么?该类有哪些常用方法

Object :equals notify toString wait  hashcode getClass

Spring两大特点

Ioc  aop

Ioc:控制反转    aop:面向切面编程

Ioc: 以前:对象的创建,对象生命周期的维护,是用单例还是原型啊,还有这个对象之间关系的维护,都是程序员负责的,那就需要程序员关注这个技术实现,不然就可能会导致一些问题

现在:以上的这些技术问题全部交由spring容器来处理

Aop: 面向切面编程,他解决的就是事务处理,日志处理,性能检测啊等等这些和业务没有关系的功能代码,我们使用切面的思想完成

Ioc: 其实我认为ioc核心其实就是个map   将对象通过xml,或者注解进行配置,然后通过反射生成对象,然后将这个对象放入map中

Aop:底层实际上运用的是代理模式,他体现了非侵入式开发,我们写代码要遵循开闭原则,代理模式就属于对扩展开放。

事务的四大特性及含义

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

hashMap的底层实现原理

XML解析方式和区别

Dom4j  sax  jdom


Day02

进程,线程

什么是线程安全,解释下

Hashmap

Xml解析     

dom,sax   dtd文档类型定义文件

集合框架

Collection

List ArrayList  Vector  linkedlist

Set  hashset  treeset

Map

Hashmap  treemap

Collections

Arrays

并发编程三要素   可见性,原子性,有序性

volatile特性:

  • 保证可见性
  • 不保证原子性
  • 禁止指令重排序

如何解决原子性问题

  • CAS机制:AtomicInteger number = AtomicInteger(0)
  • 锁机制:synchronized、Lock

为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序

你在哪些地方用到过volatile

   单例模式(双重检查锁DCL)

   读写锁手写缓存

   CAS JUC包中大量使用volatile

如何保证底层操作的有序性和可见性    内存屏障。

内存屏障是被插入两个CPU指令之间的一种指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障有序性的。另外,

为了达到屏障的效果,它也会使处理器写入、读取值之前,将主内存的值写入高速缓存,清空无效队列,从而保障可见性

Day03

  1. springmvc运行流程

SpringMVC的执行流程 - 宫新程 - 博客园

      Springbean的生命周期

实例化bean对象(通过构造方法或者工厂方法)
设置对象属性(setter等)(依赖注入)
如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
调用Bean的初始化方法
将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
使用Bean
容器关闭之前,调用Bean的销毁方法

   创建容器

   依赖注入

注解方式

在 bean 初始化时会经历几个阶段,首先可以使用注解 @PostConstruct , @PreDestroy 来在 bean 的创建和销毁阶段进行调用:

InitializingBean, DisposableBean 接口

还可以实现 InitializingBean,DisposableBean 这两个接口,也是在初始化以及销毁阶段调 用:

自定义初始化和销毁方法

实现 *Aware 接口

*Aware 接口可以用于在初始化 bean 时获得 Spring 中的一些对象,如获取 Spring 上 下文 等。

BeanPostProcessor 增强处理器

实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的 两个方法,可以用于对一些特殊的 bean 进行处理:

Spring Bean的生命周期(非常详细) - Chandler Qian - 博客园

@AutoWired

Private EmpMapper empMapper;

Context.put(key,value);

Springbean的作用域 scope:    

singleton  prototype  request  session  globalSession

Spring bean的注入方式有哪些?

setter注入  构造器注入  静态工厂注入  非静态工厂

Autowired 和  resource的区别

@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配

Day04

 final 在 java 中有什么作用?

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

String str = i;String str2=new String("i");

System.out.println(str == str2 ) 为false

3. String StringBuffer StringBuilder的区别

StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰。

StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。

执行效率 StringBuilder不安全所以效率高

StringBuffer 适用于用在多线程操作同一个 StringBuffer 的场景,如果是单线程场合 StringBuilder 更适合。

4. 讲讲对反射的理解,有什么用处

对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

通过反射获取类属性、方法、构造器

如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法

运行期间获取类的各种信息,不硬编码 不用重新编译

什么是序列化,反序列化

获取所有的信息 数据类型  

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程

———————————————————————————————————————

**序列化:  **对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

**反序列化:**客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

———————————————————————————————————————

本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。

原文链接:序列化和反序列化的底层实现原理是什么?_徐刘根的博客-CSDN博客_什么是序列化


Day05

工作的组织架构:

开发部   测试部  运维部

项目的组织人员:美工( 0.5 )   前端(nodejs  移动端【android ios  h5  pc】2,3)   后端[5]   测试 [1,2]  运维【1】 产品   项目环境:开发环境  测试环境  线上环境  

十几个

项目过程:

招投标: 评审   cobol

  1. 立项    确定组织架构   确定里程碑【发版本】
  2. 需求分析    组织架构    需求文档,原型图
  3. 设计阶段    接口文档   数据库设计  概要设计   详细设计
  4. 开发阶段    开发阶段
  5. 测试阶段    测试  白盒测试  黑盒测试  压力测试   冒烟测试
  6. 上线维护

Version1.0.0  主业务流程,能浏览,能下单,支付   2月

    1. Xx   3天   整合  联调【bug】 1.0.1  测试
    2. Xxx  4天

修bug   回归测试

1.3 xxxx

1.*

Version2.0   

项目开发模型: 原型模型   敏捷开发  瀑布式开发

你们项目中多少人,分别负责哪些

项目开发阶段有哪些

Day06

1 Mylsql 索引的底层原理

2 Sql优化,如何防止索引失效

——————————————————————————————————

在查询的数量比较多的时候可以给表添加索引,一般来说选择where或者order by后的条件作为索引。使用索引的时候,要尽量避免使索引失效

(1)避免使用null值进行判断,因为null会让数据库放弃索引而进行全表扫描。

(2)查询条件中有<>、NOT、in、not exists、!= 时,也会进行全表扫描。

(3)模糊查询时,应该使用后匹配而不是前匹配,前匹配也会使索引失效。例如:like ‘%abc’ 就会使索引失效,like 'abc%'就不会。

(4)在查询条件中尽量不要包含函数和运算。例如:select * from employee where id/2 =‘123’;

(5)当查询条件中存在隐式转换时,索引会失效。例如:select * from employee where id=‘123’;

(6)查询条件尽量不要使用or来连接。

——————————————————————————————————

3 Mybatis 中 # 和 $ 的区别

1 #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成 sql 时的值为 order by “111”, 如果传入的值是 id,则解析成的 sql 为 order by “id”.

2 $将传入的数据直接显示生成在 sql 中。如:order by $ user_id $,如果传入的值是 111,那么解析成 sql 时的值为order by user_id, 如果传入的值是 id,则解析成的 sql 为 orderby id.

3 #方式能够很大程度防止 sql 注入。

4 $方式无法防止 Sql 注入。

5 $方式一般用于传入数据库对象,例如传入表名.

6 一般能用#的就别用$.

4 redis的常见问题,产生的原因 及 解决方案

雪崩  缓存中大量key失效时,引发大量查询数据库

穿透  缓存穿透是在指查询一定不存在的数据时,由于当缓存不命中时需要从数据库中查询,查询不到数据则不写入缓存,这将导致每次请求这个不存在的数据时都要去数据库中查询

击穿  指缓存中没有但数据库中有的数据(一般是缓存时间到期),假如瞬间突然涌入大量的请求(并发特别多),来请求同一个Key,这些请求不会命中Redis(读缓存没读到),都会请求到DB(去数据库去获取数据),导致数据库压力瞬间过大,有可能宕机。

5 事务:隔离级别  传播特性

1、READ_UNCOMMITTED

读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用

2、READ_COMMITED

读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读

3、REPEATABLE_READ

重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决

4、SERLALIZABLE

串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

传播特性

 1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启

 2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

 3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

 4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

 5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。

 6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常

 7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,

      则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

Day07

单点登陆

实现原理

项目中的解决方案   cas+spring security       jwt

1 Cookie和session的区别

cookie在客户端,session 服务器端

Session是基于cookie或url重写实现的

2 单点登陆的底层实现原理

sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理

3 项目中单点登陆是如何实现的

  1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;
  2. sso认证中心发现用户未登录,将用户引导至登录页面;
  3. 用户输入用户名密码提交登录申请;
  4. sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌;
  5. sso认证中心带着令牌跳转会最初的请求地址(系统1);
  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效;
  7. sso认证中心校验令牌,返回有效,注册系统1;
  8. 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源;
  9. 用户访问系统2的受保护资源;
  10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;
  11. sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌;
  12. 系统2拿到令牌,去sso认证中心校验令牌是否有效;
  13. sso认证中心校验令牌,返回有效,注册系统2;
  14. 系统2使用该令牌创建与用户的局部会话,返回受保护资源。

4 转发【服务器跳转】和重定向【客户端】的区别

转发因为是服务器跳转所以地址会发生改变

重定向是客户端跳转所以不会改变地址


Day08

git常用命令有哪些

git init   git clone [url]     git config      git add     git rm     git mv     git commit    git checkout     git push      git branch    git tag    git push    git show     git reset

如果线上版本出问题了,git如何处理

先查看远程分支,确定将要修复的那个分支,然后创建新的分支,然后拉取到本地仓库进行开发,开发完成之后提交开发完的内容,push到远程分支然后合并修改的内容推送到线上更新然后 删除创建的分支

Git管理的文件的状态有哪些

untracked:未跟踪,此文件未加入到git库,不参与版本控制。

unmodify:文件已入到git库中,未修改,文件内容与本地库的文件快照内容完全   一致。

modified:文件已入到git库中,经过修改,文件内容与本地库的文件快照内容不        一致。

staged:暂存状态。


Day09

***Jvm的内存结构

preview

1.程序计数器 PC Register

  每个线程都有一个程序计算器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。

2.本地方法栈 Native Method Stack

  Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies

  本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务

3.方法区  Method Area

  用于存储虚拟机加载的:静态变量+常量+类信息+运行时常量池 (类信息:类的版本、字段、方法、接口、构造函数等描述信息 )

  默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小

4.栈 JVM Stack

  编译器可知的各种基本数据类型(booleanbytecharshortintfloatlongdouble)、对象引用(引用指针,并非对象本身)

  栈是java 方法执行的内存模型:

  每个方法被执行的时候 都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。

  每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

       栈的生命期是跟随线程的生命期,线程创建时创建,线程结束栈内存也就释放,是线程私有的。

5.堆  Java Heap

  所有的对象实例以及数组都要在堆上分配,此内存区域的唯一目的就是存放对象实例

  堆是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建

  堆是理解Java GC机制最重要的区域,没有之一

  结构:新生代(Eden区+2个Survivor区)  老年代   永久代(HotSpot有)

  新生代:新创建的对象——>Eden区 

  GC之后,存活的对象由Eden区 Survivor区0进入Survivor区1   

  再次GC,存活的对象由Eden区 Survivor区1进入Survivor区0 

  老年代:对象如果在新生代存活了足够长的时间而没有被清理掉(即在几次Young GC后存活了下来),则会被复制到老年代

  如果新创建对象比较大(比如长字符串或大数组),新生代空间不足,则大对象会直接分配到老年代上(大对象可能触发提前GC,应少用,更应避免使用短命的大对象)

  老年代的空间一般比新生代大,能存放更多的对象,在老年代上发生的GC次数也比年轻代少

  永久代:可以简单理解为方法区(本质上两者并不等价)

Jdk1.6及之前:常量池分配在永久代

  Jdk1.7:有,但已经逐步“去永久代”

  Jdk1.8及之后:没有永久代(java.lang.OutOfMemoryError: PermGen space,这种错误将不会出现在JDK1.8中)

6.直接内存  Direct Memor

  直接内存并不是JVM管理的内存,可以这样理解,直接内存,就是JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存

  JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用

  由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。

Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

Gc算法,gc root根

引用计数法,根搜索算法,标记清除算法,复制算法,标记整理算法

一、什么是垃圾

内存中已经不再被使用到的空间就是垃圾

二、要进行垃圾回收,如何判断一个对象是否可以被回收?

  • 引用计数法

        很难解决对象之间的循环引用问题

  • 枚举根节点做可达性分析

        通过一系列名为“GC Roots”的对象作为起始点,从“GC Roots”对象开始向下搜索,如果一个对象到“GC Roots”没有任何引用链相连,说明此对象可以被回收。

三、哪些对象可以作为 GC Roots 的对象:

  • 虚拟机栈中局部变量(也叫局部变量表)中引用的对象
  • 方法区中类的静态变量、常量引用的对象
  • 本地方法栈中 JNI (Native方法)引用的对象

gc1:是虚拟机栈中的局部变量

gc2:是方法区中类的静态变量

gc3:是方法区中的常量

都可以作为GC Roots 的对象。

双亲委派

双亲委派模型构成组件

1. 启动类加载器

引导类装入器是用本地代码实现的类装入器,它会负责将 /libwen下面的类库加载到内存中。引导类加载器由于涉及到虚拟机本地实现细节,程序员无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

2. 扩展类加载器

扩展类加载器是由 Sun 的 ExtClassLoader实现的。它负责将< Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。程序员可以直接使用标准扩展类加载器。

3. 系统类类加载器

系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。程序员可以直接使用系统类加载器

4. 自定义类加载器

双亲委派模型工作过程

当一个类加载器收到了类加载的请求,它不会先自己去加载这个类,而是会把这个请求委派给父类加载器完成。每个类加载器都会这样,只有当父类加载器在自己搜索范围内找不到指定类ClassNotFoundException时,子加载器才会尝试自己去加载。

  1. 应用程序类加载器会去找他的父亲扩展类加载器去帮它加载这个Study这个类。
  2. 扩展类加载器这个时候也会去请求他自己的父亲启动类加载器去帮忙加载Study这个类。
  3. 启动类加载器找了一圈发现这个Study并不在他的加载范围内,然后,就说不在我这儿,你自己去找。
  4. 扩展类就自己找,也找了一圈,仍然是没找到,就会下发他的儿子,你自己的类,你自己找去
  5. 应用程序类加载器这个时候就会自己找Study这个类,然后给加载进JVM中

***类加载机制

加载-->验证-->准备-->解析-->初始化-->使用-->卸载

类在被使用的时候就会被加载进JVM中。

类的连接主要是指类验证、准备以及初始化的过程

  1. 验证阶段:是指我们加载进来的class文件是否合法,有没有被篡改等
  2. 准备阶段:就是将我们加载来的类分配相应的内存空间,以及给变量指定初始值等,例如,private int type; 这种的
  3. 解析阶段:这个主要是将符号引用替换为直接引用的过程

在new一个对象的时候,这个时候就会触发类的加载到初始化的全过程。

包含main()方法的类,需要立马初始化。

如果在初始化一个类时,发现他的父类没有进行初始化,那么就得先初始化父类。

Day10

数据库设计

规范:三范式     冗余

规范【扩展性好】    性能

三范式:

1NF: 即表的列的具有原子性,不可再分解字段不可再分

2NF: 表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现一张表只存储一种数据

3NF: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. [不存在传递依赖]

redis常见问题:

  1. Redis有哪些数据类型

String  hash  有什么区别啊?

数据类型的底层实现:   zipable  atomic

项目强制使用字符串: 前缀   有效时间

Order:order:1      “”   json

  1. 单线程?为什么快, 多线程?
  2. Redis哪些应用场景

缓存:具体场景,电商商品列表,广告   【规则引擎】  1分钟

分布式session:  SSO

接口幂等性: 防止重复下单,重复支付

分布式锁:1 setNx   2.如何防止死锁  3. 释放别人的锁   4. 原子性【lua】   超卖

定时监听:下单,5分钟内付款   redis key失效监听

  1. redis集群哪些方式

主从[3主3从]   哨兵    rediscluster[怎么搭]

淘汰策略

  1. Rediskey的删除策略   set    expireTime    ttl

惰性删除 定时删除

  1. Zookeeper,  eureka, nacos比较
  2. Mybatisplus 优点

学习文档存放处:

1. java基础知识总结 超详细_try_and_do的博客-CSDN博客_java基础知识点总结归纳

2. (12条消息) java技能提升计划_南京小孔的博客-CSDN博客_java提升计划和目标

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值