Java 学习记录 第十五天
由于本渣渣是前端转行Java,所以编辑器的选择就直接用 webstorm 同公司的 idea
接下来的知识梳理有一部分会借鉴大佬 廖雪峰的博客
学习目标
掌握常用实现类的使用、Iterator迭代器的使用
学习内容
- ArrayList 的常用操作方法
- LinkedList 、ArrayList、HashSet 的区别
- HashMap 的使用
- 迭代器(Iterator)
ArrayList 的常用操作方法
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
import java.util.ArrayList;
import java.util.Collections;
public class Test1 {
public static void forEachTest(ArrayList<String> list) {
System.out.println("\n遍历的第一种方式 for循环:");
for (int i = 0; i < list.size(); i++) {
System.out.println("第 " + (i + 1) + " 个元素:" + list.get(i));
}
System.out.println("\n遍历的第二种方式 增强for循环:");
for (String item : list) {
System.out.println("第 " + (list.indexOf(item) + 1) + " 个元素:" + item);
}
System.out.println("\n遍历操作的第三种方式 forEach() 方法:");
list.forEach((item) -> {
System.out.println("选择英雄:" + item);
});
}
public static void main(String[] args) {
ArrayList<String> heroList = new ArrayList<String>();
heroList.add("后羿");
heroList.add("鲁班");
heroList.add("鲁班");
heroList.add("孙尚香");
System.out.println("所有添加的元素:" + heroList);
System.out.println("所有添加的元素数量:" + heroList.size());
System.out.println("指定访问第二个元素:" + heroList.get(1));
heroList.set(2, "狄仁杰");
System.out.println("\n修改之后得到的数据:" + heroList);
heroList.remove(0);
System.out.println("\n删除之后得到的数据:" + heroList);
Collections.sort(heroList);
System.out.println("\n排序后的数据:" + heroList);
forEachTest(heroList);
}
}
要注意的是声明 ArrayList 的时候,泛型 的 数据类型 只能是 引用数据类型,也就是说需要使用到 基本类型 的 包装类,上述代码的输出结果如下:
LinkedList 、ArrayList、HashSet 的区别
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。
以下情况使用 LinkedList :
- 开发时需要通过循环迭代来访问列表中的某些元素的时候。
- 开发时需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作的时候。
以下情况使用 ArrayList :
- 开发时需要频繁访问列表中的某一个元素的时候。
- 开发时只需要在列表末尾进行添加和删除元素操作的时候。
以下情况使用 HashSet :
- 开发时需要对数据进行去重时。
- 开发时处理的数据有可能存在 null 值的时候。
LinkedList 继承了哪些 类 、实现了哪些 接口:
- 继承了 AbstractSequentialList 类。
- 实现了 Queue 接口,可作为队列使用。
- 实现了 List 接口,可进行列表的相关操作。
- 实现了 Deque 接口,可作为队列使用。
- 实现了 Cloneable 接口,可实现克隆。
- 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。
import java.util.LinkedList;
public class Test2 {
public static void main(String[] args) {
LinkedList<String> heroList = new LinkedList<String>();
heroList.add("后羿");
heroList.add("鲁班");
heroList.add("后羿");
heroList.addFirst("伽罗天下第一!!!");
heroList.addLast("百里守约万年吊车尾 !!!");
System.out.println("注意头尾的数据:" + heroList);
System.out.println("获取头部的数据:" + heroList.getFirst());
System.out.println("获取尾部的数据:" + heroList.getLast());
heroList.removeFirst();
heroList.removeLast();
System.out.println("删除头尾后的数据:" + heroList);
}
}
上述代码的输出结果如下:
HashMap 的使用
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
HashMap 是无序的,即不会记录插入的顺序。
HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。
HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。
import java.util.HashMap;
public class Test3 {
public static void main(String[] args) {
HashMap<String, String> heroMap = new HashMap<String, String>();
heroMap.put("hy", "后羿");
heroMap.put("lb", "鲁班");
heroMap.put("ssx", "孙尚香");
// 复制一份 map
HashMap<String, String> cloneHeroMap = (HashMap<String, String>) heroMap.clone();
System.out.println("输出原始 map :" + heroMap);
System.out.println("输出复制 map :" + cloneHeroMap);
System.out.println("输出原始 map 的键值对数量:" + heroMap.size());
cloneHeroMap.clear();
System.out.println("\n清除复制map的数据:" + cloneHeroMap);
System.out.println("\n遍历键值对:");
for (String key : heroMap.keySet()) {
System.out.println("键为:" + key + ",值为:" + heroMap.get(key));
}
System.out.println("\n遍历所有值:");
for (String value : heroMap.values()) {
System.out.print(value + "、");
}
}
}
简单演示下 HashMap 的一些常用方法,全部 API 查询,输出结果如下:
迭代器(Iterator)
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
迭代器 it 的基本操作是 next 、hasNext 和 remove
- 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
- 调用 it.hasNext() 用于检测集合中是否还有元素。
- 调用 it.remove() 将迭代器返回的元素删除。
import java.util.HashSet;
import java.util.Iterator;
public class Test4 {
public static void main(String[] args) {
HashSet<String> heroSet = new HashSet<String>();
heroSet.add("后羿");
heroSet.add("鲁班");
heroSet.add("后羿");
heroSet.add("孙尚香");
System.out.println("输出 set:" + heroSet);
Iterator<String> itHero1 = heroSet.iterator();
Iterator<String> itHero2 = heroSet.iterator();
Iterator<String> itHero3 = heroSet.iterator();
System.out.println("\n使用 itHero1 迭代器获取第一个元素:" + itHero1.next());
System.out.println("\n使用 itHero2 迭代器遍历元素:");
while (itHero2.hasNext()) {
System.out.println(itHero2.next());
}
while (itHero3.hasNext()) {
String hero = itHero3.next();
if (hero.equals("后羿")) {
itHero3.remove();
}
}
System.out.println("\n输出 itHero3 迭代器删除操作后的 set:" + heroSet);
}
}
简单演示下迭代器的一些基本操作,输出如下:
自学不易,点赞鼓励。
谢谢各位看官,如果有哪里写错的还望指出来哈,共同进步。