Filter拦截器
Filter拦截器 如何实现拦截 实现Filter接口,重写doFilter方法。 doFilter方法有三个传入参数 ServletRequest:对于简单的过滤器,大多数过滤逻辑是基于这个对象的。如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,就要把此对象构造成 HttpServletRequest。 ServletResponse:除了在两个情形下要使用它以外,通常忽略这个参数。 首先,如果希望完全阻塞对相关 servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。 其次,如果希望修改相关的servlet或 JSP页面的输出,可把响应包含在一个收集所有发送到它的输出的对象中。然后,在调用serlvet或JSP页面后,过滤器可检查输出,如果合适就修改...
JavaStream
JavaStream Stream Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。 Stream还有两个特征 Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。 生成流 stream() -为集合创建串行流。 parallelStream() −...
Base
Base String 类和常量池 String 对象的两种创建方式: 12345String str1 = "abcd";//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后 str1 指向字符串常量池中的对象,如果有,则直接将 str1 指向"abcd"";String str2 = new String("abcd");//堆中创建一个新的对象String str3 = new String("abcd");//堆中创建一个新的对象System.out.println(str1==str2);//falseSystem.out.println(str2==str3);//false 这两种不同的创建方法是有差别的。 第一种方式是在常量池中拿对象,如果没有则在字符串常量池中创建一个; 第二种方式是直接在堆内存空间创建一个新的对象。 注意 直接使用双引号声明出来的 String 对象会直接存储在常量池中 如果不是用双引号声明的...
Queue
Queue Queue 注意:不要把 null 添加到队列中,否则 poll()方法返回 null 时,很难确定是取到了 null 元素还是队列为空。 PriorityQueue(优先队列) extends AbstractQueue 通过二叉小顶堆实现,可以用一棵完全二叉树表示 优先队列的作用是能保证每次取出的元素都是队列中权值最小的 PriorityQueue 实现了 Queue 接口,不允许放入 null 元素;其通过堆实现,具体说是通过完全二叉树 (complete binary tree) 实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为 PriorityQueue 的底层实现 放入 PriorityQueue 的元素,必须实现 Comparable 接口,PriorityQueue 会根据元素的排序顺序决定出队的优先级 Deque extends Queue(接口) 队列和 Deque 方法的比较 队列方法 等效的 Deque...
Set
Set HashSet 集合 底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树 要点 实现 Set 接口 不保证迭代顺序 允许元素为 null 底层实际上是一个 HashMap 实例 非同步 初始容量非常影响迭代性能 HashSet 实际上就是封装了 HashMap,操作 HashSet 元素实际上就是操作 HashMap。这也是面向对象的一种体现,重用性贼高! 详解见 HashMap TreeSet 集合 底层数据结构是红黑树(是一个自平衡的二叉树) 保证元素的排序方式 要点 实现NavigableSet接口 可以实现排序功能 底层实际上是一个TreeMap实例 非同步 LinkedHashSet 集合 底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
List
List List 集合的三个子类: ArrayList :底层数据结构是数组。线程不安全 LinkedList :底层数据结构是链表。线程不安全 Vector:底层数据结构是数组。线程安全 ArrayList 简介 ArrayList 继承了 AbstractList,实现了 List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 ArrayList 实现了 RandomAccess 接口, RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。 ArrayList 实现了 Cloneable 接口,即覆盖了函数 clone(),能被克隆。 ArrayList 实现 java.io.Serializable 接口,这意味着 ArrayList 支持序列化,能通过序列化去传输。 和 Vector 不同,ArrayList 中的操作不是线程安全的!所以,建议在单线程中才使用 ArrayList,而在多线程中可以选择...
Map
Map HashMap JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。 JDK1.8 之前 “拉链法” 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。 JDK1.8 之后 当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于...
Collection
Collection Collection Collection 接口的接口 对象的集合 List 子接口 按进入先后有序保存 可重复 LinkedList(双向链表) 接口实现类 链表 插入删除 没有同步 线程不安全 ArrayList(Object 数组) 接口实现类 数组 随机访问 没有同步 线程不安全 Vector(Object 数组) 接口实现类 数组 同步 线程安全 Set 子接口 不可重复 HashSet(无序,唯一) LinkedHashSet(有序,唯一) 线程不安全 TreeSet(有序,唯一) Map 接口 键值对的集合 Hashtable(链表+数组) 接口实现类 同步 线程安全 HashMap(1.8 之前数组+链表,1.8 之后达到一定长度会转化为红黑树) 接口实现类 没有同步 线程不安全 LinkedHashMap(在 HashMap 基础上添加一条双向链表) TreeMap(红黑树(自平衡排序二叉树)) Iterable Iterator...