当前位置: 首页 > news >正文

怎样上传网站程序国外室内设计网站大全网站

怎样上传网站程序,国外室内设计网站大全网站,房产类网站开发,家在深圳歌词点击下载《40道java集合面试题含答案#xff08;很全#xff09;》 1. 什么是集合 集合就是一个放数据的容器#xff0c;准确的说是放数据对象引用的容器集合类存放的都是对象的引用#xff0c;而不是对象的本身集合类型主要有3种#xff1a;set(集#xff09;、list(列…点击下载《40道java集合面试题含答案很全》 1. 什么是集合 集合就是一个放数据的容器准确的说是放数据对象引用的容器集合类存放的都是对象的引用而不是对象的本身集合类型主要有3种set(集、list(列表和map(映射)。 2. 集合的特点 集合的特点主要有如下两点 集合用于存储对象的容器对象是用来封装数据对象多了也需要存储集中式管理。和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小 3. 集合和数组的区别 数组是固定长度的集合可变长度的。数组可以存储基本数据类型也可以存储引用数据类型集合只能存储引用数据类型。数组存储的元素必须是同一个数据类型集合存储的对象可以是不同数据类型。 4. 使用集合框架的好处 容量自增长 提供了高性能的数据结构和算法使编码更轻松提高了程序速度和质量 可以方便地扩展或改写集合提高代码复用性和可操作性。 通过使用JDK自带的集合类可以降低代码维护和学习新API成本。 5. 常用的集合类有哪些 Map接口和Collection 接口是所有集合框架的父接口 Collection接口的子接口包括Set接口和List接口 Map接口的实现类主要有HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有ArrayList、LinkedList、Stack以及Vector等 6. ListSetMap三者的区别 特性ListSetMap顺序性保持元素的插入顺序不保持元素的插入顺序不保持元素的插入顺序唯一性允许重复元素不允许重复元素键唯一值不一定唯一使用场景用于需要有序和可重复元素的场景用于需要快速查找元素是否存在且不需要重复元素的场景用于需要存储键值对且键唯一的场景线程安全有线程安全的实现类例如Collections.synchronizedList具体取决于实现类有线程安全的实现类例如Collections.synchronizedSet具体取决于实现类有线程安全的实现类例如Collections.synchronizedMap具体取决于实现类 Java 容器分为 Collection 和 Map 两大类Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、ListMap接口不是collection的子接口。 Collection集合主要有List和Set两大接口 List一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。 Map是一个键值对集合存储键、值和之间的映射。 Key无序唯一value 不要求有序允许重复。Map没有继承于Collection接口从Map集合中检索元素时只要给出键对象就会返回对应的值对象。Map 的常用实现类HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap 7. 集合框架底层数据结构 Collection List Arraylist Object数组 Vector Object数组 LinkedList 双向循环链表 Set HashSet无序唯一基于 HashMap 实现的底层采用 HashMap 来保存元素 LinkedHashSet LinkedHashSet 继承与 HashSet并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样不过还是有一点点区别的。 TreeSet有序唯一 红黑树(自平衡的排序二叉树。) Map HashMap JDK1.8之前HashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的“拉链法”解决冲突.JDK1.8以后在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为8时将链表转化为红黑树以减少搜索时间。LinkedHashMapLinkedHashMap 继承自 HashMap所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外LinkedHashMap 在上面结构的基础上增加了一条双向链表使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作实现了访问顺序相关逻辑。HashTable 数组链表组成的数组是 HashMap 的主体链表则是主要为了解决哈希冲突而存在的TreeMap 红黑树自平衡的排序二叉树 8. 哪些集合类是线程安全的 Vector就比Arraylist多了个 synchronized 线程安全因为效率较低现在已经不太建议使用。hashTable就比hashMap多了个synchronized (线程安全)不建议使用。ConcurrentHashMap是Java5中支持高并发、高吞吐量的线程安全HashMap实现。它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里扮演锁的角色HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里包含一个Segment数组 Segment的结构和HashMap类似是一种数组和链表结构一个Segment里包含一个HashEntry数组每个HashEntry是一个链表结构的元素每个Segment守护着一个HashEntry数组里的元素当对HashEntry数组的数据进行修改时必须首先获得它对应的Segment锁。推荐使用 9. 怎么确保一个集合不能被修改 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。 示例代码如下 ListString list new ArrayList(); list. add(x); CollectionString clist Collections. unmodifiableCollection(list); clist. add(y); // 运行时此行报错 System. out. println(list. size());10. 迭代器 Iterator 是什么 Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration迭代器允许调用者在迭代过程中移除元素。因为所有Collection接继承了Iterator迭代器。 11. Iterator 和 ListIterator 有什么区别 Iterator 可以遍历 Set 和 List 集合而 ListIterator 只能遍历 List。Iterator 只能单向遍历而 ListIterator 可以双向遍历向前/后遍历。ListIterator 实现 Iterator 接口然后添加了一些额外的功能比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。 12. 遍历一个 List 有哪些不同的方式每种方法的实现原理是什么Java 中 List遍历的最佳实践是什么 遍历方式有以下几种 for 循环遍历基于计数器。在集合外部维护一个计数器然后依次读取每一个位置的元素读取到最后一个元素后停止。 迭代器遍历Iterator。Iterator 是面向对象的一个设计模式目的是屏蔽不同数据集合的特点统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。 foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现使用时不需要显式声明Iterator 或计数器。优点是代码简洁不易出错缺点是只能做简单的遍历不能在遍历过程中操作数据集合例如删除、替换。 最佳实践 Java Collections 框架中提供了一个 RandomAccess 接口用来标记 List 实现是否支持 Random Access。如果一个数据集合实现了该接口就意味着它支持 Random Access按位置读取元素的平均时间复杂度为 O(1)如ArrayList。如果没有实现该接口表示不支持 Random Access如LinkedList。推荐的做法就是支持 Random Access 的列表可用 for 循环遍历否则建议用 Iterator 或foreach 遍历。 13. 说一下 ArrayList 的优缺点 ArrayList的优点如下 ArrayList 底层以数组实现是一种随机访问模式。ArrayList 实现了 RandomAccess 接口因此查找的时候非常快。ArrayList 在顺序添加一个元素的时候非常方便。 ArrayList 的缺点如下 删除元素的时候需要做一次元素复制操作。如果要复制的元素很多那么就会比较耗费性能。插入元素的时候也需要做一次元素复制操作缺点同上。 ArrayList 比较适合顺序添加、随机访问的场景。 14. ArrayList 和 LinkedList 的区别是什么 数据结构实现ArrayList 是动态数组的数据结构实现而 LinkedList 是双向链表的数据结构实现。 随机访问效率ArrayList 比 LinkedList 在随机访问的时候效率要高因为 LinkedList 是线性的数据存储方式所以需要移动指针从前往后依次查找。 增加和删除效率在非首尾的增加和删除操作LinkedList 要比 ArrayList 效率要高因为ArrayList 增删操作要影响数组内的其他数据的下标。 内存空间占用LinkedList 比 ArrayList 更占内存因为 LinkedList 的节点除了存储数据还存储了两个引用一个指向前一个元素一个指向后一个元素。 线程安全ArrayList 和 LinkedList 都是不同步的也就是不保证线程安全 综合来说在需要频繁读取集合中的元素时更推荐使用 ArrayList而在插入和删除操作较多时更推荐使用 LinkedList。 LinkedList 的双向链表也叫双链表是链表的一种它的每个数据结点中都有两个指针分别指向直接后继和直接前驱。所以从双向链表中的任意一个结点开始都可以很方便地访问它的前驱结点和后继结点。 15. ArrayList 和 Vector 的区别是什么 这两个类都实现了 List 接口List 接口继承了 Collection 接口他们都是有序集合 线程安全Vector 使用了 Synchronized 来实现线程同步是线程安全的而 ArrayList 是非线程安全的。性能ArrayList 在性能方面要优于 Vector。扩容ArrayList 和 Vector 都会根据实际的需要动态的调整容量只不过在 Vector 扩容每次会增加 1 倍而 ArrayList 只会增加 50%。 Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。Arraylist不是同步的所以在不需要保证线程安全时时建议使用Arraylist。 16.插入数据时ArrayList、LinkedList、Vector谁速度较快阐述ArrayList、Vector、LinkedList 的存储性能和特性 ArrayList和Vector 底层的实现都是使用数组方式存储数据。数组元素数大于实际存储的数据以便增加和插入元素它们都允许直接按序号索引元素但是插入元素要涉及数组元素移动等内存操作所以索引数据快而插入数据慢。Vector 中的方法由于加了 synchronized 修饰因此 Vector 是线程安全容器但性能上较ArrayList差。LinkedList 使用双向链表实现存储按序号索引数据需要进行前向或后向遍历但插入数据时只需要记录当前项的前后项即可所以 LinkedList 插入速度较快。 17. List 和 Set 的区别 List Set 都是继承自Collection 接口List 特点一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。Set 特点一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。List 支持for循环也就是通过下标来遍历也可以用迭代器但是set只能用迭代因为他无序无法用下标来取得想要的值。Set和List对比 Set检索元素效率低下删除和插入效率高插入和删除不会引起元素位置改变。List和数组类似List可以动态增长查找元素效率高插入删除元素效率低因为会引起其他元素位置改变 18. 说一下 HashSet 的实现原理 HashSet 是基于 HashMap 实现的HashSet的值存放于HashMap的key上HashMap的value统一为present因此 HashSet 的实现比较简单相关 HashSet 的操作基本上都是直接调用底层HashMap 的相关方法来完成HashSet 不允许重复的值。 19. HashSet如何检查重复HashSet是如何保证数据不可重复的 向HashSet 中add ()元素时判断元素是否存在的依据不仅要比较hash值同时还要结合equles 方法比较。HashSet 中的add ()方法会使用HashMap 的put()方法。HashMap 的 key 是唯一的由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key并且在HashMap中如果K/V相同时会用新的V覆盖掉旧的V然后返回旧的V。所以不会重复 HashMap 比较key是否相等是先比较hashcode 再比较equals 。 hashCode与equals的相关规定 如果两个对象相等则hashcode一定也是相同的hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 两个对象相等对两个equals方法返回true 两个对象有相同的hashcode值它们也不一定是相等的 综上equals方法被覆盖过则hashCode方法也必须被覆盖 hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode()则该class的两个对象无论如何都不会相等即使这两个对象指向相同的数据。 与equals的区别 是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 是指对内存地址进行比较equals()是对字符串的内容进行比较 20. HashSet与HashMap的区别 HashMapHashSet实现了Map接口实现Set接口存储键值对仅存储对象调用put向map中添加元素调用add方法向Set中添加元素HashMap使用键Key计算HashcodeHashSet使用成员对象来计算hashcode值对于两个对象来说hashcode可能相同所以equals()方法用来判断对象的相等性如果两个对象不同的话那么返回falseHashMap相对于HashSet较快因为它是使用唯一的键获取对象HashSet较HashMap来说比较慢 21. 什么是Hash算法 哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值这个较小的二进制值叫做哈希值。 22. 什么是链表 链表是可以将物理地址上不连续的数据连接起来通过指针来对物理地址进行操作实现增删改查等功能。链表大致分为单链表和双向链表 单链表:每个节点包含两部分一部分存放数据变量的data另一部分是指向下一节点的next指针 双向链表:除了包含单链表的部分还增加的pre前一个节点的指针 链表的优点 插入删除速度快因为有next指针指向其下一个节点通过改变指针的指向可以方便的增加删除元素内存利用率高不会浪费内存可以使用内存中细小的不连续空间大于node节点的大小并且在需要空间的时候才创建空间大小没有固定拓展很灵活。 链表的缺点 不能随机查找必须从第一个开始遍历查找效率低 23. 说一下HashMap的实现原理 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作并允许使用null值和null键。此类不保证映射的顺序特别是它不保证该顺序恒久不变。 HashMap的数据结构 在Java编程语言中最基本的结构就是两种一个是数组另外一个是模拟指针引用所有的数据结构都可以用这两个基本结构来构造的HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构即数组和链表的结合体。 HashMap 基于 Hash 算法实现的 当我们往HashMap中put元素时利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时如果出现hash值相同的key此时有两种情况。 如果key相同则覆盖原始值 如果key不同出现冲突则将当前的key-value放入链表中 获取时直接找到hash值对应的下标在进一步判断key是否相同从而找到对应值。 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题核心就是使用了数组的存储方式然后将冲突的key的对象放入链表中一旦发现冲突就在链表中做进一步的对比。 需要注意Jdk 1.8中对HashMap的实现做了优化当链表中的节点数据超过八个之后该链表会转为红黑树来提高查询效率从原来的O(n)到O(logn)。 24. HashMap的put方法的具体流程 当我们put的时候首先计算 key 的 hash 值这里调用了 hash 方法 hash方法实际是让key.hashCode() 与 key.hashCode()16 进行异或操作高16bit补0一个数和0异或不变所以 hash 函数大概的作用就是高16bit不变低16bit和高16bit做了一个异或目的是减少碰撞。按照函数注释因为bucket数组大小是2的幂计算下标 index (table.length - 1) hash 如果不做 hash 处理相当于散列生效的只有几个低 bit 位为了减少散列的碰撞设计者综合考虑了速度、作用、质量之后使用高16bit和低16bit异或来简单处理减少碰撞而且JDK8中用了复杂度 Ologn的树结构来提升碰撞下的性能。 25. HashMap的扩容操作是怎么实现的 在jdk1.8中resize方法是在hashmap中的键值对大于阀值时或者初始化时就调用resize方法进行扩容 每次扩展的时候都是扩展2倍 扩展后Node对象的位置要么在原位置要么移动到原偏移量两倍的位置。 在putVal()中我们看到在这个函数里面使用到了2次resize()方法resize()方法表示的在进行第一次初始化时会对其进行扩容或者当该数组的实际大小大于其临界值值(第一次为12)这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发这也是JDK1.8版本的一个优化的地方在1.7中扩容之后需要重新去计算其Hash值根据Hash值对其进行分发但在1.8版本中则是根据在同一个桶的位置中进行判断(e.hash oldCap)是否为0重新进行hash分配后该元素的位置要么停留在原始位置要么移动到原始位置增加的数组大小这个位置上。 26. HashMap是怎么解决哈希冲突的 什么是哈希 Hash一般翻译为“散列”也有直接音译为“哈希”的 Hash就是指使用哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值这个较小的二进制值叫做哈希值。 什么是哈希冲突 当两个不同的输入值根据同一散列函数计算出相同的散列值的现象我们就把它叫做碰撞哈希碰撞。 HashMap的数据结构 在Java中保存数据有两种比较简单的数据结构数组和链表。 数组的特点是寻址容易插入和删除困难 链表的特点是寻址困难但插入和删除容易 所以我们将数组和链表结合在一起发挥两者各自的优势就可以使用俩种方式链地址法和开放地址法可以解决哈希冲突 链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位开放地址法是通过一个探测算法当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。 但相比于hashCode返回的int类型我们HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY 1 4 即2的四次方16要远小于int类型的范围所以我们如果只是单纯的用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率并且最坏情况下还会将HashMap变成一个单链表所以我们还需要对hashCode作一定的优化。 hash()函数 如果使用hashCode取余那么相当于参与运算的只有hashCode的低位高位是没有起到任何作用的所以我们的思路就是让hashCode取值出的高位也参与运算进一步降低hash碰撞的概率使得数据分布更平均我们把这样的操作称为扰动。 27. 能否使用任何类作为 Map 的 key 可以使用任何类作为 Map 的 key然而在使用之前需要考虑以下几点 如果类重写了 equals() 方法也应该重写 hashCode() 方法。类的所有实例需要遵循与 equals() 和 hashCode() 相关的规则。如果一个类没有使用 equals()不应该在 hashCode() 中使用它。用户自定义 Key 类最佳实践是使之为不可变的这样 hashCode() 值可以被缓存起来拥有更好的性能。不可变的类也可以确保 hashCode() 和 equals() 在未来不会改变这样就会解决与可变相关的问题了。 28. 为什么HashMap中String、Integer这样的包装类适合作为K String、Integer等包装类的特性能够保证Hash值的不可更改性和计算准确性能够有效的减少Hash碰撞的几率。都是final类型即不可变性保证key的不可更改性不会存在获取hash值不同的情况。内部已重写了 equals() 、 hashCode() 等方法遵守了HashMap内部的规范不清楚可以去上面看看putValue的过程不容易出现Hash值计算错误的情况 29. 如果使用Object作为HashMap的Key应该怎么办呢 重写 hashCode() 和 equals() 方法 重写 hashCode() 是因为需要计算存储数据的存储位置需要注意不要试图从散列码计算中 排除掉一个对象的关键部分来提高性能这样虽然能更快但可能会导致更多的Hash碰撞 重写 equals() 方法需要遵守自反性、对称性、传递性、一致性以及对于任何非null的引用值xx.equals(null)必须返回false的这几个特性目的是为了保证key在哈希表中的唯一性 30. HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标 hashCode() 方法返回的是int整数类型其范围为-(2 ^ 31)~(2 ^ 31 - 1)约有40亿个映射空间而HashMap的容量范围是在16初始化默认值~2 ^ 30HashMap通常情况下是取不到最大值的并且设备上也难以提供这么多的存储空间从而导致通过 hashCode() 计算出的哈希值可能不在数组大小范围内进而无法匹配存储位置 那怎么解决呢 HashMap自己实现了自己的 hash() 方法通过两次扰动使得它自己的哈希值高低位自行进行异或运算降低哈希碰撞概率也使得数据分布更平均 在保证数组长度为2的幂次方的时候使用 hash() 运算之后的值与运算数组长度 - 1来获取数组下标的方式进行存储这样一来是比取余操作更加有效率二来也是因为只有当数组长度为2的幂次方时h(length-1)才等价于h%length三来解决了“哈希值与数组大小范围不匹配”的问题 31.HashMap 的长度为什么是2的幂次方 为了能让 HashMap 存取高效尽量较少碰撞也就是要尽量把数据分配均匀每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。 这个算法应该如何设计呢 我们首先可能会想到采用%取余的操作来实现。但是重点来了“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与()操作也就是说 hash%lengthhash(length-1)的前提是 length 是2的 n 次方。” 并且 采用二进制位操作 相对于%能够提高运算效率这就解释了 HashMap 的长度为什么是2的幂次方。 那为什么是两次扰动呢 这样就是加大哈希值低位的随机性使得分布更均匀从而提高对应数组存储下标位置的随机性均匀性最终减少Hash冲突两次就够了已经达到了高位低位同时参与运算的目的 32. HashMap 与 HashTable 有什么区别 线程安全 HashMap 是非线程安全的HashTable 是线程安全的HashTable 内部的方法基本都经过synchronized 修饰。如果你要保证线程安全的话就使用 ConcurrentHashMap 效率 因为线程安全的问题HashMap 要比 HashTable 效率高一点。另外HashTable 基本被淘汰不要在代码中使用它如果你要保证线程安全的话就使用 ConcurrentHashMap 对Null key 和Null value的支持 HashMap 中null 可以作为键这样的键只有一个可以有一个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有一个 null直接抛NullPointerException。 初始容量大小和每次扩充容量大小的不同 创建时如果不指定容量初始值Hashtable 默认的初始大小为11之后每次扩充容量变为原来的2n1。HashMap 默认的初始化大小为16。之后每次扩充容量变为原来的2倍。 创建时如果给定了容量初始值那么 Hashtable 会直接使用你给定的大小而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂作为哈希表的大小后面会介绍到为什么是2的幂次方。 底层数据结构 JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为8时将链表转化为红黑树以减少搜索时间。Hashtable 没有这样的机制。 推荐使用在 Hashtable 的类注释可以看到Hashtable 是保留类不建议使用推荐在单线程环境下使用 HashMap 替代如果需要多线程使用则用 ConcurrentHashMap 替代。 33. 什么是TreeMap TreeMap 是一个有序的key-value集合它是通过红黑树实现的。TreeMap基于红黑树Red-Black tree实现。该映射根据其键的自然顺序进行排序或者根据创建映射时提供的 Comparator 进行排序具体取决于使用的构造方法。TreeMap是线程非同步的。 34. 如何决定使用 HashMap 还是 TreeMap 对于在Map中插入、删除和定位元素这类操作HashMap是最好的选择。然而假如你需要对一个有序的key集合进行遍历TreeMap是更好的选择。基于你的collection的大小也许向HashMap中添加元素会更快将map换为TreeMap进行有序key的遍历。 35.HashMap 和 ConcurrentHashMap 的区别 ConcurrentHashMap对整个桶数组进行了分割分段(Segment)然后在每一个分段上都用lock锁进行保护相对于HashTable的synchronized锁的粒度更精细了一些并发性能更好而HashMap没有锁机制不是线程安全的。JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。 HashMap的键值对允许有null但是ConCurrentHashMap都不允许。 36.ConcurrentHashMap 和 Hashtable 的区别 ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。 底层数据结构 JDK1.7的 ConcurrentHashMap 底层采用 分段的数组链表 实现JDK1.8采用的数据结构跟HashMap1.8的结构一样数组链表/红黑二叉树。Hashtable 和 JDK1.8之前的 HashMap 的底层数据结构类似都是采用 数组链表 的形式数组是 HashMap 的主体链表则是主要为了解决哈希冲突而存在的 实现线程安全的方式 在JDK1.7的时候ConcurrentHashMap分段锁 对整个桶数组进行了分割分段(Segment)每一把锁只锁容器其中一部分数据多线程访问容器里不同数据段的数据就不会存在锁竞争提高并发访问率。默认分配16个Segment比Hashtable效率提高16倍。 到了 JDK1.8 的时候已经摒弃了Segment的概念而是直接用 Node 数组链表红黑树的数据结构来实现并发控制使用 synchronized 和 CAS 来操作。JDK1.6以后 对synchronized锁做了很多优化 整个看起来就像是优化过且线程安全的 HashMap虽然在JDK1.8中还能看到 Segment 的数据结构但是已经简化了属性只是为了兼容旧版本 Hashtable(同一把锁) :使用 synchronized 来保证线程安全效率非常低下。当一个线程访问同步方法时其他线程也访问同步方法可能会进入阻塞或轮询状态如使用 put 添加元素另一个线程不能使用 put 添加元素也不能使用 get竞争会越来越激烈效率越低。 37. Array 和 ArrayList 有何区别 Array 可以存储基本数据类型和对象ArrayList 只能存储对象。Array 是指定固定大小的而 ArrayList 大小是自动扩展的。Array 内置方法没有 ArrayList 多比如 addAll、removeAll、iteration 等方法只有 ArrayList有。 对于基本类型数据集合使用自动装箱来减少编码工作量。但是当处理固定大小的基本数据类型的时候这种方式相对比较慢。 38. comparable 和 comparator的区别 comparable接口实际上是出自java.lang包它有一个 compareTo(Object obj)方法用来排序comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序一般我们需要对一个集合使用自定义排序时我们就要重写compareTo方法或compare方法当我们需要对某一个集合实现两种排序方式比如一个song对象中的歌名和歌手名分别采用一种排序方法的话我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序第二种代表我们只能使用两个参数版的Collections.sort()。 39. Collection 和 Collections 有什么区别 java.util.Collection 是一个集合接口集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式其直接继承接口有List与Set。Collections则是集合类的一个工具类/帮助类其中提供了一系列静态方法用于对集合中元素进行排序、搜索以及线程安全等各种操作。 40. TreeMap 和 TreeSet 在排序时如何比较元素Collections 工具类中的 sort()方法如何比较元素 TreeSet 要求存放的对象所属的类必须实现 Comparable 接口该接口提供了比较元素的compareTo()方法当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进行排序。 Collections 工具类的 sort 方法有两种重载的形式 第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较 第二种不强制性的要求容器中的元素必须可比较但是要求传入第二个参数参数是Comparator接口的子类型需要重写 compare 方法实现元素的比较相当于一个临时定义的排序规则其实就是通过接口注入比较元素大小的算法也是对回调模式的应用Java 中对函数式编程的支持。 承接口有List与Set。 Collections则是集合类的一个工具类/帮助类其中提供了一系列静态方法用于对集合中元素进行排序、搜索以及线程安全等各种操作。 40. TreeMap 和 TreeSet 在排序时如何比较元素Collections 工具类中的 sort()方法如何比较元素 TreeSet 要求存放的对象所属的类必须实现 Comparable 接口该接口提供了比较元素的compareTo()方法当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进行排序。 Collections 工具类的 sort 方法有两种重载的形式 第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较 第二种不强制性的要求容器中的元素必须可比较但是要求传入第二个参数参数是Comparator接口的子类型需要重写 compare 方法实现元素的比较相当于一个临时定义的排序规则其实就是通过接口注入比较元素大小的算法也是对回调模式的应用Java 中对函数式编程的支持。 点击下载《40道java集合面试题含答案很全》
http://www.zqtcl.cn/news/750111/

相关文章:

  • 如何建立网站视频教程湖北seo关键词排名优化软件
  • 南宁网站建设推荐q479185700顶上新公司网站建设流程
  • 石家庄城乡建设局网站四川网络营销
  • 网站更换名称需要重新备案吗赣州章贡区二手房出售信息
  • 浙江恒元建设网站wordpress 主题 英文
  • 甘肃网站建设推广做暧昧免费视频大全网站
  • 科技公司网站系统个人网站模板大全
  • 建网站源码建站详解做加油机公司网站
  • 北海做网站有哪家网站布局策划案
  • 做app网站的软件有哪些内容吗本地网站建设公司
  • 做服装团购有哪些网站有哪些网页端二维码在哪里
  • 石材网站建设方案科室建设网站
  • 梧州住房和建设局网站网站目录文件
  • 有没有做生鲜配送的网站wordpress调用摘要
  • 建设社团网站的可行性分析沈阳网站建设企业
  • 青岛知名网站建设公司优化大师有必要花钱吗
  • pc网站做app京东海淀区
  • 效果好的网站建设公萝岗企业网站建设
  • wordpress个人展示网站6新西兰网站后缀
  • 为什么自己做的网站别人打不开三门峡市湖滨区建设局网站
  • 长春网长春网站建设络推广工程建设国家标准网站
  • 微网站开发 mui框架网站备案幕布拍照是什么
  • 北京天通苑 做网站西安百度网站建设
  • 辽阳建设网站学校 网站 建设 目的
  • 建设电影网站赚钱公司简介模板免费word简易
  • 响应式网站设计的主页自己做装修效果图app软件
  • 做网站最简单的方法做网站开发挣钱吗
  • 网站建设基础入门国内免费的ip地址
  • wordpress 付费剧集网站坐什么网站能用到html5
  • 孝感房产网站建设wordpress E405