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

常州网站建设 最易长沙知名的营销公司

常州网站建设 最易,长沙知名的营销公司,长春网站制作公司,网站这么做404页面Collection1.Collection有哪些类#xff1f;Java集合框架中的Collection接口是所有集合类的基础接口#xff0c;定义了一些基本的集合操作#xff0c;如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操…Collection1.Collection有哪些类Java集合框架中的Collection接口是所有集合类的基础接口定义了一些基本的集合操作如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操作元素的方法。它允许元素重复并且有序。在List中可以使用get()和set()方法访问指定位置的元素使用add()和remove()方法添加和删除元素。常见的List实现类有ArrayListArrayList 是一个基于动态数组的实现支持随机访问插入和删除操作效率低。LinkedList底层使用双向链表实现插入和删除操作效率高但随机访问效率低。Vector与ArrayList类似但是线程安全效率较低。SetSet接口表示一个不允许有重复元素的集合实现类必须重写equals()方法和hashCode()方法。常见的Set实现类有HashSet底层使用哈希表实现无序元素唯一。LinkedHashSet底层使用哈希表和链表实现有序元素唯一。TreeSet底层使用红黑树实现有序元素唯一。QueueQueue接口表示一个先进先出FIFO的队列。常见的Queue实现类有LinkedList底层使用链表实现效率较高LinkedList实现了Queue接口它支持在队列的头部和尾部进行元素的添加和删除操作因此可以被用作栈、队列和双端队列。。PriorityQueue是一种基于优先级堆的Queue它保证了每次取出的元素都是队列中优先级最高的元素。。需要注意的是这些集合类都是基于Object的如果需要在集合中存储特定类型的元素需要使用泛型。例如ListString表示一个只包含字符串元素的List。2.讲一下ArrayList的底层实现ArrayList 的底层实现基于数组它继承了 AbstractList 抽象类并实现了 List 接口。下面是一些关于 ArrayList 的底层实现的细节数组ArrayList 的内部实现是一个数组使用数组实现可以方便地进行随机访问根据索引直接访问指定位置的元素。自动扩容ArrayList 可以自动扩容以适应动态变化的容量需求每次扩容会增加 50% 的容量。元素的添加ArrayList 中的 add(E e) 方法会在末尾添加一个元素如果当前容量不足则会进行扩容。元素的删除ArrayList 中的 remove(int index) 方法会删除指定索引位置的元素将该位置后面的元素向前移动一位。3.ArrayList自动扩容的具体实现当调用ArrayList的add方法时如果当前列表中的元素数量已经达到容量的极限那么就需要自动扩容。扩容的过程就是创建一个新的数组并将原来数组中的元素复制到新数组中。默认情况下ArrayList的容量是10。当第一个元素被添加时内部数组会被初始化为长度为10的数组。当添加第11个元素时原始数组将会被复制到一个新的长度为15的数组中容量增加了50%。如果再添加元素当超过了15个元素时内部数组将再次扩容到新的长度为22的数组中。当使用ensureCapacity方法增加数组容量时ArrayList使用给定参数的最大值和当前容量的大小来决定新的容量大小。private void ensureCapacityInternal(int minCapacity) {// 判断是否需要扩容if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity); }private void ensureExplicitCapacity(int minCapacity) {modCount;// 判断是否需要扩容if (minCapacity - elementData.length 0) {grow(minCapacity);} }private void grow(int minCapacity) {int oldCapacity elementData.length;int newCapacity oldCapacity (oldCapacity 1);if (newCapacity - minCapacity 0) {newCapacity minCapacity;}if (newCapacity - MAX_ARRAY_SIZE 0) {newCapacity hugeCapacity(minCapacity);}elementData Arrays.copyOf(elementData, newCapacity); } 扩容操作的代价是很高的因此在实际使用时我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时要在构造ArrayList实例时就指定其容量以避免数组扩容的发生。或者根据实际需求通过调用ensureCapacity方法来手动增加ArrayList实例的容量。4.ArrayList的Fail-Fast机制在 Java 中如果使用集合类的迭代器来遍历集合元素而同时修改了集合中的元素就有可能会发生 ConcurrentModificationException 异常。这是因为 Java 集合类的迭代器是快速失败fail-fast机制如果在迭代集合时集合发生了结构性变化例如添加或删除元素迭代器就会立即抛出异常而不是等到迭代完成再抛出异常。ArrayList 是一个支持随机访问的序列容器底层使用数组实现所以在对 ArrayList 进行并发操作时可能会出现不同步的问题因此 ArrayList 也使用了快速失败机制来保证线程安全。具体来说如果在对 ArrayList 进行迭代操作的同时对其进行增删改操作会导致 ArrayList 的 modCount修改次数和迭代器的 expectedModCount预期的修改次数不一致迭代器会立即抛出 ConcurrentModificationException 异常。以下是一个简单的示例代码用来演示 ArrayList 快速失败机制的工作原理ListInteger list new ArrayList(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); IteratorInteger iterator list.iterator(); while (iterator.hasNext()) {Integer element iterator.next();if (element 2) {list.remove(element);} } 在上面的示例代码中我们在迭代过程中删除了元素 2这会导致 ConcurrentModificationException 异常的抛出。为了避免出现这种情况我们可以使用 Iterator 的 remove() 方法来进行元素的删除或者使用线程安全的集合类例如 CopyOnWriteArrayList。MAP1.Map有哪些实现类Java中的Map接口定义了一个键值对映射的数据结构可以通过给定的键快速查找对应的值。Map接口有很多实现类常见的有以下几种HashMap基于哈希表实现的Map支持null键和null值非线程安全的。LinkedHashMap基于哈希表和双向链表实现的Map可以按照插入顺序或者访问顺序遍历键值对非线程安全的。TreeMap基于红黑树实现的Map键值对按照自然顺序或者自定义顺序排序非线程安全的。ConcurrentHashMap线程安全的HashMap使用分离锁来控制并发访问支持高并发可以通过一定的控制减小锁的竞争。Hashtable早期Java版本中提供的线程安全的哈希表支持null键和null值但是效率较低已经被ConcurrentHashMap取代。PropertiesHashtable的子类用来读取和写入属性文件通常用于读取配置文件。除了以上这些常见的实现类还有一些其他的实现类比如WeakHashMap、IdentityHashMap、EnumMap等不过它们使用的较少一般只在特定场景下使用。2.HashMap的底层实现jdk7jdk8JDK7 的底层实现在 JDK7 中HashMap 是通过数组和链表的结合来实现的。其基本思路是将 key 通过哈希函数映射为数组下标将 value 存储在对应的数组元素中。如果不同的 key 映射到了同一个数组下标就会以链表的形式存储在该数组元素中。HashMap 在 JDK7 中的底层结构主要由两部分组成一个 Entry 数组和一个链表。其中Entry 是 HashMap 的基本单元它包含了 key、value 和指向下一个 Entry 的指针。当使用 put() 方法向 HashMap 中添加元素时会根据 key 的哈希值计算出在数组中的位置然后将 Entry 添加到该位置的链表中。如果两个不同的 key 哈希值相同那么它们会被放到同一个链表中形成一个链表结构。这就是 JDK7 中 HashMap 的基本实现原理。然而这种实现方式有一个严重的问题当链表过长时查询效率会大大降低因为需要遍历整个链表才能找到对应的元素。在极端情况下当所有的元素都映射到了同一个数组下标HashMap 的时间复杂度就会退化到 O(n)这就是所谓的哈希冲突问题。JDK8 的底层实现JDK8 中的 HashMap 对 JDK7 中的实现进行了优化主要是通过引入红黑树来解决链表过长的问题。当链表长度超过一定阈值时默认为 8链表就会转换为红黑树。这样在查询时如果在链表中需要遍历的节点数量超过了阈值就会使用红黑树进行快速查找从而提高了查询的效率。在 JDK8 中HashMap 的底层结构主要由三部分组成一个数组、一个链表和一个红黑树。当使用 put() 方法向 HashMap 中添加元素时如果对应数组下标上已经存在元素就会进行以下操作如果该元素是一个链表就将新元素追加到链表的末尾。如果该元素是一个红黑树就在树中查找 key 对应的节点然后将节点的 value 替换成新的 value。如果树中不存在对应的节点就将新元素添加到树中。如果该元素为 null就直接在该数组的位置插入新的 Entry。在 JDK8 中HashMap 的 get() 方法的实现方式也发生了变化。在查询时先根据 key 的哈希值计算出在数组中的位置然后判断该位置上的元素是否为 null。如果为 null则返回 null如果不为 null则判断该元素是链表还是红黑树。如果是链表则遍历链表寻找对应的元素如果是红黑树则在树中进行查找。JDK8 中 HashMap 的优化主要体现在两个方面引入红黑树解决链表过长的问题提高了查询效率。当链表长度超过一定阈值时将链表转换为红黑树避免了链表过长时查询效率下降的问题。除了对链表和红黑树的优化之外JDK 8 还对哈希函数进行了改进。在 JDK 8 中对于 key 的 hash 值不再采用传统的取模运算%计算哈希桶的索引而是采用了一种新的方式使用 key 的 hash 值高位和低位进行异或运算以此来增加哈希桶的分布性。这种新的方式能够更好地抵抗哈希冲突从而提高了 HashMap 的性能。HashMap 将插入元素时使用的方式从头插法改为了尾插法更好地支持并发操作。在多线程环境下头插法容易导致多线程竞争同一个桶位从而导致链表成环。成环后会导致链表转换成红黑树的操作失败进而影响整个 HashMap 的性能。而尾插法不会导致链表成环因此在多线程环境下更为安全。总的来说JDK8 中 HashMap 的底层实现相比于 JDK7 发生了较大的变化通过引入红黑树和优化哈希算法提高了 HashMap 的性能和稳定性。3.HashSet的底层实现HashSet 是基于 HashMap 实现的底层是一个 HashMap 对象。在 HashSet 中所有元素都是存储在一个 HashMap 的键上而这个键的值则是一个静态的 Object 常量通常是一个 dummy Object。因此HashSet 的实现过程可以简单概括为将所有元素作为 HashMap 的 key 存储而 value 为一个静态的 Object 对象。具体来说HashSet 就是在 HashMap 的基础上去掉了 value只保留了 key。在使用 HashSet 时我们只需要调用 HashMap 的 put() 方法把元素作为 key 插入 HashMap 中value 则使用一个常量对象例如 private static final Object PRESENT new Object()来占位即可。相比于 HashMapHashSet 的实现过程更为简单因为它只需要存储键而不需要存储值。因此HashSet 在大多数情况下比 HashMap 更加高效。同时由于 HashSet 也是基于 HashMap 实现的因此它们的底层实现也非常相似可以复用 HashMap 的很多特性。以下是 HashSet 的部分源码public class HashSetEextends AbstractSetEimplements SetE, Cloneable, java.io.Serializable {// HashSet 底层就是一个 HashMap所有元素作为 key 存储在 HashMap 中private transient HashMapE,Object map;// 常量对象用于占位private static final Object PRESENT new Object();public HashSet() {map new HashMap();}public boolean add(E e) {return map.put(e, PRESENT)null;} } 可以看到在 HashSet 中我们只需要调用 HashMap 的 put() 方法来将元素插入到 HashMap 中。这样做的好处是可以节省很多重复代码而且可以复用 HashMap 的很多特性。同时由于 HashSet 只存储键而不存储值因此在大多数情况下比 HashMap 更加高效。
http://www.hkea.cn/news/14513590/

相关文章:

  • 李沧区城市建设管理局网站wordpress可以做下载站
  • 苏州网站排名优化报价帮别人做网站开票开什么税目
  • 浅析个人网站的设计论文网站优化内容原创
  • 文山网站建设求职简历普通网站成微网站开发
  • 网站开发与软件开发的区别腾讯视频分享到wordpress
  • 网站如何防采集wordpress直排主题
  • 淘宝客网站需要备案吗网站开发合同 附件
  • 知名网站开发哪里有中国建设很行河北省分行合作网站
  • 简单网站开发网络营销推广目标
  • 手机网站建站步骤论文美橙做过网站案例
  • 做网站需要什么备案购物网址
  • 网站开发资金投入网络服务器是什么
  • 茂名建站价格wordpress证书查询
  • 网站空间要备案吗国家高新技术企业认定有什么用
  • 2023年二建报名网站官网登录阿里巴巴网站建设目的
  • 如何查询网站空间腾讯建站模板
  • wamp做的网站外网怎么访问不了天津整站
  • 荥阳网站制作上海有名的公司
  • js源码下载从哪个网站能下载wordpress后台添加底部菜单
  • 网站建设前的功能做电影网站详细教程
  • 网站遭受攻击网站架设工具
  • 如何在电子表格上做网站的连接wordpress文字摘要
  • 珠海网站制作策划wordpress缓存插件
  • 公司网站介绍模板 html王野天是谁
  • 潮品服饰网站建设规划书企业网站设计原则
  • 网站制作价目表游戏网站建设方案书
  • 简述网站制作过程网络营销策划心得体会
  • 厦门建设网站首页编程常用代码大全
  • 厦门网站设计大概多少钱网站小功能
  • 学网站开发要什么基础西安建设工程网站