今天学的挺简单的,重点是 ArrayList和HashSet
时间: 2022/4/14
Collection接口
集合的作用:
是一种容器,可以用来存储引用的数据
特点:
集合的长度可以在创建后随意改变,可以增加和删除
集合体系:
Collection的常用方法:
方法 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object e) | 根据元素删除,如果有多个相同只删除第一个 |
boolean contains(Object obj) | 判断是否包含某个元素 |
int size() | 获取集合元素个数 |
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("小罗");
coll.add("哦哦");
System.out.println(coll);
coll.remove("小罗");
System.out.println(coll);
boolean b = coll.contains("哦哦");
System.out.println(b);
int size = coll.size();
System.out.println(size);
}
结果:
Iterator迭代器
作用:
迭代器是帮我们对集合进行遍历的。没有get()方法的集合就需要用迭代器来遍历
常用方法:
方法 | 说明 |
---|---|
E next() | 获取一个元素,让指针向下移动 |
boolean hasNext() | 判断还有没有元素 |
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("小罗");
coll.add("哦哦");
System.out.println(coll);
//迭代器
Iterator<String> iterator = coll.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
并发修改异常(ConcurrentModificationException):
在迭代器遍历集合的时候,如果修改了集合的长度(用集合对象添加元素或删除元素)就会出现并发修改异常。
解决方式:
如果要在迭代器遍历的时候添加,现在无法解决。
如果要在迭代器遍历的时候删除,迭代器自己有删除方法。
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("小罗");
coll.add("哦哦");
System.out.println(coll);
//迭代器
Iterator<String> iterator = coll.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
//删除操作
if (next.equals("小罗")){
iterator.remove();
}
}
}
增强for循环
增强for是一种更简单的遍历方式,可以遍历集合或数组
格式:
格式:
for(元素类型 元素名 : 集合/数组){
}
原理:
增强for底层其实用到了迭代器,原理里面是有迭代器,所以他也会出现并发修改异常。
增强for和迭代器的区别:
在没有删除元素的需求时,一定是用增强for要比迭代器简单。
如果有删除元素的需求时,增强for做不到,只能使用迭代器。
List接口及子类
特点:
有索引 元素可重复 元素存取有序
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("大傻");
list.add("二傻");
list.add("三傻");
System.out.println(list);
//结果为:
//[大傻, 二傻, 三傻]
list常用方法:
方法 | 说明 |
---|---|
void add(int index, E element) | 给指定索引位置添加元素 |
E get(int index) | 获取指定索引处的元素 |
E remove(int index) | 删除指定索引处的元素 |
E set(int index, E element) | 修改指定索引处的元素 |
//接上面内容
String s1 = list.get(2);
System.out.println(s1);
list.add(1,"三傻");
System.out.println();
System.out.println(list);
list.remove("三傻");
System.out.println(list);
System.out.println();
//返回的是要删除的内容
String remove = list.remove(0);
System.out.println(list);
System.out.println(remove);
System.out.println();
//返回的是修改前的内容
String set = list.set(0, "大傻");
System.out.println(list);
System.out.println(set);
System.out.println();
ArrayList集合
底层是由数组实现的一种集合
特点:
增删慢(在非末尾的地方增删慢)
查询快
LinkedList集合
底层是由双向链表实现的一种集合
特点:
增删快
查询慢
Set接口及子类
HashSet集合有什么特点
元素没有索引 元素不能重复
元素存取无序
HashSet集合底层是哈希表
public static void main(String[] args) {
//元素没有索引 元素不能重复 元素存取无序
//存取无序指的是存的顺序和获取看到的顺序不一致
//但人家自己有一个排列的方式,不是随机的
//创建HashSet
HashSet<String> set = new HashSet<>();
//添加元素
set.add("夏洛");
set.add("秋雅");
set.add("马冬梅");
set.add("马冬梅");
System.out.println(set); //[秋雅, 夏洛, 马冬梅]
}
对象的哈希值:
如果哈希值不同,那么两个对象一定内容不同
如果哈希值相同,那么两个对象内容不一定相同
public static void main(String[] args) {
//每个对象都有哈希值,哈希值有什么特点?
//如果哈希值不同,那么两个对象一定内容不同
//如果哈希值相同,那么两个对象内容不一定相同
//字符串对象举例
int hash1 = "abc".hashCode();//96354
System.out.println(hash1);
int hash2 = "ab".hashCode();
System.out.println(hash2); //3105
int hash3 = "Aa".hashCode();
System.out.println(hash3); //2112
int hash4 = "BB".hashCode();
System.out.println(hash4); //2112
/*
哈希值计算:
int hash = 0;
循环:
hash = 31*hash + 字符值
"abc"
hash = 31*hash + 97
hash = 31*hash + 98
hash = 31*hash + 99
*/
}
HashSet如何保证的元素不重复:
HashSet判断对象是否重复使用了两个方法:
hashCode() 和 equals()
LinkedHashSet集合:
特点:
元素没有索引,元素不能重复,元素存取有序
总结
今天最重要的都在这个图里!!!!