美文网首页JavaEE
java List,Set,Map,Properties

java List,Set,Map,Properties

作者: 会摄影的程序员 | 来源:发表于2019-01-24 21:34 被阅读1655次

    1. List

    Collection 的子接口

    List接口特点:

    1. 有下标
    2. 有序性
    3. 可重复

    1.1ArrayList 数组列表

    底层采用数组结构——查询块,增删慢

    方法:

    1. 增加
      1. add(T t);//尾部添加
      2. add(int index,T t);//指定位置添加
    2. 删除
      1. remove(Object o);//按值删除
      2. remove(int index);//按位置删除
    3. 修改
      1. set(int index,E e);
    4. 查询
      1. get(int index);
    5. 其他
      1. size();//长度
      2. clear();//清除所有
      3. contains(Object o);//判断这个值是否存在
      4. toArray();//转换为数组
      5. iterator();//实现迭代
      6. isEmpty();//判断为不为空

    1.2LinkedList 链表

    底层采用链表结构——查询慢,增删快
    LinkedList 实际开发过程中对一个集合元素的添加和删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法
    方法:

    1. ArrayList的全部方法
    2. addFirst(E e);//插入到头部
    3. addLast(E e);//插入到尾部
    4. getFirst();//拿第一个
    5. getLate();//拿最后一个
    6. removeFirst();//移除并返回第一个
    7. removeLast();//移除并返回会后一个
    8. pop();// 弹出
    9. push(E e);// 压如

    Vector

    底层采用数组结构——查询块,增删慢

    方法参考api

    2. Set

    Collection 的子接口

    Set接口特点:

    1. 无下标
    2. 无序性(LinkedHashSet和TreeSet除外)
    3. 不重复

    2.1 HashSet 哈希集

    底层采用Hash表 查询比数组还快,增删快

    方法几乎和Collection一样

    2.2 LinkedHashSet 链式

    底层采用 链表+Hash表, 查询快,增删快

    方法几乎和Collection一样

    哈希表结构

    哈希表是采用数组和链表结构

    1. 添加元素判断是否重复

      1. 先判断新旧元素的哈希值
      2. 在判断就元素的equals
    2. 如果两个元素的哈希值一样
      挂载在和整个元素相同的数组上
      如果还出现一个与这个相同的元素出现那么继续挂载

      哈希表结构
    3. 哈希表判断是否重复原理

      1. 如果都不相同 直接添加
      2. 如果Hash相同 则进行equals判断
        如果返回true那么直接覆盖,如果返回false则挂载

    总结:

    1. 只有哈希值相同,并且equals返回为true,才判定重复
    2. 如果想将自定义对象唯一性 那么在改自定义对象重写.hashCode(); 和 .equals();

    2.3 TreeSet 不常用

    哈希表的由来

    是由真正的地址计算的,通过一种散列算法(哈希算法)

    注意点

    字符串的,hashCode() 不是使用的Object的.hashCode(),Sting类重写了.hashCode();

    //jdk 源码:
    public int hashCode() {
        int h = hash;// 未赋值为零
        if (h == 0 && value.length > 0) {//value 为字符串的内容
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    

    两个字符串的哈希值一样,单两个哈希值一样内容可以不一样

    contains方法
    contains 方法在set和List中是不一样的

    1. ArrayList的contains方法
      原理是只比较equals的返回值
      他会和list中每个对比,如果出现在最后一个效率会很低

    2. HashSet的contains方法
      先判断哈希值
      在使用equals方法
      只有元素和判断元的元素 的哈希值相同,并且equals方法为true才判定包含

    3. Map

    3.1 hashMap

    集合初始化时,指定集合初始值大小。 说明:HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
    map 集合不是Collection的子接口,所有没有迭代器
    如果是自定义数据类型,那么就要从写HashSet和equals


    1. T put(K key, V value);
      //如果集合中存在该键,那么将覆盖并返回被覆盖的值

    2. T remover(Object key);

    3. T put(K key, V value);

    4. T get(K key);
    5. 遍历
      1. 键找值
        Set keySet();
             public class MapDemo {
                 public static void main(String[] args){
                     Map<String,String> strMap = new HashMap<>(16);
                     strMap.put("test1","tests1");
                     strMap.put("test2","tests2");
                     strMap.put("test3","tests3");
                     strMap.put("test4","tests4");
             
                     Set<String> keys = strMap.keySet();
                     Iterator<String> iterator =  keys.iterator();
                     while (iterator.hasNext()){
                         String temp = iterator.next();
                         System.out.println(temp+"   "+strMap.get(temp));
                     }
                 }
             }
        
      2. 键值对遍历
        Set entrySet();
      public class MapDemo {
         public static void main(String[] args){
             Map<String,String> strMap = new HashMap<>(16);
             strMap.put("test1","tests1");
             strMap.put("test2","tests2");
             strMap.put("test3","tests3");
             strMap.put("test4","tests4");
      
             Set<Map.Entry<String,String>> entrySet = strMap.entrySet();
             //迭代器
             Iterator<Map.Entry<String,String>> iteSet = entrySet.iterator();
             while (iteSet.hasNext()){
                 Map.Entry<String,String> entry = iteSet.next();
                 System.out.println(entry.getKey()+"====="+entry.getValue());
             }
             //for循环
             for (Map.Entry<String, String> stringStringEntry : entrySet) {
                 System.out.println(stringStringEntry.getValue());
             }
         }
      }
      

    3.2 LinkedHashMap

    4 Properties

    属性集,
    class Properties extends HashTable implements Map
    本质上是一个Map集合

    1. Properties是一个持久的属性集
      它具有自己写数据到文件的方法
    2. Properties是没有泛型的,泛型是固定的<String,String>
    3. Properties 具有Map的全部方法
    4. Properties 特有方法
      1. String getProperty(String key)
        用指定的键在此属性列表中搜索属性的值,和Map的get一样
      2. Object setProperty(String key, String key)
        调用Hash的方法put,添加键值对,
      3. Set<String> stringPropertyNames()
        返回此属性列表中的键集

    demo:

        public static void read() throws IOException {
            Properties ps = new Properties();
            ps.load(new FileReader("name.properties"));
            Set<String> psNames = ps.stringPropertyNames();
            for (String psName : psNames) {
                System.out.println(psName+"  "+ps.getProperty(psName));
            }
        }
    
        public static void write() throws IOException {
            Properties ps = new Properties();
            //创建
            ps.setProperty("zhang shan","12");
            ps.setProperty("li si","13");
            ps.setProperty("wan wu","14");
            //遍历
            Set<String> psNames = ps.stringPropertyNames();
            for (String psName : psNames) {
                System.out.println(psName+"  "+ps.getProperty(psName));
            }
            //持久化
            ps.store(new FileWriter("name.properties"),"");
        }
    

    相关文章

      网友评论

        本文标题:java List,Set,Map,Properties

        本文链接:https://www.haomeiwen.com/subject/nazujqtx.html