初识JAVA--容器

初识JAVA--容器

  • 容器
  • Collection
    • <> 泛型
  • List
    • ArrayList
    • Vector
    • LinkedList
  • Set
    • HashSet
    • TreeSet
  • Map
    • HashMap
    • TreeMap
    • HashTable
    • Properties

容器

  • 可变的存储数据的集合

分类

  • collection
    • set:无序,不可重复
      • HashSet:Hash方式存储
      • TreeSet:二叉树、红黑树方式存储
    • List:有序,可以重复
      • ArrayList:数组
      • Vector:向量
      • LinkedList:链表
  • Map
    • HashMap:哈希Map

主要关注

  • 说明和特点
  • 源码和底层
    • 数据存储方式
    • 底层实现
    • 扩容方式
    • 线程安全
  • 遍历方式
  • 去重和排序方式
  • 声明和调用方式

Collection

  • 说明和特点
    • 是所有集合的父类
    • 可以存储任意类型的元素
    • 必须是引用数据类型
  • 遍历方式
    • for each
    //for each
    for(Object o:col){
    	System.out.println(o);
    }
    
    • 迭代器
    //迭代器
    //1.获取迭代器对象
    Iterator it=col.iterator();  //it用来遍历col容器
    //2.判断是否存在下一个元素boolean hasNext() 如果仍有元素可以迭代,则返回 true。 
    while(it.hasNext()){
    	//3.获取E next() 返回迭代的下一个元素。 
    	System.out.println(it.next());
    }
    
  • 声明和调用方式
    • 声明:多态
      Collection 对象名 = new 子类实现();
      
    • 大小
      • size()
    • 增加
      • add()
    • 删除
      • remove()
    • 清除所有
      • clear()
    • 检查是否存在
      • contains(元素内容)
    • 判断是否为空
      • isEmpty()

<> 泛型

  • 用来规定容器中写入的数据类型
  • 1.5之后可以省略后面的泛型来声明
  • 可以声明为基本数据类型的包装类和引用数据类型
    List<数据类型> 对象名 = new ArrayList<数据类型>();
    

List

  • 说明和特点
    • 有序,可重复
    • 下面的分类中有新增方法,不使用多态声明,直接声明该对象

使用方法

  • 继承自Collections接口
  • .remove()方法,可以匹配索引和内容,如果二者均为int,优先匹配索引
  • 列表迭代器:特殊迭代方法,解决多线程冲突问题
    ListIterator it = 对象名.listIterator();
    

ArrayList

  • 说明和特点
    • 动态数组
    • 查询效率高
    • 增删改效率低
  • 源码和底层
    • 数据存储方式:数组
    • 底层实现:数组
    • 扩容方式:初始长度为10,每次动态扩容时,长度变为原长度的1.5倍
    • 线程安全:线程不安全
  • 声明和遍历方式
    • 使用多态方式声明

      List<String> list=new ArrayList();
      
    • for循环

      for(int i=0;i<list.size();i++){
      			System.out.println(list.get(i));
      		}
      
    • for each

      for(Integer i: list){
      	System.out.println(i);
      }
      
    • 迭代器 iterator

      Iterator<Integer> it=list.iterator();
      while(it.hasNext()){
      	System.out.println(it.next());
      }
      
    • 列表迭代器 ListIterator

      • 可以解决线程不安全的问题
      • 使用方式和iterator相同
      ListIterator<String> ls=list.listIterator();
      while(ls.hasNext()){
      	if("灭霸".equals(ls.next())){
      		ls.add("惊奇队长");
      	}
      }
      
  • 去重和排序方式
    • 有顺序,按索引顺序排序
    • 无去重
  • 调用方式
    • 添加
      • add()
    • 根据指定索引获取
      • get(int index)
    • 移除
      • remove(index 或者 obj)
        • 如果内容和索引有相同情况,以索引为主
        • 需要重新类的equals方法,否则属性相同的对象由于地址不同,会被认为是两个对象

Vector

  • 说明和特点
    • 向量
    • 类似ArrayList
    • 查询和增删改特点与ArrayList一致
    • 线程安全
  • 底层实现
    • 每次动态扩容时,为原长的2倍

LinkedList

  • 说明和特点
    • 双向链表实现
    • 增删改效率高
    • 查询效率低
  • 使用
    • 增加部分链表头尾的操作方法

Set

  • 说明和特点
    • List有序,可重复
    • Set无序,不可重复
  • 使用方式
    • Set接口继承自Collections接口
      • 可以使用Collections接口的常用方法
        • add():增加
        • clear():清除全部
        • contains():查找指定元素
        • isEmpty():判断是否为空
        • iterator():返回迭代器对象
        • remove():移除指定元素
        • size():返回大小、元素个数
    • 是一个抽象接口,故不能实例化
    • 其子类可以通过多态的方式调用
    • 去重方式需要在类中重写equals、hashCode方法等

HashSet

  • 说明和特点
    • 由HashMap维护的Set
    • 首先计算存储对象的HashCode,不同HashCode
    • 再根据对象对应类的equals()方法计算是否有相同的对象,如果equals()方法为false,且hashcode不同,则为不同对象,可以顺利存入
    • 如果想要保留顺序,可以使用LinkedHashSet,
  • 源码和底层
    • 数据存储方式:Key-Value
    • 底层实现:HashMap
    • 扩容方式:?
    • 线程安全:?
  • 遍历方式
    • 迭代器
      Iterator<T> it = hashSet.iterator();
      while (it.hasNext()) {
        T next = iterator.next();
        System.out.println(next);
      }
      
  • 去重和排序方式
    • 通过存储对象对应的类的equals()方法判断二者对象是否相同
      • 故如果相同属性的对象视为同一个对象的话,需要重写类中的equals()方法
    • 通过存储对象对应的类的hashCode()方法计算得到对象的HashCode,再根据HashCode来判断二者是否相同
      • 故如果相同属性的对象视为同一个对象的话,需要重写类中的hashCode()方法
  • 声明和调用方式

TreeSet

  • 说明和特点
    • 会默认排序
      • 使用红黑树排序
      • 相同则无法添加
      • 需要对引用数据类型重写比较器
  • 源码和底层
    • 数据存储方式
    • 底层实现
    • 扩容方式
    • 线程安全
  • 遍历方式
  • 去重和排序方式
  • 声明和调用方式
    • 在需要被存储的类中,实现Comparable接口,在类中重写compareTo方法

Map

  • 键值对的方式存储
  • 键不可重复,值可以重复
  • 遍历方式
    • keyset()
    • values()
    • Set> enterSet()
      //set方式
      Set<String> keys=map.keySet();
      for(String s: keys){
      	System.out.println(s+"-->"+map.get(s));
      }
      
      //value方式
      Collection col=map.values();
      Iterator it=col.iterator();
      while(it.hasNext()){
      	System.out.println(it.next());
      }
      
      //entrySet方式
      Set<Map.Entry<String, Boolean>> set=map.entrySet();
      for(Map.Entry<String, Boolean> entry : set){
      	System.out.println(entry.getKey()+"==>"+entry.getValue());
      }
      

HashMap

  • 根据键的哈希值,排序成的表
  • 存储方式
    • 根据规则计算key的哈希值( a b c )
    • 相同hash值的key-value的value存储在一个hash链中(123–246、12–24)
    • 新的数据会根据已有数据排重,如果不重复则存入对应的hash链中
哈希值 a b c
123 12 1
246 24
  • 注意当key为自定义类型时,需要重写hashCode()方法和equals()方法
  • 控制线程安全的HashMap的方法
    • 使用HashTable
    • 使用Collections接口中的SynchronizedMap
    • 【推荐】使用juc(java.util.concurrent)包下的ConcurrentHashMap,效率高

TreeMap

  • 需要重写外部比较器
  • 也可以在声明对象的构造器中直接使用内部类的方式重写比较器【推荐】

HashTable

  • 线程安全的HashMap

Properties

主要用于写资源文件

你可能感兴趣的:(初识JAVA)