皮皮网

【引导进群源码】【跑胡子源码c】【js模态窗口源码】listmap源码

2024-11-19 02:38:35 来源:mmall源码

1.HashMap里的containsKey方法和List里的contains方法,哪个效率高
2.HashMap和List遍历方法总结及如何遍历删除
3.List LinkedList HashSet HashMap底层原理剖析

listmap源码

HashMap里的containsKey方法和List里的contains方法,哪个效率高

       hashmap得containskey相比而言比较查询比较高,毕竟hashmap是基于哈希表的,哈希函数不是盖出来的,在对付数据查找的时候效率挺高的。

       list.contains方法其实调用的是indexof(obj)方法,需要遍历整个list,引导进群源码运气差就要遍历所有list.

HashMap和List遍历方法总结及如何遍历删除

       (一)List的遍历方法及如何实现遍历删除

       我们创建一个List并使用不同的方法进行遍历和删除,如下所示:

       1. for循环遍历List:

       ```java

       List list = new ArrayList();

       list.add("zs");

       list.add("ls");

       list.add("ww");

       list.add("dz");

       for(int i=0; i<list.size(); i++){

        if(list.get(i).equals("ls"))

        list.remove(i);

       }

       ```

       这种for循环遍历方式常见,但在删除元素时会出现问题。因为删除元素后,List的大小会改变,索引也会随之改变,导致遍历时可能会漏掉某些元素。所以,这种方法适用于读取元素,但不适合删除元素。

       2. 增强for循环:

       ```java

       for(String x : list){

        if(x.equals("ls"))

        list.remove(x);

       }

       ```

       增强for循环也是常见的遍历方式,但在删除元素时也会出现问题,可能会抛出`ConcurrentModificationException`异常。原因是增强for循环背后实际上是Iterator,在遍历时如果修改了集合的结构(如删除元素),则会触发这个异常。跑胡子源码c

       3. Iterator遍历删除:

       ```java

       Iterator it = list.iterator();

       while(it.hasNext()){

        String x = it.next();

        if(x.equals("del")){

        it.remove();

        }

       }

       ```

       这种方式可以正常遍历和删除元素。与增强for循环不同,这里使用`it.remove()`来直接在Iterator层面删除元素,因此不会出现`ConcurrentModificationException`异常。

       (二)HashMap的遍历删除及如何实现遍历删除

       我们先创建一个HashMap:

       ```java

       private static HashMap map = new HashMap();

       public static void main(String[] args) {

        for(int i = 0; i < ; i++){

        map.put(i, "value" + i);

        }

       }

       ```

       1. 第一种遍历删除:

       ```java

       for(Map.Entry entry : map.entrySet()){

        Integer key = entry.getKey();

        if(key % 2 == 0){

        System.out.println("To delete key " + key);

        map.remove(key);

        System.out.println("The key " + key + " was deleted");

        }

       }

       ```

       这种遍历删除同样会抛出`ConcurrentModificationException`异常。

       2. 第二种遍历删除:

       ```java

       Set keySet = map.keySet();

       for(Integer key : keySet){

        if(key % 2 == 0){

        System.out.println("To delete key " + key);

        keySet.remove(key);

        System.out.println("The key " + key + " was deleted");

        }

       }

       ```

       这种方法同样会抛出异常,原因与List的遍历删除类似。

       3. 第三种遍历删除:

       ```java

       Iterator<Map.Entry> it = map.entrySet().iterator();

       while(it.hasNext()){

        Map.Entry entry = it.next();

        Integer key = entry.getKey();

        if(key % 2 == 0){

        System.out.println("To delete key " + key);

        it.remove();

        System.out.println("The key " + key + " was deleted");

        }

       }

       ```

       这种方法是正确的,因为它使用了Iterator的`remove()`方法来删除元素,避免了并发修改的js模态窗口源码问题。

       综上所述,遍历集合时删除元素应使用Iterator的`remove()`方法,这样可以避免`ConcurrentModificationException`异常。希望大家在遇到类似问题时,能够通过查看源代码找到解决问题的方法。

List LinkedList HashSet HashMap底层原理剖析

       ArrayList底层数据结构采用数组。数组在Java中连续存储,因此查询速度快,时间复杂度为O(1),插入数据时可能会慢,opencv 源码怎么使用特别是需要移动位置时,时间复杂度为O(N),但末尾插入时时间复杂度为O(1)。数组需要固定长度,ArrayList默认长度为,最大长度为Integer.MAX_VALUE。在添加元素时,如果数组长度不足,则会进行扩容。JDK采用复制扩容法,涨幅超过2%源码通过增加数组容量来提升性能。若数组较大且知道所需存储数据量,可设置数组长度,或者指定最小长度。例如,设置最小长度时,扩容长度变为原有容量的1.5倍,从增加到。

       LinkedList底层采用双向列表结构。链表存储为物理独立存储,因此插入操作的时间复杂度为O(1),且无需扩容,也不涉及位置挪移。然而,查询操作的时间复杂度为O(N)。LinkedList的add和remove方法中,add默认添加到列表末尾,无需移动元素,相对更高效。而remove方法默认移除第一个元素,移除指定元素时则需要遍历查找,但与ArrayList相比,无需执行位置挪移。

       HashSet底层基于HashMap。HashMap在Java 1.7版本之前采用数组和链表结构,自1.8版本起,则采用数组、链表与红黑树的组合结构。在Java 1.7之前,链表使用头插法,但在高并发环境下可能会导致链表死循环。从Java 1.8开始,链表采用尾插法。在创建HashSet时,通常会设置一个默认的负载因子(默认值为0.),当数组的使用率达到总长度的%时,会进行数组扩容。HashMap的put方法和get方法的源码流程及详细逻辑可能较为复杂,涉及哈希算法、负载因子、扩容机制等核心概念。