JavaEE

java List,Set,Map,Properties

2019-01-24  本文已影响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"),"");
    }
上一篇下一篇

猜你喜欢

热点阅读