集合与数组区别:
1、集合长度是可变的,当存储的长度超过集合长度的时候,集合会自动扩容,数组长度不可变
2、集合不能存储基本数据类型,如果想要存储基本数据类型则需要使用基本数据类型的包装类,数组可以存储基本数据类型
单列集合:collection 双列集合:map
list可重复 set不可重复
个人理解:可以重复意味着集合存储的时候不是根据存入的数值作为位置进行存放的,是按照顺序存放的 所以arraylist 按照下标,linkedList 按照链表
不可重复意味着存储位置是根据存入的值来判断的 值如果相同则存放在相同位置,替换之前的值
所以hashset 按照hash值存储 treeSet 二叉树存储,hashMap ,treeMap 同理
迭代器:Iterator 遍历使用
先看集合普通遍历删除遇到的问题
public static void main(String[] args) {
List<String> collection = new ArrayList<>();
collection.add("1");
collection.add("2");
collection.add("2");
collection.add("2");
for (int i = 0 ; i < collection.size() ; i ++){
if("2".equals(collection.get(i))){
collection.remove(i);
}
}
System.out.println(collection);
}
结果为[1, 2] 出现这个问题的原因是当使用数组删除某个元素后该元素后面的元素会角标会-1 如果是在循环中删除 会导致被删除的元素后面的一个元素被忽略 ,解决这个问题的方法是在符合条件删除后 循环脚本i -1,或者使用迭代器删除,迭代器删除的原理跟循环后-1 是类似的
迭代器的方法:hasNext() next() remove()
增强for循环:只有实现Iterable 才可以使用增强for循环,Iterator
List 集合:本质 是一个数组
数据结构:栈 队列 数组 链表
栈:先进后出
队列:先进先出
数组:查询速度快增删慢
链表:增删快 查询慢
linkedList 底层是一个双向链表
泛型:规范数据转换问题,避免强转,将运行时期的问题转移到编译时期
泛型可以在 类 方法 接口中使用
通配符 可以标志一个范围 如 ? extends Number ?标识 使用Number 或者其子类
? super Number ?标识使用Number的父类
set集合:不可以重复,hashSet treeSet
特点:去重、存取顺序不一致,没有索引方法,不能使用for循环遍历
HashSet :本质是一个HashMap
TreeSet: 想要使用treeSet 需要指定排序规则
compareTo 返回负数 则存入的值为较小的值 放在左边,如果返回为0 则标识重复了不需要存储,返回正数则放在右边
TreeSet 两种比较器 对比:1、存储对象实现Comparable接口(自然排序)
2、创建Comparator 实现类 ,在创建treeSet的时候调用带有比较器实现类的treeSet构造器创建treeSet
在使用过程中 优先使用使用第一种,第一种不能使用再使用第二中使用方式
二叉树:
二叉查找树,二叉排序树、二叉搜索树:1、每个节点最多有两个子节点
2、每个节点的左子节点 都是小于自己的
3、每个节点的右子节点都是大于自己的
红黑树:特点:
1、每个节点是红色或者黑色
2、根节点是黑色的
3、每个叶子节点是黑色
4、如果一个节点是红色的,则他的子节点为黑色的
5、从任意节点到叶子节点所包含的黑色节点树相同
6、最长路径长度超过最短路径长度2倍
HashSet:hash值,如果没有重写hashcode的方法,默认使用Object的hashcode方法,根据对象的地址计算出的哈希值
如果重写的hashcode方法,一般通过对象属性计算出来的哈希值,如果不同对象属性一样的那么计算出来的哈希值也是一样的
map循环2中方式:
1、通过先获取key set 然后根据keyset 获取value
2、通过Set<Map.Entry<String,Object>> set = map.entrySet(); 获取到Entry对象 然后 通过entry对象获取key value