面试题~持续更新

面试题总览

1.数据库关键字执行顺序
答:
	1、from
	2、on
	3、join
	4、where
	5、group by
	6、column or(聚合函数)
	7、having
	8、select
	9、distinct
	10、order by
	11、limit
2.mysql与oracle的区别
答:
	1.mysql默认端口:3306,oracle默认端口:1521
	2.mysql:默认用户是root,用户下可以创建好多数据库,oracle:创建一个数据库,
	数据库下有好多用户
	3.mysql主键自增,oracle没有自动增长类型,主键一般使用的序列
	4.mysql默认是自动提交,可以修改为手动提交,oracle默认不自动提交,需要手动提交
	5.都支持serializable串行化事务隔离级别,可以实现最高级别的读一致性
	6.mysql的默认隔离界别:可重复度,oracle的默认隔离级别是:读已提交。
3.事务的四大特性 与隔离级别
答:
		1.原子性--->事务中所有的操作都是不可在分割的原子单位。事务中的所有操作要么全部成功,要么全部失败。
		2.一致性--->事务执行前和事务执行后保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
		3.隔离性--->隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
		隔离级别:
		a.读已提交:一个事务只能看见已经提交事务所做的改变---支持可重复度。
		b.读未提交:所有事务都可以看到其他未提交事务的执行结果。
		c.可重复度:它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
		d.串行化:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
		4.持久性--->一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
3.索引的创建 什么时候失效 索引的分类
答:
	1.索引就是为了提高查询效率的一种机制
	2.什么时候创建索引:
	   ① 数据量庞大
	   ② 该字段经常出现在where子句的后面作为筛选条件出现
       ③ 该字段很少进行DML操作(insert、delete、update)(DML操作后,索引需要重新排序。)
    3.索引的分类:
        a.主键索引
        b.唯一索引
        c.复合索引
        d.单列索引
    4.索引的失效:
    	a.使用模糊查询时,以”%“开头索引会失效
    	b.where筛选条件中,or语句中前后字段没有同时都为索引
    	c.使用复合索引时,未使用左侧的列查找
    	d.where筛选条件中索引使用了函数
4.jdbc的步骤
答:
	1.注册驱动--通过反射 class.forName
	2.获取数据库的连接--通过url("jdbc(这是协议以jdbc开头):mysql(这是子协议,数据库管理系统称)://localhost(数据库来源地址):3306(目标端口)/test(要查询的表)?")与用户账号密码 利用向上转型获取Connection接口类对象连接到数据库
	3.获取传输器--  传输器一:Statement()传输器,有sql注入风险。
  							  传输器二:prepareStatement(sql); 是先把SQL骨架发给数据库执行,使用占位符?设置参数
  4.执行sql语句,获取结果集
  5.处理查询结果集
  6.释放资源
5.spring的创建方式
答:
	1.映射文件 xml方式创建--加载完就创建
	2.注解方式创建 --单例多例 单例 --多例懒加载
6.依赖注入的方式
答:
	1.Set方法注入--注解Autowired和配置文件bean name 和class全路径
	2.构造器注入--构造方法注入是指带有参数的构造函数注入
	3.静态工厂的方法注入--通过静态工厂类注入
	4.实例工厂的方法注入--首先new工厂类,再调用普通的实例方法
6.springmvc执行流程
答:在这里插入图片描述
	1.前端发送请求到前端控制器。
	2.前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。
	3.HandlerMapping返回执行链,包含了2部分内容: ① Handler对象、② 拦截器数组。
	4.前端处理器通过处理器适配器包装后执行Handler对象。
	5.Handler处理业务逻辑。
	5.Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。
	6.将ModelAndView返回给前端控制器。
	7.但是前端控制器不能解析,交给视图解析器,解析成真正的视图对象(View)给前端控制器。
	8.(此时前端控制器中既有视图又有Model对象数据)前端控制器根据模型数据和视图对象,进行视图渲染。
	9.返回渲染后的视图(html/json/xml)。
	10.给用户产生响应。
7.mybatis ${} 与#{} 区别?
答:
	1.都可以获取map中的值或者pojo对象属性的值。
	2.#{}:是以预编译的形式,将参数设置到sql语句中;使用的传输器是PreparedStatement;可以有效的防止sql注入。
	3.${}:取出的值直接拼装在sql语句中;会有sql安全问题。
8.mybatis 怎么解决字段名与属性名不一致?并且为什么要一致?
答:
	1.为什么一致:mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 如果找不到setxxx() , 就会返回null ;
    2.解决方法1:使用结果集映射--->ResultMap 【推荐】。
    3.解决方法2:为列名指定别名。
9. 一级缓存,二级缓存,三级缓存
答:
	1.如果有大量相同的请求查询数据库,则数据库需要执行多次重复的sql,那么并发压力高,查询效率低. 如果使用缓存机制,则可以极大的提升用户的查询的效率
	2.使用同一个SqlSession时,进行多次数据库的查询,数据库只查询一次。一级缓存Mybatis默认开启
	3.缓存失效?当在一个缓存作用域中发生了update、insert、delete 动作后,将会触发缓存失效,下一次查询将命中数据库,从而保证不会查到脏数据。
	4.userMapper.xml中使用cache标签,使二级缓存生效
	5.在多线程条件下.数据如果需要共享,必须序列化
	6.生产环境中(集群:多个服务器)使用二级缓存可能存在问题,使用Redis高级缓存服务器代替
10.重写与重载
答:
	1.重载:多个同名函数同时存在,具有不同的参数个数/类型。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
	2.重写:遵循”两同两小一大“原则。即方法名与参数列表相同,子类返回值类型与抛出异常必须小于或者相等父类,子类修饰符权限大于等于父类修饰符权限。
11.抽象类与接口的区别
答:
	1.接口是一种用interface定义的类型
	   抽象类是一种用class定义的类型
	2.接口中的方法都是抽象方法,1.8新特性后 可以有默认方法
		抽象类中的方法不做限制
	3.接口中的都是静态常量
		抽象类中可以写普通的成员变量
	4.接口中没有构造方法,不可以实例化
		抽象类中有构造方法,但是也不可以实例化
	5.接口可以多继承,抽象类只能单继承
12.静态方法能否调用非静态方法
答:
	1.不能,静态方法无法调用非静态方法。即等同于已存在的对象调用暂且不存在的对象
	2.静态方法开始加载的时候就在内存中分配了区域,非静态方法只有在这个方法的对象被调用时才会去内存中分配区域。
13.面向对象的三大特征:封装继承多态
答:
	1.封装。将一些属性和相关方法封装在一个对象中,对外隐藏内部具体实现细节。内部实现,外界不需要关心,外界只需要根据”内部提供的接口“去使用就可以。使用起来更加方便,保证数据的安全,利于代码维护。
	2.继承。一个类”拥有“另外一个类的”资源“的方式之一。方便资源重用
	3.多态。在继承的前提下;使用不同的子类,调用
	父类的同一个方法,产生不同的功能
14.String、StringBuffer与StringBuilder之间区别
答:
	1.String Stringbuffer Stringbuilder 都是底层封装char数组 ,用来储存字符串,操作字符串 。
	2.string :源码是用final修饰和private私有,不可更改,之所以可以重新赋值是因为,生成了新的对象(final修饰保持的是地址值不变,内容可变,所以可以修改值),所以string操作字符串会生成很多垃圾对象,占用大量内存尤其是放到循环体中,会严重拖慢程序效率
	3.stringbuffer 和stringbuilder这两个操作字符串时不会产生新的对象,能直接在原对象上增删改查,因为Stringbuffer 加了同步锁,效率慢,但是在多线程环境下就很安全。
	5.Stringbulider可变类,效率快,但单线程环境下不安全

三者应用环境不同。
6.string:适合字符串更改少量的一般环境下。
7.stringbuilder:适合用于 单线程字符串 增删改查多的环境下。
8.stringbuffer:适合用于 多线程字符串 增删改查多的环境。

15.int和Integer的区别

答:
	1.int 是基本类型,4字节,65535。
	2.Integet 是包装类型,属于引用类型,默认值是null。
		Integer默认常量池取值范围-128~127 常量池内取值高效 多个数据可以取同一个值。

16.什么事自动装箱与自动拆箱

答:
	1.自动装箱其实就是将基本数据类型转换为引用数据类型(对象)。
	2.自动拆箱其实就是将引用数据类型转化为基本数据类型。

17.线程创建四种方式

答:
	1.继承Thread类创建线程。
	2.实现Runnable接口创建线程。
	3.使用Callable和Future创建线程。
	4.直接在线程池取用,例如用Executor框架。

18.什么是io流

答:
	1.I/O流是指Input/Output:输入输出机制,输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。输出机制:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)
	2.文件字节输入流读取文件内容的步骤:
  • a.创建流对象。
  • b.创建一个缓存字节的容器数组。
  • c.定义一个变量,保存实际读取的字节数。
  • d.循环读取数据。
  • e.操作保存数据的数组。
  • f.关闭流。

3.文件字节输出流写入文件内容的步骤:

  • a.选择流:创建流对象
  • b.准备数据源,把数据源转换成字节数组类型
  • d.通过流向文件当中写入数据
  • e.刷新流
  • f.关闭流

19.List和set的区别

答:

1.list和set都是继承Collection的子类,,Map则不是。
2.list有序,可以重复,set元素唯一,根据实现类判断TreeSet有序,HashSet无序。
3.list 可以通过索引直接操作元素,Set不能根据索引获取元素
4.ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素。LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素。Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
5.set实现类HashSet底层数据结构采用哈希表实现元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的。
具体实现唯一性的比较过程:存储元素首先会使用hash()算法函数生成一个int类型hashCode散列值,然后与已经所存储的元素的hashCode值比较,如果hashCode不相等,则所存储的两个对象一定不相等,此时存储当前的新的hashCode值处的元素对象;如果hashCode相等,存储元素的对象还是不一定相等,此时会调用equals()方法判断两个对象的内容是否相等,如果内容相等,那么就是同一个 对象,无需存储;如果比较的内容不相等,那么就是不同的对象,就该存储了,此时就要采用哈希的解决地址冲突算法,在当前hashCode值处类似一个新的链表, 在同一个hashCode值的后面存储不同的对象,这样就保证了元素的唯一性。
6.hashSet默认初始化容量16,加载因子0.75。
7.Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模, 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。
8.TreeSet底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性.

20.什么是Map集合

答:

1.Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。HashMap 非线程安全。
2.Map中存放的是k-v键值对,Set中存放的是单个对象,但如果把value看做key的附庸,key在哪里,value就在哪里,这样就可以像对待Set一样来对待Map了。事实上,Map提供了一个Entry内部类来封装key-value对,再计算Entry存储时则只考虑Entry封装的key。如果把Map集合里的所有value放在一起来看,它们又类似于一个List,元素可以重复,每个元素可以根据索引来找,只是Map中的索引不再是整数值,而是以另一个对象作为索引。

21.oracle怎么实现分页查询

答:

1.mysql中,我们使用limit实现分页。
2.oracle中,使用rownum的关键字来实现
select * from user where rownum <=8

22.mybatis中怎么实现分页

答:

1.使用分页插件工具插件工具PageHeper,使用插件Page对象,传入参数。使用selectPa个方法()进行分页查询
2.使用数组实现分页

23.bo,to,vo是什么

答:

1.POJO是DO/DTO/BO/VO的统称
2.DO(data object):此对象与数据库表结构一一对应,通过DAO层向上传递数据源对象。
3.DTO/TO(data Transfer object):数据传输对象,service或manager向外传输的对象。
4.BO(busubess object):业务对象,由service层输出的封装业务逻辑的对象。
5.AO(application object):应用对象,在Web层与service层之间抽象的服用对象模型。
6.VO(view object):显示层对象,通常是Web向渲染引擎层输出的对象

24.jdk新特性都有些什么

答:

1.Lambda表达式:允许把函数作为一个方法的参数,传入到方法中。减少冗余代码。
2.新的编译工具:Nashorm引擎,允许我们在JVM上运行特定的javascript应用,jjs,类依赖分析器jdeps。
3.StreamApi:真正把函数变成风格引入到java中。
4.Date Api:加强对日期与时间的处理。
5.Optional:加入Optional类库,解决空指针异常。

25.springboot是怎么搭建的

答:

1.file->new project
2.Spring initializr --选择版本
3.配置相关路径
4.Web下勾选Spring Web Start 并调整SpringBoot版本
5.配置储存路径
6.选择settings配置自定义maven,更新maven
7.配置相关springboot的yml文件(yml层级更加清晰properties优先级更高(俩者同时存在时))
8.引入pom文件依赖—>spring-boot-starter-aop

26.sql如何调优

答:

1.查询SQL尽量不要使用select * ,而是使用具体的字段进行查询。
2.避免在where 字句中使用or来连接条件。
3.使用varchar代替char
4.精良实用数值代替字符串
5.查询尽量避免返回大量数据
6.使用explain分析SQL执行计划
7.是否正确使用了索引及其扫描类型
8.创建name字段的索引
9.优化like语句
10.索引不要过多,一般5个以内
11.不要再大量重复的数据上建立索引
12.where限定查询的数据
13.避免在where子句中使用!=或<>操作符
14.where中使用默认值代替null
15.批量插入性能提升
16.批量删除优化
17.复合索引最左特性

27.api中用什么去判断是否为空,isEmpty导的哪个包

答:

1.使用isEmpty这个API可以判断是否为空,返回布尔类型的值

28.反射创建对象的几种方式

答:

1.使用Class对象的newInstance()方法来创建累的实例,这种方式要求Class对象的对应类有默认的构造器,执行newInstance()实际上是利用默认的构造器创建该类的实例。
2.先使用Class对象获取Constructor对象,在调用Constructor对象的newInstance()方法创建对应Class对象对应类的实例。
3.使用Class.forName()方法获取Class对象。
4.如果是对象,可以通过对象的getClass()方法返回该类的Class对象。
5.直接调用累的class属性。

29.说说单例模式在什么情况下使用

答:

1.保证一个类只有一个实例,保证对象唯一性。
2.多应用于springmvc、连接池、线程池、spring等。
3.单例模式的创建方式:饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高。懒汉式:类初始化时,不会初始化该对象,真正需要使用时才会创建该对象,具备懒加载功能。

30.mybatis是怎么实现一对多查询的

答:

1.通过id批量查询使用selectById()方法传入一个list集合,集合内是要查询的条件,返回满足条件的结果
2.通过map集合桥接,使用selectByMap()传入map集合。

31.hashSet是如何实现有序的

答:

new 一个ThreeSet对象,将hashSet传入可以实现hashSet有序

32.怎么去遍历一个map集合

答:

方式一:根据键找值
1.使用keySet()方法,获取所有键的集合Set。
2.遍历Set集合获取每一个key值
3.用get(Object key)方法获取每一个key对应的value值。
方式二:根据键值对帝乡找键和值
1.用entrySet()方法获得值对对象的集合 Set<Map.Entry<K,V>>
2,for循环遍历键值对对象的集合Set<Map.Entry<K,V>>,获得每一个键值对,
3,然后用Entry.getKey()和Entry.getValue()方法取出每个对象中的键和值
方式三:分别获得键和值,遍历输出
1.map.keySet()获得所有键的集合Set
2. Map.value()取得值的集合Collection
3. 分别用for循环遍历取得每一个键和值.
方式四:使用获得键值对对象集合+迭代器
1.用entrySet()方法获得值对对象的集合 Set<Map.Entry<K,V>>
2,然后用迭代器Iterator()遍历出每一个键-值对对象
3, 使用Entry.getKey()和Entry.getValue()方法取出每个对象中的键和值

33.实现与继承的区别,有了继承为什么要用实现

答:

1.区别是:修饰符不同,实现是implements,继承是extends。继承只能单继承,实现可以多实现。在接口中只能定义全局常量(static final),和无实现的方法;而在继承中可以定义属性方法,变量,常量等
2.抽象类只能继承,接口只能实。因为只能单继承,强耦合,高内聚。

34.having的作用

答:

是条件查询关键字。having可以让我们筛选成组后的各种数据,在查询过程中慢于聚合函数(sum,min,max,avg,count).而where子句在查询过程中则快于聚合函数。常用于Group by分组之后

35.springCloud的组件

答:

1.Eureka:注册中心。
2.Zuul,gateway:网关。
3.Riboon:负载均衡。
4.OpenFeign:服务调用
5.Hystrix或Resilience4j:熔断器

36.@restcontroller和@controller区别

答:

1.@Controller包括了@ResponseBody。
2.@RestController是从Spring 4.0以后产生的,用来将json/xml数据发送到前台页面,而不是返回视图页面。
3.@RestController加在类上面的注解,使得类里面的每个方法都将json/xml返回数据加返回到前台页面中;@Controller加在类上面的注解,使得类里面的每个方法都返回一个试图页面。

37.什么是nginx,什么是负载均衡

答:

1.Nginx是一个高性能的HTTP和反向代理服务器
2.Nginx是一款轻量级的Web服务器。
3.负载均衡就是将负载(工作任务,访问请求)进行平衡分摊到多个操作单元(服务器、组件)上进行执行。可以解决高性能、高可用、扩展性(水平伸缩)。

38.浅谈面向对象的理解

答:

1.面向对象是一种思想,世间万物都可以看做一个对象。Java 是一个支持并发、基于类和面向对象的计算机编程语言。
2.面向对象软件开发具有以下优点:a.代码开发模块化,更易维护和修改。b.代码复用性强。c.增强代码的可靠性和灵活性。d.增加代码的可读性。
3.面向对象的特征:封装、继承、多态、抽象。

39.什么是工厂模式,什么情况下使用

答:

1.工厂模式是一种常见的设计模式,将我们创建对象的行为封装(因为创建对象的行为往往是重复的)然后直接调用工厂所给出的方法创建对象即可。
2…将对象的创建和对象的使用分开,降低耦合度,提供代码重复利用率。后期对于创建对象的修改成本小。
3.使用情况:
a.对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等。这个时候就需要使用工厂模式,将对象的创建这一系列过程封装,只需要使用时调用。
b.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。

40.什么是代理模式,什么情况下使用

答:

1.代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
2.代理模式分为:
静态代理:由程序员或特定工具自动生成的源代码,再对其编译,在程序运行之前,代理的类编译生成的.class文件就已经存在了
动态代理:在程序运行时,通过反射机制动态创建而成。
3.动态代理只要分为两大类:jdk动态代理和cglib动态代理。
jdk动态代理:jdk动态代理是JDK源码提供的,无需导入额外的jar包,JDK代理对象要求实现和被代理者相同的接口 必须有接口,JDK代理创建速度快,运行时稍慢
cglib动态代理:cglib动态代理需要导入额外的包,才能使用,cglib 要求被代理者有无接口都可以, 但是cglib代理对象是目标对象的子类. (继承),cglib创建代理对象时慢,但是运行期速度快。

41.springMVC出来之前,程序员都是使用什么技术

答:使用的是servlet。

42.Ajax同步异步怎么区分

答:

1.同步:脚本会停留并等待服务器发送回复然后再继续
异步:脚本允许页面继续其进程并处理可能的回复
2.AJAX使用的是异步,传统的Web是使用的同步。 同步更新是需要对整个页面进行更新,并且以新页面的形式显示出来。因为服务器每次都会返回一个新的页面,所以传统的web应用有可能很慢而且用户交互不友好。
3.异步更新是后台和服务器进行少量数据交换,即不重新加载整个网页就可以对网页的某部分进行更新。而AJAX减少了用户的等待时间。展示给用户的还是同一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。

43.udp跟tcp的区别

答:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

44.tomcat的优点缺点

答:

1.Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器
2.动态解析容器,处理动态请求,是编译JSP/Servlet的容器。
3.可以说Tomcat 只能用做java服务器

45.json跟xml的区别

答:

1.JSON是JavaScript Object Notation;XML是可扩展标记语言
2.JSON是基于JavaScript语言;XML源自SGML。
3.JSON是一种表示对象的方式;XML是一种标记语言,使用标记结构来表示数据项
4.JSON不提供对命名空间的任何支持;XML支持命名空间
5.JSON支持数组;XML不支持
6.JSON好阅读,XML难阅读
7.JSON不使用结束标记,XML有开始和结束标记
8.JSON安全性低;XML安全性高
9.JSON不支持注释;XML支持注释
10.JSON仅支持UTF-8编码;XML支持各种编码

46.什么时候需要设计数据库冗余字段

答:

1.什么是冗余字段?在设计数据库时,某一字段属于一个表,但它又同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段,外键除外
2.当多个大数据表关联查询就很慢,这个时候加入冗余字段,进行单表查询就快过关联查询
3.合理的加入冗余字段这个润滑剂,减少join,让数据库执行性能更高更快

47.数据库备份的命令

答:

1.备份数据库到D盘跟目录—>mysqldump -h127.0.0.1 -uroot -ppass myweb (登录数据库)>d:/backupfile.sql
2.直接将MySQL数据库压缩备份 备份到D盘跟目录mysqldump -h127.0.0.1 -uroot -ppass myweb | gzip (登录数据库)> d:/backupfile.sql.gz

48.String的常用API

答:

1.xxx.length()获取字符串长度
2.xxx.indexof()获取指定字符的下标
3.xxx.equals()判断两个字符串内容是否相等
4.xxx.charAt()返回下标所在的cha值(字符)
5.xxx.lastIndexOf()返回字符串最后一次出现的位置
6.xxx.starsWith(xx)判断字符串是否以xx开头
7.xxx.endsWith(x)判断字符串是否以x结束
8.xxx.toLowerCase()返回字符串的小写形式
9.xxx.toUpperCase()返回字符串的大写形式
10.xxx.substring(1,2)返回从1开始到2结束的字符串
11.xxx.contains()判断是否包含
12.xxx.concat()字符串拼接
13.xxx.split(String x)以指定x字符分割后返回字符数组
14.xxx.getByte()返回字符串的字节数组
15.xxx.isEmpty()判断字符串是否为空
16.xxx.hashcode()返回字符串的哈希值

49.你常用的集合有哪些

答:

1.list:
a.ArrayList
b.LinkedList
c.vector
2.set:
a.SortedSet
b.hashSet
c.TreeSet
d.LinkedHashSet
3.Map:
a.HashMap
b.LinkedHashMap
c.LinkedHashMap
d.TreeMap
e.Hashtable

49.常用的类和接口有哪些

答:

1.类:Object类,String类,Math类,Thread类,Date类,File类。
2.接口:List接口,Map接口,Runnable接口,collection接口,comparable接口。
3.常用包:java.lang包,java.util包,java.io包,java.math包。

50.Spring常用组件与spring的优点

答:

1.什么是Spring:Spring是一个开放源代码的J2EE应用程序框架,是针对Bean的生命周期进行管理的轻量级容器
2.常用组件:SpringCore,SpringAOP,SpringORM,SpringDAO,SpringContext,SpringWeb,SpringIOC,SpringMVC
3.Spring的优点:
a.将对象交给Spring容器管理,降低组件之间的耦合性.
b.可以提供众多服务,事务管理,WS等
c.AOP的很好支持,方便面向切面编程
d.SpringDI机制降低了业务对象替换的复杂性
e.Spring开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
4.Spring的缺点:
a.jsp中要写很多代码,控制器过于灵活,缺少一个公用控制器
b.Spring不支持分布式。

51.什么是IOC

答:IOC即控制反转,是一种设计思想,对象创建的权利由Spring框架完成,由容器管理对象的生命周期

52.bean的自动装配是什么

答:

1.在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还可以自动装配合作关系bean之间的关联关系。这意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。

53.自动装配与显示装配的优缺点

答:

1.什么是装配:向bean中注入依赖的过程即为装配,Spring中的装配大体有两种一种就是显示的指定依赖项,另一种是通过一些规则自动的注入依赖项
2.显示装配:通过xml文件bean id的方式指定对象
3.自动装配:自动装配是使用spring满足bean依赖的一种方法,满足以来的过程中,spring会在应用上下文中为某个bean寻找其依赖的bean。
4.打码量大,但指向精准,一个简单,代码少,但是容易找不到对象

54.手写AOP实例

答:

55.Spring常用注解

答:

@Configuration 将当前类标识为配置类
@Bean 将方法的返回值,交给Spring容器
@Component 将当前类交给Spring容器管理,对象的创建
由Spring通过反射机制自动创建对象
@ComponentScan(“com.jt”)指定扫描的包路径,可以扫描,
它的子孙包,用在配置类中 使Spring注解有效
@Scope 控制对象单例/多例
@Scope(“singleton”) 单例
@Scope(“prototype”) 多例
@Lazy 表示为懒加载
@PostConstruct 在对象创建后立即调用
@PreDestroy 对象消亡时调用
@Autowired 将Spring容器中的对象,自动注入到属性中
@Qualifier(“cat”)该注解不能单独使用,必须配合Autowired使用
根据key进行注入
@Resource(name=“dog”)功能上等于@Autowired+@Qualifier(“cat”)
@Controller 控制层
@Service 业务层
@Repository 持久层
@Value 注解赋值,可以直接为基本类型赋值和String类型
@EnableAspectJAutoProxy 开启AOP
@Aspect 标识该类是一个切面
@Pointcut 标识该方法是一个目标方法,切入点表达式
@Beform 前置通知
@AfterReturning 后置通知
@AfterThrowing 异常通知–目标方法执行报错之后执行
@After 最终通知–目标方法之后都要执行
@Around 环绕通知–控制目标方法执行
@annotation 根据自定义注解进行拦截
@Target 注解标识 方法
@Retention 注解运行期有效
@interface 接口标识
@Order(1) 按照顺序排序(1)代表第一个执行
@ResponseBody 将返回值转化为“json”字符串返回
@RequestMapping 标识前端识别路径
@PathVariable 参数接收取值
@RestController 等于@Controller+ResponseBody,将
当前类的所有返回值都转化为JSON字符串
@CrossOrigin 允许跨域

56.SpringBoot常用注解

答:

@SpringBootApplication SpringBoot项目的基石
@Configuration 将当前类标识为配置类
@EnableAutoConfiguration 启用 SpringBoot 的自动配置机制
@ComponentScan(“com.jt”)指定扫描的包路径,可以扫描,它的子孙包,用在配置类中 使Spring注解有效
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器

57.拦截器和过滤器的区别

答:

1.拦截器是基于Java反射机制的,而过滤器是基于函数回调
2.拦截器不依赖与servlet容器,过滤器依赖于servlet容器
3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4.拦截器可以访问action上下文,值栈里的对象,而过滤器不能访问
5.在action的生命周期里,拦截器可以多次被调用,而过滤器只能在容器被初始化是被调用
6.拦截器可以获取IOC容器中的各个bean ,而过滤器就不行,在拦截器里注入一个service ,可以调用业务逻辑
action是指

58.深拷贝浅拷贝区别

答:

1.浅拷贝是指拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向对象
2.深拷贝是指不仅仅拷贝对象本身而且拷贝对象包含的引用指向的所有对象
3.区别就是 假设B复制了A,当修改A时 看B是否会发生变化,如果B也跟着变了,说明是浅拷贝,如果B没变就是深拷贝

59.jvm内存模型

答:

1.栈,堆,本地方法栈,程序计数器,虚拟机栈,方法区五个部分
2.a.程序计数器:程序计数器是线程私有的,每个线程单独持有一个程序计数器程序计数器不会内存溢出
b.本地方法栈:为虚拟机使用到的 Native 方法服务
c.堆:类创建的对象存放堆
d.栈:线程运行需要的内存空间
e.虚拟机栈:

60.索引数据结构

答:

1.索引数据结构大多为B+Tree和B tree,MySQL索引底层是B+Tree
2.B Tree特点:d>=2,即B-Tree的度;h为B-Tree的高;每个非叶子结点由n-1个key和n个指针组成,其中d<=n<=2d;每个叶子结点至少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶结点的指针均为NULL;所有叶结点都在同一层,深度等于树高h;key和指针相互间隔,结点两端是指针;一个结点中的key从左至右非递减排列;如果某个指针在结点node最左边且不为null,则其指向结点的所有key小于v(key1),其中v(key1)为node的第一个key的值。如果某个指针在结点node最右边且不为null,则其指向结点的所有key大于v(keym),其中v(keym)为node的最后一个key的值。如果某个指针在结点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向结点的所有key小于v(keyi+1)且大于v(keyi)
3.B+Tree特点:每个结点的指针上限为2d而不是2d+1。内结点不存储data,只存储key;叶子结点不存储指针。

61.feign如何实现服务调用

答:

62.feign是基于什么协议的API

答:

1.基于HTTP协议

63.Redis中事务如何使用

答:

64.事务注解在方法上与在类上的区别

答:

65.Springboot与Spring的区别

答:

66.MyBatis与MyBatisPlus的区别

答:

67.Redis是如何储存在内存中的

答:

68.项目中的业务流程

答:

69.springCloud是什么

答:

70.JKD8新特性里的风格有哪些

答:

71.什么是spring,IOC,AOP

答:

72.Reids的主从,哨兵

答:

73.Reids的雪崩击穿穿透

答:
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值