面试笔记二

介绍一下集合

  • Java集合类主要分为Collection和Map两大体系,

Collection下又派生出List, Set, Queue等三大体系

  • List主要用来存储一些有序,可重复的元素;其实现类有:ArrayList, LinkedList, Vector和Stack
    • ArrayList是基于数组实现的,查询快,增删慢
    • LinkedList是基于链表实现的,增删快,查询慢
    • Vector也是基于数组实现的,它是线程安全的类,一般不推荐使用
    • Stack是Vector的派生类,是栈的数据结构的应用,就有后进先出的特点,也是线程安全的
  • Set主要用来存储一些无序,不可重复的元素;其实现类有:HashSet, TreeSet, LinkedHashSet
    • HashSet按照Hash算法来存储集合元素,具有很好的存取和查找性能
    • TreeSet是SortedSet接口的实现类,采用红黑树数据结构存储集合元素,可以保证集合元素处于有序状态,不是元素插入顺序,而是元素实际大小数据
    • LinkedHashSet是HashSet的子类,根据Hash值决定元素存放位置,同时用链表维护元素次序,已插入顺序保存元素。性能低于HashSet,但是迭代访问Set里全部元素的时候具有很好的性能
  • Queue是基于队列实现的,通常采用先进先出存储元素

Map保存的键值对数组。主要实现类有HashMap、HashTable、LinkedHashMap

  • HashMap 非线程安全,可以使用Null作为键或值,作为键时只能有一个
  • HashTable线程安全,不能使用Null作为键或值
  • LinkedHashMap是HashMap的子类

HashMap

  • 底层是基于数组+链表构成
  • 数组是存储key-value键值对,链表用来处理哈希冲突
  • 数组默认初始大小为16,数组的扩容为2的幂次方,链表默认初始为 8

List在遍历的时候修改元素会怎样

  • List进行遍历的时候对其集合中的元素进行操作,会使原始的List集合中的对象属性发生相应改变
  • 移出List中的元素
  • Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出java.util.ConcurrentModificationException异常

Redis客户端

  • Redis Client, Redis Desktop Manager, Redis Studio

MySQL常见的索引键

  • MySQL索引概念:索引就好比一本书的目录,它会让你更快的找到内容,显然索引不是越多越好
  • MySQL索引主要有两种结构:
    • hash: hash索引在MySQL中比较少用,他把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快,因为是hash结构,每个键只对应一个值,而且是散列的方式分布,并不支持范围查找和排序功能
    • B+树:B+tree是MySQL使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,更适合用来处理排序,范围查找等功能
  • Mysql常见的索引:主键索引/普通索引/全文索引/唯一索引/组合索引
    • PRIMARY KEY(主键索引) ALTER TABLE table_name ADD PRIMARY KEY (column)
    • UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE(column)
    • INDEX(普通索引) ALTER TABLE table_name ADD INDEX index_name (column)
    • FULLTEXT(全文索引) ALTER TABLE table_name ADD FULLTEXT (column)
    • 组合索引 ALTER TABLE table_name ADD INDEX index_name (column1, column2, column3)
  • MySQL各种索引区别
    • 普通索引:最基本的索引,没有任何限制
    • 唯一索引:与”普通索引“类似,索引列的值必须唯一,但允许有空值
    • 主键索引:它是一种特殊的唯一索引,不允许有空值
    • 全文索引:仅可用于MyISAM表,针对较大的数据,生成全文索引很耗时耗空间
    • 组合索引:为了更多提高MySQL效率可建立组合索引,遵循”最左前缀原则“

mysql的分页查询

    1. 一般情况下,客户端通过传递pageNo(页码),pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小时使用MySQL自带的limit来解决
    • 收到客户端{pageNo: 1, pageSize: 10}
      select * from table limit (pageNo-1)*pageSize, pageSize;
    1. 建立主键或者唯一索引
    • 在数据两较小的时候简单使用limit进行数据分页的性能上不会有明显的缓慢,但数据达到万级或百万级,sql语句的性能将会影响数据的返回,这时就需要利用主键或者唯一索引进行数据分页
    • 假设主键或者索引为good_id
    • 收到客户端{pageNo:5, pageSize:10}
    • select * from table where good_id > (pageNo-1)*pageSize limit pageSize;
    • 返回good_id为40到50之间的数字
  • 基于数据再排序:当需要的信息为顺序或者倒序时,对上面的语句基于数据再排序。 order by ASC/DESC 顺序或倒序,默认为顺序

    • select * from table where good_id > (pageNo-1)*pageSize order by good_id limit pageSize;

SQL优化

  • 进行查询优化,要尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引

避免全盘扫描

  • 尽量避免在where子句中对字段进行null值判断
  • 最好不要给数据库留NULL, 尽可能的使用NOT NULL填充数据库
  • 尽量避免在where子句中使用!= 或 <>(不等于,相当于!=) 操作符
  • 尽量避免在where子句中使用or来连接条件,可以使用union all
  • in 和 not in也要慎用,否则会导致全表扫描
    • 对于连续的值能用between就不要用in
    • 很多时候可以使用exists 代替 in
  • 避免使用 LINK %abc%, 而 LINK abc%则不会

spring MVC 常见的注解

@RequestMapping

  • 是一个用来处理请求地址映射的注解
  • 适用于类、方法。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
属性
  • value:指定请求的实际地址,值可以是普通的具体值,可以指定为含有某变量的一类值(URI Template Patterns with Path Variables),可以指定为含正则表达式的一类值
  • method:指定请求的method类型,GET,POST,PUT,DELETE等
  • consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html
  • produces:指定返回的内容类型,仅当request请求头中(Accept)类型中包含该指定类型才返回
  • params:指定request中必须包含某些参数值时,才让该方法处理
  • headers:指定request中包含某些指定的header值,才能让该方法处理

@RequestParam

  • 用于将请求参数区数据映射到功能处理方法的参数上
属性
  • value/name:两个属性都指代参数名字,即入参的请求参数名字(通常表单name属性)
  • required:是否必须,默认是true, 表示请求中一定要有相应的参数,否则将抛出异常
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值,设置该参数时,自动将required设为false

@PathVariable

  • 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出url模板中的变量作为参数
  • 适用:方法参数
属性
  • value:指定url模板变量名称,如果名称与方法参数名不一样,则需要指定,否则可省略

@ResponseBody

  • 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转化为指定路径格式后,写入到Response对象的body数据区,默认springMVC以json形式返回(适用jackson转换器)
  • 适用:方法,返回的数据不是html标签的页面,而是以其他某种格式的数据时(如json,xml等)适用
  • 对比:@RequestBody将HTTP请求正文转化为适合的HttpMessageConverter对象,@ResponseBody将内容或对象作为HTTP响应正文返回,并调用适合HttpMessageConverter的Adapter转化对象,写入输出流

@RequestBody

    1. 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConveter进行解析,然后把响应的数据绑定到要返回的对象上
    1. 再把HttpMessageConverter返回的对象数据绑定到controller中的方法的参数上
  • 适用:方法参数,对于request的Content-Type:为application/json, application/xml必须使用该注解
  • 对于application/x-www-form-urlencoded,如果请求方式为put,则为必须

@CookieValue

  • 可以把Request header中关于cookie的值绑定到方法区的参数上
  • 适合:方法参数

@RequestHeader

  • 可以把Request请求header部分的值绑定到方法区的参数上
  • 适合:方法参数

ExceptionHandler

  • 注解在方法上,表示该方法用于处理特定的异常,处理范围是当前类,如果想要全局捕获异常,需要使用@ControllerAdvice

  • js / Jquery获取元素的value

    • Js如何获取input元素value值
      1. 给form一个名字,然后在JS的地方就可以使用form的名字来调用form表单里input元素的value值
      1. 通过document.getElementById(id名称)
    • Jquery获取input元素value值
    • $("#test").val()
  • css 如何实现 三个div同行显示

设计模式

创建型模式

  • 工厂方法模式

    • 简单工厂模式
    • 多个工厂模式
    • 静态工厂模式
  • 抽象工厂模式

    • 类的创建依赖工厂类,通过一个接口,让工厂类去实现这个接口,提高扩展性
  • 单例模式

    • 私有构造方法
    • 创建内部类
    • 获取实例
  • 建造者模式

  • 原型模式

结构性模式

  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式

行为模式

  • 策略模式
  • 模板方法模式
  • 观察者模式
  • 迭代子模式
  • 责任链模式

MyBatis如何实现分页查询

  • 使用Map来进行包装数据实现分页功能
  • 使用RowBounds来实现分页

Vue常用的指令集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值