介绍一下集合
- 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
)
- PRIMARY KEY(主键索引) ALTER TABLE
-
- UNIQUE(唯一索引) ALTER TABLE
table_name
ADD UNIQUE(column
)
- UNIQUE(唯一索引) ALTER TABLE
-
- INDEX(普通索引) ALTER TABLE
table_name
ADD INDEX index_name (column
)
- INDEX(普通索引) ALTER TABLE
-
- FULLTEXT(全文索引) ALTER TABLE
table_name
ADD FULLTEXT (column
)
- FULLTEXT(全文索引) ALTER TABLE
-
- 组合索引 ALTER TABLE
table_name
ADD INDEX index_name (column1
,column2
,column3
)
- 组合索引 ALTER TABLE
- MySQL各种索引区别
-
- 普通索引:最基本的索引,没有任何限制
-
- 唯一索引:与”普通索引“类似,索引列的值必须唯一,但允许有空值
-
- 主键索引:它是一种特殊的唯一索引,不允许有空值
-
- 全文索引:仅可用于MyISAM表,针对较大的数据,生成全文索引很耗时耗空间
-
- 组合索引:为了更多提高MySQL效率可建立组合索引,遵循”最左前缀原则“
mysql的分页查询
-
- 一般情况下,客户端通过传递pageNo(页码),pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小时使用MySQL自带的limit来解决
-
- 收到客户端{pageNo: 1, pageSize: 10}
select * from table limit (pageNo-1)*pageSize, pageSize;
- 收到客户端{pageNo: 1, pageSize: 10}
-
- 建立主键或者唯一索引
-
- 在数据两较小的时候简单使用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%
, 而 LINKabc%
则不会
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
-
- 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConveter进行解析,然后把响应的数据绑定到要返回的对象上
-
- 再把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值
-
-
- 给form一个名字,然后在JS的地方就可以使用form的名字来调用form表单里input元素的value值
-
-
-
- 通过document.getElementById(id名称)
-
-
- Jquery获取input元素value值
-
- $("#test").val()
-
css 如何实现 三个div同行显示
设计模式
创建型模式
-
工厂方法模式
-
- 简单工厂模式
-
- 多个工厂模式
-
- 静态工厂模式
-
抽象工厂模式
-
- 类的创建依赖工厂类,通过一个接口,让工厂类去实现这个接口,提高扩展性
-
单例模式
-
- 私有构造方法
-
- 创建内部类
-
- 获取实例
-
建造者模式
-
原型模式
结构性模式
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
行为模式
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
MyBatis如何实现分页查询
- 使用Map来进行包装数据实现分页功能
- 使用RowBounds来实现分页