JAVA笔记---集合与泛型

时间:2023-02-26 10:49:45

我们知道变量只能存放一个数据,数组可以存放多个数据,但数据必须是同一类型,而且数组一旦定义,长度将不能再变化,然而在开发过程中,很多时候我们不能确定需要存放多少元素,这时就需要使用集合类。
集合可以存放多个数据,数据可以是不同类型,而且集合大小可以动态增长。

而为什么需要使用泛型呢,因为存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型,而泛型的思想就是先指定好类型,这样集合就只能容纳该类型的元素。

JAVA集合类分为了Map和Collection两个大的类别:
第一个大类是Collection接口类。它定义了所有集合的基本操作,如添加、删除、遍历等。它的子接口Set、List等则提供了更加特殊的功能,可以参考以下Collection接口树体系结构:
JAVA笔记---集合与泛型

第二个大类是Map接口类。与哈希表类似,保存的是键值对的集合,可以通过键来实现对值元素的访问,可以参考以下Map接口树体系结构:
JAVA笔记---集合与泛型

以下总结下三种类型的集合Set,List,Map以及每一种情况下分成的小类:
1.集(Set):集里的对象不按任何特定的方式排列,按索引值来操作数据,不能有重复的元素:
HashSet:底层是哈希表数据结构,根据hashCode和equals方法来确定元素的唯一性;
TreeSet:可以对Set集合中的元素进行排序(自然循序),底层的数据结构是二叉树,也可以自己写个类实现Comparable 或者 Comparator 接口,定义自己的比较器,将其作为参数传递给TreeSet的构造函数。

2.序列(List):序列中的对象以线性方式存储,按索引值来操作数据,可以有重复的元素:
ArrayList:底层的数据结构是数组结构,特点是:查询很快,增删稍微慢点,线程不同步;
LinkedList:底层使用的是链表数据结构,特点是:增删很快,查询慢;
Vector:底层是数组数据结构,线程同步,被ArrayList代替了,现在用的只有他的枚举。

3.映射(Map):映射的每一项为“名称—数值”对,名称不可以重复,值可以重复,一个名称对应一个唯一的值:
HashMap:底层是哈希表数据结构,可以存入null键和null值,线程不同步,效率较高,代替了Hashtable;
TreeMap:底层是二叉树数据结构,线程不同步,可以用于个map集合中的键进行排序。

本文只讨论使用最常见的ArrayList的用法,其余的在使用过程中再记笔记。
ArrayList是一个数组队列,相当于动态数组, 它的容量能动态增长,下面以代码的形式看下ArrayList中常用的方法:

import java.util.ArrayList;
import java.util.Iterator;
public class JavaArrayList {
public static void main(String args[]){
ArrayList alist = new ArrayList();
//添加整数类型数据
alist.add(12);
alist.add(12);
//添加字符类型数据
alist.add("ab");
//添加float类型数据
alist.add(12.34); //结果为1212ab12.34

//indexOf()方法可以返回指定元素所在的位置
int index1 = alist.indexOf("ab"); //返回"ab"所在的第几个位置,这里为3
int index2 = alist.indexOf("abc"); //"abc"在ArrayList中不存在,返回-1

//set()方法用来重新设定某一位置的值,改变第2个元素的值为aa
alist.set(1, "aa"); //结果为12aaab12.34

//Remove方法用于删除一个元素,通过元素本身的引用来删除,比如remove(2)表示删除链表中第三个元素
alist.remove(2); //结果为12aa12.34

//以下介绍两种方式遍历ArrayList
//第一种通过for循环
for (int i = 0; i < alist.size(); i++) {
System.out.println(alist.get(i));
}
//第二种通过迭代器
Iterator itor = alist.iterator();
while (itor.hasNext()) {
System.out.println(itor.next());
}
}
}

下面在介绍下泛型的用法,理解了泛型的概念之后其用户与普通集合用法是相似的,只不过开始的时候需要指定集合允许添加的数据类型。
比如在开始创建ArrayList的时候通过List<String>,直接限定了list集合中只能含有String类型的元素:

ArrayList<String> alist = new ArrayList<String>();
//或者
List<String> alist = new ArrayList<String>();
//这个时候如果再添加不是String类型的数据将会报错
alist.add("abc"); //可以
alist.add(123); //添加整型数据,不可以

当然这只是泛型最简单也是用的最多的一种用法,如果想了解更多用法可以参考下这篇博客:Java泛型入门