ia.func(); // 增强... } } JavaIO里如何使用的装饰器 DataInputStream为什么继承FileInputStream,而不是直接组合InputStream...在FileInputStream中,对继承自InputStream的方法都重写了,并且内部调用的是组合的InputStream,而不是父类的方法。那为什么不直接用父类的方法呢?...装饰者模式是对原有功能增强,例如原功能是读取字符串,增强后可缓存的读取字符串。而代理模式增强的是和原功能无关的功能,例如对API接口增强,可记录接口调用时间,参数等。...public int indexOf(Object o) {return list.indexOf(o);} public int lastIndexOf(Object...} 在set、add、remove等修改方法中,以及迭代器里的修改方法中,直接抛出异常
Java 集合框架中最常使用的几种 List 实现类是 ArrayList,LinkedList 和 Vector。在各种 List 中,最好的做法是以 ArrayList 作为默认选择。...为什么 List 中的元素 “有序”、“可以重复”呢? 首先,List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应。...List 接口定义的方法 List 中除了继承 Collection 的一些方法,还提供以下操作: 位置相关:List 和 数组一样,都是从 0 开始,我们可以根据元素在 list 中的位置进行操作,比如说...public boolean equals(Object o) { return this == o; } 因此和 Set,Map 一样,List 中如果想要根据两个对象的内容而不是地址比较是否相等时...) 作用同上,不同的是当 参数 array 的长度比 List 的元素大时,会使用参数 array 保存 List 中的元素;否则会创建一个新的 数组存放 List 中的所有元素; ArrayList
List 接口 一个 List 是一个元素有序的、可以重复、可以为 null 的集合(有时候我们也叫它“序列”)。...为什么 List 中的元素 “有序”、“可以重复”呢? 首先,List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应。...List 接口定义的方法 List 中除了继承 Collection 的一些方法,还提供以下操作: 位置相关:List 和 数组一样,都是从 0 开始,我们可以根据元素在 list 中的位置进行操作,比如说...public boolean equals(Object o) { return this == o; } 因此和 Set,Map 一样,List 中如果想要根据两个对象的内容而不是地址比较是否相等时...) 作用同上,不同的是当 参数 array 的长度比 List 的元素大时,会使用参数 array 保存 List 中的元素;否则会创建一个新的 数组存放 List 中的所有元素; ArrayList
); 40 41 E remove(int index); 42 43 int indexOf(Object o); 44 45 int lastIndexOf(Object...,并且此接口定义中,凡是出现E的地方均表示相同的接受自外部的类型实参。...自然的,ArrayList作为List接口的实现类,其定义形式是: ?...是的,在具体使用时,可以分为泛型接口、泛型类和泛型方法。 自定义泛型接口、泛型类和泛型方法与上述Java源码中的List、ArrayList类似。如下,我们看一个最简单的泛型类和方法定义: ?...在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?...int indexOf(Object o); int lastIndexOf(Object o); ListIteratorE> listIterator(); ListIterator...,E>中的E表示类型形参,可以接收具体的类型实参,并且此接口定义中,凡是出现E的地方均表示相同的接受自外部的类型实参。...自然的,ArrayList作为List接口的实现类,其定义形式是: public class ArrayListE> extends AbstractListE> implements...是的,在具体使用时,可以分为泛型接口、泛型类和泛型方法。 自定义泛型接口、泛型类和泛型方法与上述Java源码中的List、ArrayList类似。
Collection 实现了Iterator 接口,通过iterator()方法返回迭代器。 拓展思考1:为什么是接口,而不是抽象类呢?...在Collection 的基础上,List 接口拓展了以下方法: abstract void add(int location, E object) abstract boolean addAll(int...extends E> collection) abstract E get(int location) abstract int indexOf(Object object) abstract int...lastIndexOf(Object object) abstract ListIteratorE> listIterator(int location) abstract ListIteratorE> listIterator() abstract E remove(int location) abstract E set(int location, E object) abstract List
之所以需要这样一个接口,是因为java作为面向对象,总是避免不了处理多个对象的情况,要处理多个对象,首先需要容器存储,这个容器就是集合。...最常见的三个实现类就是ArrayList,Vector,LinkedList,ArrayList和Vector都是内部封装了对数组的操作,唯一不同的是,Vector是线程安全的,而ArrayList不是.../在指定位置插入元素 E remove(int index);//根据索引移除某个元素 int indexOf(Object o); //根据对象获取索引 int lastIndexOf(Object...底层是哈希表,一个元素为链表的数组 LinkedHashSet HashSet的子类 有顺序 底层由哈希表组成 TreeSet 如果无参数构建Set,则需要实现Comparable方法。...Collection接口继承了Iterable接口,而Map则不是,Map是在各自的实现类中才用内部类的方式实现Iterator接口,例如HashMap,key或者value或者它们的组合entry都可以使用迭代器进行遍历
实现 这个类实现的接口比较多,具体如下: 首先这个类是一个 List 自然有 List 接口 然后由于这个类是实现了 Deque 这个接口是双端队列的接口,所以说它是具有双端队列的特性的。...构造方法分析 只有两个构造方法。其中一个是默认的空构造也就是生成一个空的 LinkedList 另外一个就是接受一个 Collection 接口。里面调用了 PutAll 方法。...主要方法分析 1. add 这个方法就直接调用了 linkLast 而 linkLast 里面就是直接把元素添加到元素的结尾。...这个方法和上面的方法实现的方式一样的,但是注意这个方法的意思是找到最后一个与之匹配的元素,他并不是从头开始找,而是直接从尾节点开始遍历。...9. push/pop 底层的方法就是 addFirst 和 removeFirst 10. remove(noargs)/remove(E e) 无参的调用 removeFirst 有参数的就是去查找然后删除
那为什么继承的时候也要确定泛型呢?因为继承就是在使用一个已经定义好的类,使用泛型类,就要指定类型。 3.用什么样的参数形式来接受List这种形式的参数?...现在需要为所有List抽象一个方法,不论给的参数是List,List,都可以接收并且打印List中的元素。是不是理所当然的想到了ListObject>?...显然这样是不可以的,错误提示参数类型不匹配,Object是所有类型的父类,但是ListObject>并不是List的父类,那应该使用什么方法达到上面的要求呢?...List提供的add(E e)方法是需要指定类型的,这里不是E吗?这是个泛型类型啊?为什么要提供类型?因为这是定义,一旦要使用add(E e)方法,必须指定具体的类型。...如果我使用List作为参数,传入到printAllObject方法,运行完打印元素的语句后,会往List类型的集合里面新增一个Object类型的对象,而Object又是Book类型的父类
接口 与 Map接口两类,而ArrayList就是Collection接口中List子接口的实现类… 在上一篇文章中,我们通过ArrayList实现类的源码,了解到了其中的属性,比较印象深刻的应该是ArrayList...返回的size值代表的是集合中存在的元素个数,注意:返回的不是数组的实际空间。...(index)方法判断是否越界; 之后就是通过传入的index下标获取对应元素; list.get(index); ---- 7.set方法 源码: public E set(int index, E...int first_index = list.indexOf(null); ---- 9.lastIndexOf方法 源码: public int lastIndexOf(Object o) {...int last_index = list.lastIndexOf(null); ---- 10.remove方法 源码: public E remove(int index) { rangeCheck
前言 List是继承自Collection的一个子接口,它提供了一个有序的集合,在这个集合中我们可以使用索引去获取集合中的值,同时,我们也可以通过迭代器去访问集合中的元素,第一种方法被称为随机访问,因为我们可以按照任意的顺序去访问元素...int indexOf(Object o); int lastIndexOf(Object o); // List Iterators ListIterator...remove(int index):删除指定索引(index)位置的元素,并将处于该位置后面的元素索引减1 indexOf(Object o):获取对象o在集合中的索引 lastIndexOf(Object...replaceAll(UnaryOperatorE> operator)这里和String类中replaceAll()方法并不相同,这里的接收参数是一个函数式接口,我们来看一下这个函数式接口的源码:...super E> c)传入的同样是一个函数式接口,我们可以自定义排序规则后,调用这个方法进行排序: List humans = Lists.newArrayList(new Human("
public int lastIndexOf(Object o) 从后往前找。 public boolean contains(Object o) 是否包含指定元素。...(int index); int indexOf(Object o); int lastIndexOf(Object o); ListIteratorE> listIterator(); ListIterator...比如说,Collections类中有一个方法binarySearch,在List中进行二分查找,它的实现代码就根据list是否实现了RandomAccess而采用不同的实现机制,如下所示: public...,这个方法返回的List,它的实现类并不是本节介绍的ArrayList,而是Arrays类的一个内部类,在这个内部类的实现中,内部用的的数组就是传入的数组,没有拷贝,也不会动态改变大小,所以对数组的修改也会反映到...作为程序员,就是要理解每种数据结构的特点,根据场合的不同,选择不同的数据结构。
---- 使用“Number”对象而不是基元有三个原因: 作为需要对象的方法的参数(通常在处理数字集合时使用)。...boolean equals(Object obj) 确定此数字对象是否等于参数。如果参数不是“null”,并且是具有相同类型和数值的对象,则方法返回“true”。...“format()”方法(“DecimalFormat”继承自“NumberFormat”)随后由“myFormatter”调用-它接受“double”值作为参数,并以字符串形式返回格式化的数字: 下面是一个示例程序...值作为基元类型而不是“Integer”对象添加到“li”中,但代码仍会编译。...因为“li”是“Integer”对象的列表,而不是“int”值的列表,所以您可能会想为什么Java编译器不会发出编译时错误。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的... T[] *All方法参数的类型都为Collection ,大多数方法都是返回boolean类型值,Collection 接口用于表示任何对象或元素组。...Collection,表示映射而不是真正的集合。 ...● HashMap不是同步的,而Hashtable是同步的。 ● 迭代HashMap采用快速失败机制,而Hashtable不是,所以这是设计的考虑点。 ...或者说为什么我们应该一直使用ArrayList而不是Vector 你应该使用ArrayList而不是Vector是因为默认情况下你是非同步访问的,Vector同步了每个方法,你几乎从不要那样做,通常有想要同步的是整个操作序列
类/接口 描述 方法 String 字符串 charAt toCharArray split substring indexOf lastIndexOf replace length List...List b = new ArrayList(a); //接受一个集合容器 get get(int index) // 返回元素位置在index的元素e --- array...如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用 集合工具 Collections是集合工具类,提供了一些操作集合的方法。...--- O(m * n) m为原串长度, n为str长度 // (假如要找一个字符char c,str可以表示成String.valueOf(c),然后作为参数传进去....--- O(m * n) m为原串长度, n为str长度 // (假如要找一个字符char c,str可以表示成String.valueOf(c),然后作为参数传进去.
**数组长度固定,而集合长度是可变的 **数组值可以存储对象,还可以存储基本数据类型;而集合只能存储对象 **数组存储数据类型是固定的,而集合存储的数据类型不固定 (3)集合类的特点: 集合只能存储对象...*****List集合子类及其方法 (1)List接口是Collection接口的一个子接口。...(2)List接口中的元素有如下特点(对角标的操作都是特有方法,因为有序): A:元素有序(存储顺序和取出顺序一致) B:元素可以重复 (3)List接口中的特有方法 A:add(int index...index):获取指定位置的元素 E:indexOf(Object obj):获取指定元素的位置 F:subList(int start,int end):从一个大的List中截取一个小的List...G:listIterator():返回一个List接口特有的迭代器 (1)、ArrayList: |--->构造方法摘要:(少用,不是重点) ArrayList():构造一个初始容量为 10
extends E> c); 我们发现addAll方法入参的泛型定义实际上是E>这个类型,而不是E>这个类型。这就引出了java中的通配符(使用?表示)概念。...> list) { //在该方法中测试添加对象,实际上测试的是无界通配符作为类泛型参数的场景,因为list的类型是泛型List即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为类泛型参数的场景,因为list的类型是泛型List类即List list) { //在该方法中测试添加对象,list.add实际上测试的是通配符作为类泛型参数的场景,因为list的类型是泛型List类即ListE>修饰时是协变的,或者说E是个协变类型参数;IList是E的生产者,而不是E的消费者。 什么是协变?
List 中的 add() 参数的(int,E),而 Collection 中的 add() 参数是 E,因此 List 集合中同时存在指定下标和不指定下标两种添加方式; remove():删除指定下标的元素...注意,List 的 remove() 参数是 int ,而 Collection 中的 “remove()` 参数是 Objce,也就是说,List 中同时存在根据元素是否相等和根据元素下标删除元素两种方式...,就立刻抛出异常,而不是让可能出错的参数被使用从而引发不可预知的错误。...面对迭代期间的并发修改,这提供了快速失败的行为,而不是不确定的行为。 子类对此字段的使用是可选的。...接口,新增方法的特点主要体现在可以通过下标去操作节点,可以说大部分下标可以作为参数的方法都是 List 中添加的方法。
的newInstance方法为mapper接口创建代理,创建代理的方式是JDK,最终生成的代理对象是MapperProxy。...DefaultSqlSession.java@Overridepublic E> ListE> selectList(String statement, Object parameter, RowBounds...SimpleExecutor.java@Overridepublic E> ListE> doQuery(MappedStatement ms, Object parameter, RowBounds...由于我们的并不是在原始字段上做加密,而是新增了一个加密后字段,这会带来什么问题?...可以明显的看到第一条语句是使用secret_ciper作为查询条件,而count语句是使用secret作为查询条件,会导致最终得到的数据总量和实际的数据总量不一致。
领取专属 10元无门槛券
手把手带您无忧上云