但当你用ArrayList的get()方法取出你认为的Apple对象时,得到的只是Object引用,必须将其转型为Apple,因此,需要将整个表达式扩起来,在调用Apple的id()方法之前,强制执行类型...这样,通过使用泛型,你不仅知道编译器将会检查你放置到容器中的对象类型,而且在使用容器中的对象时,可以使用更加清晰的语法 上面的例子还说明,如果不需要使用每个元素的索引,可以使用foreach语法来选择List...List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常于它们被插入的顺序相同) 2)Map。一组成对的“键值对”对象,允许你使用键来查找值。...LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大 List常见的方法: contains()方法来确定某个对象是否在列表中。...containsAll() 判断一个列表是否在某个列表中 retainAll() 一种有效的交集操作 removeAll() 将从List中移除在参数List中的所有元素 addAll() 追加列表到末尾
但数组具有固定容量,而在更一般情况下,写程序时我们并不知道 将需要多少个对象 是否需要更复杂的方式来存储对象 因此数组这一限制过于受限。...然后将整个表达式用括号括起来,以便在调用 Apple 的 id() 方法之前,强制执行转型。 否则,将会产生语法错误。...因此,使用泛型,你不仅知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时也可以获得更清晰的语法。 泛型下的向上转型 当指定了某个类型为泛型参数时,并不仅限于只能将确切类型的对象放入集合中。...Map 则由大括号括住,每个键和值用等号连接(键在左侧,值在右侧)。 ArrayList 和 LinkedList 都是 List 的类型,从输出中可以看出,它们都按插入顺序保存元素。...不,它只是意味着你应该意识到这个问题,如果你开始在某个 ArrayList 中间执行很多插入操作,并且程序开始变慢,那么你应该看看你的 List 实现有可能就是罪魁祸首。
然后将整个表达式用括号括起来,以便在调用 Apple 的 id() 方法之前,强制执行转型。否则,将会产生语法错误。...因此,使用泛型,你不仅知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时也可以获得更清晰的语法。...List 必须以插入的顺序保存元素 Set 不能包含重复元素 Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。...Map 则由大括号括住,每个键和值用等号连接(键在左侧,值在右侧)。 ArrayList 和 LinkedList 都是 List 的类型,从输出中可以看出,它们都按插入顺序保存元素。...不,它只是意味着你应该意识到这个问题,如果你开始在某个 ArrayList 中间执行很多插入操作,并且程序开始变慢,那么你应该看看你的 List 实现有可能就是罪魁祸首。
注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ① . ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),所以不支持快速随机访问。ArrayList实现了RandomAccess接口,就表明了他具有快速随机访问功能。...HashSet如何检查重复 当把对象加入HashSet时,HashSet会先计算对象的HashCode值来判断对象加入的位置,同时也会与其它加入的对象的HashCode的值做比较,如果没有相符的HashCode...但是如果发现有相同的HashCode值的对象,这时会调用equals()方法来检查HashCode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。...是判断两个变量或实例所指向的内存空间的值是不是相同 ==是指对内存地址进行比较 equals()是对字符串的内容进行比较 ==指引用是否相同 ,equals()指的是值是否相同 8.
当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,...注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...但是如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让加入操作成功。...在openjdk8中,HashSet的add()方法只是简单的调用了HashMap的put()方法,并且判断了一下返回值以确保是否有重复元素。...中,实际上无论HashSet中是否已经存在了某元素,HashSet都会直接插入,只是会在add()方法的返回值处告诉我们插入前是否存在相同元素。
)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。...是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。...注意双向链表和双向循环链表的区别,下面有介绍到!) \3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。...,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。
List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。...Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。...注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。...在 binarySearch()方法中,它要判断传入的list 是否 RamdomAccess 的实例,如果是,调用indexedBinarySearch()方法,如果不是,那么调用iteratorBinarySearch
如果不考虑到线程的安全因素,一般用ArrayList效率比较高。 2、如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。...3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。...2、ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段...弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。...乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作。
startIndex List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素 Set...key的访问; 如果有两个Key重复,那么会覆盖之前的; 实现类 : HashSet:equals返回true,hashCode返回相同的整数;哈希表;存储的数据是无序的。...HashSet的特征 不仅不能保证元素插入的顺序,而且在元素在以后的顺序中也可能变化(这是由HashSet按HashCode存储对象(元素)决定的,对象变化则可能导致HashCode变化) HashSet...==操作符检查实参是否为指向对象的引用” 使用instanceof操作符检查实参是否为正确的类型 把实参转换到正确的类型; 对于该类中每一个“关键”域,检查实参中的域与当前对象中对应的域值是否匹 配。...java的集合类,都是用来存放java对象,这是他们的相同点, 区别: 1.同步性: Vector是同步的,这个类的一些方法保证了Vector中的对象的线程安全的,而ArrayList则是异步的,因此ArrayList
ArrayList实现了List接口,元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。...每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。...public E get(int index) { rangeCheck(index); return (E) elementData[index];//注意类型转换 } add() 在添加元素之前...跟add()方法类似,在插入之前也需要进行空间检查,如果需要则自动扩容;如果从指定位置插入,也会存在移动元素的情况。 addAll()的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。...对象能否被GC的依据是是否还有引用指向它,上面代码中如果不手动赋null值,除非对应的位置被其他元素覆盖,否则原来的对象就一直不会被回收。
在JDK 官方文档中提到: ReentrantLock是“一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大...可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。...Ø HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。...在Map 中插入、删除和定位元素,HashMap是最好的选择。 Ø TreeMap取出来的是排序后的键值对。插入、删除需要维护平衡会牺牲一些效率。...Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点
在JDK 5.0之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object类型处理;从JDK 5.0增加了泛型以后,Java集合可以记住容器中对象的数据类型。...大多数操作与ArrayList相同,区别在于Vector是线程安全的 在各种list中,最好把ArrayList作为缺省选择。...2)定制排序中,比较两个对象是否相同的标准为:compare()返回0,不再是equals()方法 向TreeSet中添加的数据,要求是相同类的对象。...对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较返回值。...HashMap的扩容:(jdk7) 在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。
二、检查数组是否包含值 ---- 开发人员经常这样做: Set set = new HashSet(Arrays.asList(arr)); return set.contains...三、从循环内的列表中删除元素 ---- 考虑以下代码,该代码在迭代期间删除元素: ArrayList list = new ArrayList(Arrays.asList...默认的hashCode()方法为不同的对象提供不同的整数,而equals()方法仅在两个引用引用同一对象时才返回true。所以hashCode()和equals()方法校验结果不相同。...但是对于每个不同的值,它都需要一个单独的对象,并且太多的对象可能会导致垃圾回收的高成本。在可变和不可变之间进行选择时应保持平衡。通常,使用可变对象以避免产生太多中间对象。...九、Super 和 Sub的构造函数 ---- ? 因为未定义默认的超级构造函数,所以会发生此编译错误。在Java中,如果类未定义构造函数,则编译器将默认为该类插入默认的无参数构造函数。
总体介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。...每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。...这两个方法都是向容器中添加新元素,这可能会导致capacity不足,因此在添加元素之前,都需要进行剩余空间检查,如果需要则自动扩容。扩容操作最终是通过grow()方法完成的。...跟add()方法类似,在插入之前也需要进行空间检查,如果需要则自动扩容;如果从指定位置插入,也会存在移动元素的情况。 addAll()的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。...对象能否被GC的依据是是否还有引用指向它,上面代码中如果不手动赋null值,除非对应的位置被其他元素覆盖,否则原来的对象就一直不会被回收。
(一般子类会重写) equals比较两个对象是否相等 clone克隆一份对象,此时克隆的对象在堆内存中重新创建,并返回了内存地址 在具体使用的时候需要实现Cloneable接口否则抛出CloneNotSuppoertedException...哈希算法强调,同一个对象的哈希值是唯一的,这也就是没有重写equals方法之前,判断两个对象是否相等的依据。...n),而使用hashcode计算出要添加对象的哈希值,直接判断Set中是否存在这个hash值就可以了。...当Put元素的时候,首先会检查当前table是否存有值,如果没有值则通过resize方法创建一个初始容量为16的数组,进行添加。...如果此时hash算法计算出来的下标数组位有值,则比较当前新添加的元素和该值是否相同,如果相同,直接替换;如果不同,则检查当前节点是不是红黑树的节点,如果是红黑树的节点,则进行红黑树节点添加;如果不是则进行链表添加
关于上面的transient,找到一个靠谱的说法: 在ArrayList中的elementData这个数组的长度是变长的,java在扩容的时候,有一个扩容因子,也就是说这个数组的长度是大于等于ArrayList...的长度的,我们不希望在序列化的时候将其中的空元素也序列化到磁盘中去,所以需要手动的序列化数组对象,所以使用了transient来禁止自动序列化这个数组。...add(int index, E element) { // 检查插入的位置,是否合法 rangeCheckForAdd(index); // 检查是不是需要扩容...; // 实际的存储元素个数增加 size++; } 查询元素 get()方法相对比较简单,获取之前检查参数是否合法,就可以返回元素了。...,修改次数增加,然后,将数组元素copy到新的数组中即可。
关于上面的transient,找到一个靠谱的说法:在ArrayList中的elementData这个数组的长度是变长的,java在扩容的时候,有一个扩容因子,也就是说这个数组的长度是大于等于ArrayList...的长度的,我们不希望在序列化的时候将其中的空元素也序列化到磁盘中去,所以需要手动的序列化数组对象,所以使用了transient来禁止自动序列化这个数组。...add(int index, E element) { // 检查插入的位置,是否合法 rangeCheckForAdd(index); // 检查是不是需要扩容...; // 实际的存储元素个数增加 size++; } 查询元素 get()方法相对比较简单,获取之前检查参数是否合法,就可以返回元素了。...,修改次数增加,然后,将数组元素copy到新的数组中即可。
("贾宝玉"); // void add(int index, Object ele):在index 位置插入ele 元素 //在index = 1 的位置插入一个对象...来保存元素,由于只需要在key中保存,所以采用虚拟对象PRESENT对应map中插入key-value的value值的引用。...如果没有相符的 hashcode,HashSet 会假设对象没有重复出现,会将对象插入到相应的位置中。...但是如果发现有相同 hashcode 值的对象,这时会调用对象的 equals() 方法来检查对象是否真的相同,如果相同,则 HashSet 就不会让重复的对象加入到 HashSet 中,这样就保证了元素的不重复...HashSet 保证元素不重复是利用 HashMap 的 put 方法实现的,在存储之前先根据 key 的 hashCode 和 equals 判断是否已存在,如果存在就不在重复插入了,这样就保证了元素的不重复
、实例变量具有默认值。...简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 比如:Animal ad=new Dog(); 30、虚方法 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误...List接口存储一组不唯一(可重复)、有序(存储空间连续)(插入顺序)的对象; Set接口存储一组唯一,无序的对象 Map接口存储一组键值对象,提供key到value的映射; 37.2、ArrayList...采用对象的equals()方法比较两个对象是否相等,即时候指向的是同一个对象;若返回值是True,则后面的值会覆盖掉前面的值!...注意:在String中equals是比较两个字符串的内容(可以是分别new的)是否一样,可能是两个引用,String类重写过equals方法,只要字符串值一样,则认为是一个对象,set就会只加一个!
领取专属 10元无门槛券
手把手带您无忧上云