• Java——集合


    1、ArrayList 、LinkedList 、Vector

    • ArrayList:    底层数组实现;方法不同步,非线程安全;查询快、增删慢
    • LinkedList    底层双向链表实现;方法不同步,非线程安全;查询慢、增删快
    • Vector        底层数组实现;方法同步,线程安全;

      总结:需要线程同步使用Vector,经常查询使用ArrayList,经常插入删除使用LinkedList

       1 import java.util.ArrayList;
       2 import java.util.LinkedList;
       3 import java.util.List;
       4 import java.util.Vector;
       5 
       6 public class ListDemo {
       7 
       8     public static void main(String[] args) {
       9         // ArrayList非线程安全
      10         List<String> list1;
      11         list1 = new ArrayList<String>();
      12         list1.add("a");
      13         list1.add("b");
      14         list1.add("c");
      15         list1.remove(0);
      16         for (int i = 0; i < list1.size(); i++) {
      17             System.out.println(list1.get(i));
      18         }
      19         System.out.println("集合是否为空:" + list1.isEmpty());
      20 
      21         // Vector是线程安全的
      22         List<String> list2;
      23         list2 = new Vector<String>();
      24         list2.add("f");
      25         list2.add("g");
      26         list2.add("h");
      27         list2.remove(0);
      28         for (int i = 0; i < list2.size(); i++) {
      29             System.out.println(list2.get(i));
      30         }
      31         System.out.println("集合是否为空:" + list2.isEmpty());
      32 
      33         // LinkedList 线程不安全
      34         List<String> list3;
      35         list3 = new LinkedList<String>();
      36         list3.add("c");
      37         list3.add("v");
      38         list3.add("b");
      39         list3.remove(0);
      40         for (int i = 0; i < list3.size(); i++) {
      41             System.out.println(list3.get(i));
      42         }
      43         System.out.println("集合是否为空:" + list3.isEmpty());
      44     }
      45 
      46 }

    2、Set 的HashSet和TreeSet

     1 import java.util.HashSet;
     2 import java.util.Set;
     3 import java.util.TreeSet;
     4 
     5 public class SetDemo {
     6 
     7     public static void main(String[] args) {
     8         // HashSet是无序、不重复
     9         Set<String> set1;
    10         set1 = new HashSet<String>();
    11         set1.add("a");
    12         set1.add("b");
    13         set1.add("c");
    14         set1.add("a");// 重复了,不会放进去
    15         System.out.println(set1);
    16         System.out.println(set1.size());
    17 
    18         // TreeSet是有序、不重复
    19         Set<String> set2;
    20         set2 = new TreeSet<String>();
    21         set2.add("a");
    22         set2.add("b");
    23         set2.add("c");
    24         set2.add("a");// 重复了,不会放进去
    25         System.out.println(set2);
    26         System.out.println(set2.size());
    27     }
    28 }

    3、Iterator

    有三个方法:

    hasNext()、next()、remove()

    当对集合进行迭代操作时,不能使用集合的remove()方法

     1 import java.util.ArrayList;
     2 import java.util.Iterator;
     3 import java.util.List;
     4 
     5 public class IteratorDemo {
     6 
     7     public static void main(String[] args) {
     8         List<String> list = new ArrayList<String>();
     9         list.add("a");
    10         list.add("b");
    11         list.add("c");
    12         list.add("d");
    13         list.add("e");
    14 
    15         Iterator<String> iter = list.iterator();
    16         while (iter.hasNext()) {
    17             String str = iter.next();
    18             if ("a".equals(str)) {
    19                 iter.remove();//这里不可以用list.remove()
    20             } else {
    21                 System.out.println(str);
    22             }
    23         }
    24     }
    25 
    26 }

    4、hashcode和equal

    • 如果两个对象的hashcode值不相等——>必定是两个不同的对象

    • 如果两个对象的hashcode值相等,是同一个对象,但是内容可能相同,也不能不同,就还要进行equals()判断,如果为true 表示两个对象相同,如果为false 则表示是两个不同对象

    当使用hashmap时,首先调用加入对象的hashCode方法得到hashCode值,判断已经存在的对象的hashCode值是否与加入对象的HashCode值相等,如果不相等,说明是不同的对象,直接加进去,如果hashcode值相等,再进行equals判断,如果为true ,说明对象已经加进去,就不会在增加新的对象,如果为false 则直接加进去。

    String类已经重写了Object类的hashcode()和equals(),所以两个不同的字符串对象,内容相同,那么hashcode值就相同

    5、Map

     1 import java.util.Collection;
     2 import java.util.HashMap;
     3 import java.util.Iterator;
     4 import java.util.Map;
     5 import java.util.Set;
     6 
     7 public class MapDemo {
     8 
     9     public static void main(String[] args) {
    10         Map<String, String> map = new HashMap<>();
    11         // put()添加
    12         map.put("key1", "value1");
    13         map.put("key2", "value2");
    14         map.put("key3", "value3");
    15 
    16         System.out.println(map.get("key1"));// get()方法取值
    17 
    18         System.out.println("key1是否存在:" + map.containsKey("key1"));
    19         System.out.println("value1是否存在:" + map.containsValue("value1"));
    20 
    21         Set<String> set = map.keySet();// 把key保存在一个set集合中
    22         // 便利set集合
    23         Iterator<String> iter1 = set.iterator();
    24         while (iter1.hasNext()) {
    25             System.out.println(iter1.next());
    26         }
    27 
    28         Collection<String> set2 = map.values();// 把value保存在一个Collection集合中
    29         // 便利set集合
    30         Iterator<String> iter2 = set2.iterator();
    31         while (iter2.hasNext()) {
    32             System.out.println(iter2.next());
    33         }
    34     }
    35 }
    View Code

    6、HashMap、LinkedHashMap、CurrentHashMap

    • HashMap   基于hash算法的Map接口的非同步实现,非线程安全;通过put(key ,value)和get(key)存取对象,put时,对key的hashcode值进行hash计算(可以理解为得到一个index)得到这个元素在数组中的位置,并将元素存储到该位置上,get时,通过对key的hashcode值的hash计算得到在数组中的位置,然后将该位置的元素取出。HashMap是无序的,内部维护的是单链表

    • LinkedHashMap   底层使用哈希表与双向链表保存元素,非线程安全,LinkedHashMap是有序的,有插入顺序和访问顺序,内部维护的是一个双向链表

    • CurrentHashMap   基于双数组和链表的Map接口的同步实现,线程安全

      HashMap是非线程安全的,当只有一个线程使用HashMap时没有问题,如果涉及到多个线程,就不能使用HashMap了,这时可以使用currentHashMap

    7、HashMap和HashTable

      • HashMap    方法是非同步的,非线程安全;基于AbstractMap类,而AbstractMap类是Map接口的实现;key value都可以为null
      • HashTable    方法同步,线程安全,基于Dictionary类,key value都不能为null
  • 相关阅读:
    vue框架-基础5-vue-使用第三方ui组件快速开发页面,vuetify
    vue框架-基础4-vue-使用vue-cli工具
    vue框架-基础3-vue-component组件化开发
    vue框架-基础2-vue生命周期
    vue框架-基础1-vue包引入,指令,模板语言
    python apscheduler的使用研究
    Python中Flask框架SQLALCHEMY_ECHO设置
    通过淘宝镜像下载python3.8.3的安装包
    pycharm 报错Connection to Python debugger failed socket closed
    github fork项目,和删除fork项目
  • 原文地址:https://www.cnblogs.com/gucl/p/8030482.html
Copyright © 2020-2023  润新知