可以被当作堆栈、队列或双端队列进行操作; Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。...如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改.)了列表...数组扩容通过一个 public 方法 ensureCapacity(int minCapacity) 来实现 : 在实际添加大量元素前,我也可以使用 ensureCapacity 来手动增加 ArrayList...该函数实际上最终调用了C语言的memmove()函数,因此它可以保证同一个数组内元素的正确复制和移动,比一般的复制方法的实现效率要高很多,很适合用来批量处理数组。...注意,LinkedList 不是同步的。如果多个线程同时访问一个顺序表,而其中至少一个线程从结构上(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)
后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?...不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...一种解决方法是在创建List时构造一个同步的List: ArrayList类 ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。...如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。...hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode
这里有些童鞋就说了,ArrayList是一个线性表吧,我再ArrayList中添加/删除一个元素直接调用add()/remove()方法就行了啊,也是一步到位啊——这样想就不对了,如果我们看ArrayList...一个结点包含自身元素(item),该节点对后一个节点的引用(next),该节点对前一个节点的引用(prev)。 (2.1)双链表的删除 ?...(); //是否还有前继元素 E previous(); //返回前一个元素 int nextIndex(); //返回下一个元素的索引 int previousIndex...(); //返回前一个元素的索引 void set(E e); //替换由上一次next()或者previous()方法返回的元素....③如果1.5倍大小还是小于所需要的minCapacity大小,那就将原来的元素复制到一个以minCapacity为长度的新数组中,并将elementData引用指向这个新数组。
后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?...不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...类 ArrayList实现了可变大小的数组。...如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。...hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode
内置方法 返回值 CharAt() 它返回指定索引处的字符。 Concat() 它连接两个或多个字符串。 forEach() 它为数组中的每个元素调用一个函数。...push() 它将一个或多个元素添加到数组的末尾,并返回数组的新长度。 reverse() 反转数组元素的顺序。 问题17: JS中的变量命名约定是什么?...如果在其他任何地方都没有对原始数组arrayList的引用,则建议这样做���因为它实际上会创建一个新的空数组。...咱们应该小心使用这种清空数组的方法,因为如果你从另一个变量引用了这个数组,那么原始的引用数组将保持不变。...方法四: while(arrayList.length) { arrayList.pop(); } 上面的实现也可以空数组,但通常不建议经常使用这种方式。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的...后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?...不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。...hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode
Stream API的编写大量依赖lambda表达式以及lambda表达式的引用方法和引用构造器,如果您对这一块不理解可以查阅文章Java 匿名内部类、lambda表达式与函数式接口。...Stream 常用方法 filter filter的栗子前面已经举过了,filter函数需要传入一个实现Predicate函数式接口的对象,该接口的抽象方法test接收一个参数并返回一个boolean值...filter map、flatMap map的栗子前面已经举过了,map函数需要传入一个实现Function函数式接口的对象,该接口的抽象方法apply接收一个参数并返回一个值,可以理解为映射关系,前文举的栗子就是将每一个用户映射为一个...findFirst findFirst方法总是返回第一个元素,如果没有则返回空,它的返回值类型是Optional类型,接触过swift的同学应该知道,这是一个可选类型,如果有第一个元素则Optional...返回 true noneMatch:Stream中没有一个元素符合传入的predicate返回 true reduce reduce方法用于组合Stream元素,它可以提供一个初始值然后按照传入的计算规则依次和
在说集合前我们不得不说一下数组 数组的作用: 存放一组相同的数据类型(基本或对象)的数据,从而实现对数据的管理 优势:可以快速的通过下标对数组元素进行访问,效率高 劣势:容量实现定义好了,不能随着需求变化而扩容...如果指定集合也是一个set,只有是当前set的子集时,方法返回true 实现Set接口的HashSet,依靠HashMap来实现的。...当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念); Object类仅仅提供了一个对引用的比较,如果两个引用不是同一个那就返回false,这是无法满足大多数对象比较的需要的,所以要覆盖; 使用...f) 如果是double类型,计算Dobule.doubleToLongBits(f) 如果该域是一个对象引用,递归调用hashCode 如果该域是一个数组,则把每个元素当做单独的域来处理,对每个重要的元素计算一个散列码...2.数据增长: 从内部实现的机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当你向两种类型中增加元素的时候,如果元素的数目超过了内部数组目前的长度他们都需要扩展内部数组的长度
内置方法 返回值 CharAt() 它返回指定索引处的字符。 Concat() 它连接两个或多个字符串。 forEach() 它为数组中的每个元素调用一个函数。...push() 它将一个或多个元素添加到数组的末尾,并返回数组的新长度。 reverse() 反转数组元素的顺序。 问题17: JS中的变量命名约定是什么?...问题44:如何在JS中清空数组 有许多方法可以用来清空数组: 方法一: arrayList = [] 上面的代码将把变量arrayList设置为一个新的空数组。...如果在其他任何地方都没有对原始数组arrayList的引用,则建议这样做,因为它实际上会创建一个新的空数组。...咱们应该小心使用这种清空数组的方法,因为如果你从另一个变量引用了这个数组,那么原始的引用数组将保持不变。
内部实现: ArrayList基于动态数组实现。它使用数组来存储元素,支持随机访问,可以根据索引直接访问元素。当容量不足时,ArrayList会自动增长数组的大小。...LinkedList基于双向链表实现。每个元素在内存中都保留了对前一个和后一个元素的引用,因此在添加或删除元素时,不需要像ArrayList那样移动元素,只需改变引用即可。...随机访问性能: ArrayList支持随机访问,可以通过索引直接访问元素。因为基于数组实现,所以在访问特定位置的元素时效率较高。...插入和删除性能: 在ArrayList中,插入和删除元素可能涉及到数组元素的移动,特别是在数组中间插入或删除元素时,需要移动后续元素的位置,因此性能可能较低。...LinkedList在插入和删除元素时通常性能较好,因为只需要修改链表中相邻元素的引用即可,不需要像数组一样移动大量元素。
后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?...不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...类 ArrayList实现了可变大小的数组。...当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 ...如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的...后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?...不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。...hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode...这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。
一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。...如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。...当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。...如果两个对象相等,则 hashcode 一定也是相同的 两个对象相等,对两个对象分别调用 equals 方法都返回 true 两个对象有相同的 hashcode 值,它们也不一定是相等的 因此,equals...HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话
split():分割字符串,返回一个分割后的字符串数组。 getBytes():返回字符串的 byte 类型数组。 length():返回字符串长度。...当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放...,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。...使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。 26. 如何实现数组和 List 之间的转换?...ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
所有实现 Collection 接口的类都必须提供两个标准的构造函数,无参数的构造函数用于创建一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection...如何遍历 Collection 中的每一个元素?...不论 Collection 的实际类型如何,它都支持一个 iterator() 的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问 Collection 中每一个元素。...HashCode 和 Equals 方法继承自根类 Object,如果你用自定义的类当作 Key 的话,要相当小心,按照散列函数的定义,如果两个对象相同,即 obj1.equals(obj2)=true...ArrayList 是基于数组实现的,而数组是一块连续的内存空间,如果在数组的任意位置插入元素,必然导致在该位置后的所有元素需要重新排列,因此其效率较差,尽可能将数据插入到尾部。
() 此方法返回此列表中的最后一个元素 int size() 此方法返回此列表中的元素数 boolean contains(Object o) 如果此列表包含指定的元素,则此方法返回true boolean...isEmpty() 如果此列表为空,则此方法返回true int indexOf(Object o) 此方法返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1 int lastIndexOf...(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型 ---- 四、相关知识点 1、关于 Queue 队列 队列(Queue):也是一种操作受限的线性表...向队列中插入元素称为入队或进队;删除元素称为出队或离队。 这和我们日常生活中的排队是一致的,最早排队的也是最早离队的。...在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
如何扩容 了解完 ArrayList 为何有序存储元素和元素可以重复,我们再来看下作为动态数组列表,底层扩容是如何实现的。...copyOf 操作是一次浅拷贝操作,原 ArrayList 对象的元素不会被拷贝一份存到新的 ArrayList 对象然后返回,它们各自的字段 elementData 里各位置存放的都是一样元素的引用,...传入一个代表条件的函数式接口参数 Predicate,也就是Lambda 表达式进行条件匹配,如果条件为 true, 则将该元素从数组中删除,例如下方代码示例: List numbers...高效的初始化 ArrayList 实现了三个构造函数, 默认创建时会分配到空数组对象 EMPTY_ELEMENTDATA;第二个是传入一个集合类型数据进行初始化;第三个允许传入集合长度的初始化值,也就是数组长度...并且如果列表的长度符合传入的数组,将元素拷贝后数组后,则在其中返回数组。否则,将根据传入数组的类型和列表的大小重新分配一个新数组,拷贝完成后再返回。
在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。 同时,与ArrayList一样此实现不是同步的。 (以上摘自JDK 6.0 API)。...header : entry(index)); //插入位置的前一个节点,在插入过程中需要修改该节点的next引用:指向插入的节点元素 Entry predecessor = successor.previous...// Entry e = new Entry((E) a[i], successor, predecessor); //将插入位置前一个节点的下一个元素引用指向当前元素...remove(Objec o):从此列表中移除首次出现的指定元素(如果存在)。 removeFirst():移除并返回此列表的第一个元素。...正是通过与(length - 1)进行取‘&’运算来实现数组的双向循环。 // 如果尾索引和头索引重合了,说明数组满了,进行扩容。
对任意x、y、z,如果有x.equlas(y)返回true,y.equals(z)返回true,则x.equals(x)一定返回true。 4.一致性。...对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用多少次x.equals(y),返回的结果应该保持一致,一直是true或false。...如果能保证没有冲突(当值的数量是固定的,那就有可能),就有了一个完美的散列函数,但仅是特例。 完美的散列函数在SE5中的EnumMap和EnumSet中得到了实现,因为enum定义了固定数量的实例。...List ArrayList底层由数组支持,LinkedList由双向链表实现,其中每个对象包含数据的同时还包含指向链表中前一个与后一个元素的引用。...如果经常在表中插入或删除元素,LinkedList比较合适(LinkedList还有建立在AbstractSequencetialList基础上的其他功能),否则应该使用速度更快的ArrayList。
领取专属 10元无门槛券
手把手带您无忧上云