List和Map的学习使用
1.前言
List和Map是Java集合框架中最为常用的,使用场景颇多,相比于数组的最明显优点就是可以对一组数据进行动态的增减。有没有像我一样底子不太好的码友,是不是对于它们的使用始终疑惑头疼着,每一次想使用都是去找网上别人的来对照,然后还是会出错。这一篇文章就是我后面进行探讨学习后的随笔~
2.认识Java集合框架
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
- **接口:**是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。
- **实现类:**是集合接口的具体实现。例如:ArrayList、LinkedList、HashSet、HashMap。
- **算法:**是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。
Java 集合框架主要包括两种类型的容器:一种是集合(Collection),存储一个元素集合;另一种是图(Map),存储键/值对映射。List就是继承Collection容器的接口,而Map本身就是一种容器,这个就是它们两个最本质的不同点,存储结构不同。
**注意:**List是一个允许重复项的有序集合;而Map存储的数据是无序的,Key值不能重复,value值可以重复,key和value是一一对应的。
如果想更清楚了解Java集合框架的知识,可以看一下菜鸟编程这篇文章。
3.ArrayList 和 HashMap
学习List和Map无非就是想学习使用ArrayList和HashMap的使用,它们都是对应接口的一个实现类。
3.1、两者的遍历方式
以foreach为例
遍历 ArrayList
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
//添加元素
list.add("张三");
list.add("李四");
list.add("王五");
silisttes.add("赵六");
for (String name : list) {
System.out.println(name);
}
}
}
遍历HashMap
public class Test {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "张三");
Sites.put(2, "李四");
Sites.put(3, "王五");
Sites.put(4, "赵六");
// 输出 key 和 value
for (Integer i : map.keySet()) {
System.out.println("key: " + i + " value: " + map.get(i));
}
// 返回所有 value 值
for(String value: map.values()) {
System.out.println(value);
}
}
}
3.2、两者的隐藏内在关系
HashMap存储的键值对里面的值也可以为一个集合,即可以把ArrayList嵌套在HashMap泛型里面(Map<Integer, List>)。用途在哪里呢?例如用于集合分类、遍历一个数据量特别大的List集合时,运行会特别的慢,就可以使用Map把List里面的元素分类,把带有相同标志的元素存储在同一个键key下,这样遍历起来速度就会快好几倍(非常好用的一个解决运行速度慢的办法)。
下面举一个从csv文件里面读取到数据,然后进行分类的一个例子:
List<CSVRecord> records = parser.getRecords();//这个就是从csv文件里面读取数据,返回一个CSVRecord类型结果集records
Map<String,List<CSVRecord>> map = new HashMap<String, List<CSVRecord>>();
for (CSVRecord record : records) {//遍历结果集records,里面的一个元素就是一个Object对象(即对应一条数据)
String account = record.get(1);//从Object中获取一个元素作为要分类的键key
if (!map.containsKey(account)) {//map容器里面没有这个键key,所以就添加进去
List<CSVRecord> list = new ArrayList<CSVRecord>();
map.put(account, list);
}
map.get(account).add(record);//这个是往对应键里面增加元素
}
3.3、参数问题
集合方法都是泛型方法,即带有尖括号“<>”,所以里面的参数必须是引用类型参数,不可以是基本类型参数(像int、double、char这种)。
引用类型和基本类型的区别
-
基本类型的变量保存原始值,即它代表的值就是数值本身;
-
引用类型的变量保存引用值,"引用值"指向内存空间的地址, 对象本身存放在这个引用值所表示的地址的位置。
八大基本类型对应的引用类型如下表:
基本类型 | 引用类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
!String的引用类型为本身
关于这个两者的区别知识,如果想理解得更深的话,就可以往C语言里面的引用传递和值传递探讨学习一下(java就是借鉴了C语言的这个知识的)。