Java集合

集合

  • 集合:用来存放一组数据的数据结构

  • 数组的缺点

    1. 长度固定
    2. 执行一些数据操作时,比较繁琐,如:插入数据,删除前面的数据
    
  • 集合提供方便的数据操作方法

<> 泛型
	限制集合中存放的数据类型
	不支持基本类型,要使用包装类型
例如:List<Object> list = new List<>;

集合继承结构

集合有很多接口:

Collection 接口
	|- List 接口
		|- ArrayList
		|- LinkedList
	|- Set 接口
		|- HashSet
		|- TreeSet
Map 接口
	|- HashMap
	|- TreeMap
Iterator 接口
Collections 工具类
LinkedList
LinkedList<O> list = new LinkedList<>();
O指定存放数据类型

特点

  • 双向链表
  • 相邻节点相互引用
  • 首尾节点相互引用
  • 两端效率高
    方法
  • add(data); 在末尾添加数据
  • get(index); 获取指定位置数据
    双向链表效率低,每次访问下标都从头开始
  • remove(index); 移除指定位置数据
  • remove(data); 移除第一个相等数据
  • size(); 数据数量
  • addFirst();
  • addLast();
  • getFirst();
  • getLast();
  • removeFirst();
  • removeLast();
Interator
Interator iter = list.interator();
  • interator(); 辅助创建迭代器对象,来对当前集合进行遍历,效率高
  • 使用集合的 iterator() 方法创建的迭代器对象,都是接口的子类型对象
  • 在使用迭代器遍历时,不能使用集合的方法来移除数据(list.remove()),只能用迭代器自己的方法来移除数据(iter.remove());
  • 方法:
    • iter.next();访问数据
    • iter.hasNext();判断是否还有下一个数据
    • iter.remove();移除数据
ArrayList
ArrayList<O> list = new ArrayList<>();
O指定存放数据类型

**特点: **

  • ArrayList 内部封装一个数组
  • 用数组存放数据
  • 默认初始容量是 10
  • 放满后,会新建1.5 倍长度的新数组
  • 访问任意位置效率高
  • 增删数据,效率可能低
    **创建对象: **
  • new ArrayList();默认长度为10
  • new ArrayList(number);手动设置内部数组容量
    **方法: **
  • add(data); 在末尾添加数据
  • get(index); 获取指定位置数据
  • remove(index); 移除指定位置数据
  • remove(data); 移除第一个相等数据
  • size(); 数据数量
  • 没有两端操作数据的方法
HashMap
HashMap<K,V> map = new HashMap<>();
M指定键的类型,V指定值的类型

特点:

  • 哈希表,散列表
  • 存放键值对数据
  • 作用:用键,快速查找数据
  • 键:不重复,无序

方法:

  • put(key,value); 设置键值对,设置已有的键值时会覆盖原来的值
  • get(key); 获取键对应的值,键不存在返回null
  • size();数据数量
  • remove(key);移除该键,返回移除键的值
  • keySet();获得所有的键,创建成一个Set类型集合
哈希算法

哈希模型:

  • 有若干哈希桶,每个桶有一个哈希值
  • 放入的数据,先获得数据的哈希值,放入对应的哈希桶
  • 相同哈希值的数据,会被放入同一个哈希桶
HashMap 内部算法

用数组存放数据,初始长度16

存放数据的过程:

  • 先获得键的哈希值,key.hashCode();
  • 用哈希值来计算一个下标值 index
  • 将键和值,封装成一个 Entry 对象
  • Entry 对象,放入index位置
    • 空位置,直接放入
    • 有数据,依次用 equals()比较键是否相等
      • 找到相等的,覆盖值
      • 没有相等的,链表连在一起
    • 负载率、加载因子到0.75
      • 新建容量翻倍的新数组
      • 所有数据,重新哈希,放入数组
    • jdk1.8
      • 链表产长度到8,转成红黑树,
      • 红黑树数据数量减少到6,转回成链表
hashCode()
  • 从Object继承的方法

  • Object中默认实现是使用内存地址值,作为哈希值

  • 可以在子类中,重写这个方法,用对象的属性数据,来计算哈希值

    HashSet
Set 接口
	  | - HashSet
  • 内部使用 HashMap 的键,存放数据
  • 不重复
  • 无序
  • 方法
    • add(数据);
    • remove(数据);
    • size();
    • iterator();
Collections 工具类

以下几个方法都不支持HashMap,只支持List

  • Collections.addAll(集合,值1,值2,值3···); 对集合一次性添加多个数据
  • sort(List); 对集合进行排序
  • sort(List,比较器);
  • binarySearch(List,目标值); 对集合数据进行二分法查找(集合必须有序)
  • binarySearch(List,目标值,比较强);
  • swap(List,i,j); 对集合进行数据交换
比较器
new Comparator<Integer>(){
重写比较器的方法
}
for - each 循环格式
  • for - each 循环,是对数组遍历访问、集合迭代遍历访问的语法简化
  • 数组迭代:
    for(int i=0;i<array.length;i++){
    	String s = array[i];
    	//处理s
    	System.out.println(s);
    }
    //for - each 语法简化
    for(String s : array){
    	//处理s
    	System.out.println(s);
    }
    
  • 集合迭代
    for(Iterator<String> it = list.iterator(); it.hasNext();){
    	String s = it.next();
    	//处理s
    }
    //for - each简化语法
    for(String s : list){
    	//处理s
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值