Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架包含如下内容:
| 接口| 实现类 |算法
|是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象|是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。|是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。
- ArrayList类
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
以下的程序展示了如何在ArrayList中添加元素,以及如何遍历一个ArrayList,我们分别使用增强for循环、将列表转化为数组、迭代器三种方式来循环输出list的元素值。计算元素数量用.size()方法
import java.util.*;
public class List_learn {
public static void main(String[] args) {
List<String> NameList=new ArrayList<String>();
NameList.add("zxn");
NameList.add("zjp");
NameList.add("lx");
//第一种遍历方式:for-each方式
for(String sn:NameList){
System.out.println(sn);
}
//第二种遍历方式:将list转化为字符串数组
String[] nameString=new String[NameList.size()];
NameList.toArray(nameString);//toArray方法将集合转化为数组
for(int i=0;i<=nameString.length;i++){
System.out.println(nameString[i]);
}
//第三种遍历方式:使用迭代器进行遍历
Iterator<String> ite=NameList.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
其中,使用Iterator迭代器可以不用担心超出列表长度。
访问某个元素用get方法,删除用remove方法。
import java.util.*;
public class List_learn2 {
public static void main(String[] args) {
List<String> NameList=new ArrayList<String>();
NameList.add("zxn");
NameList.add("zjp");
NameList.add("lx");
NameList.remove(1);
//第一种遍历方式:for-each方式
System.out.println(NameList.get(1));
for(String sn:NameList){
System.out.println(sn);
}
}
}
ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。
如果我们要存储其他类型,而 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。
基本类型对应的包装类表如下:
Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class List_learn3 {
public static void main(String[] args) {
List<String> NameList=new ArrayList<String>();
NameList.add("zxn");
NameList.add("zjp");
NameList.add("lx");
Collections.sort(NameList);
//第一种遍历方式:for-each方式
for(String sn:NameList){
System.out.println(sn);
}
}
}
- LinkedList类
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。
以下情况使用ArrayList:
- 频繁访问列表中的某一个元素。
-只需要在列表末尾进行添加和删除元素操作。****
以下情况使用LinkedList:
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作
LinkedList 继承了 AbstractSequentialList 类。
LinkedList 实现了 Queue 接口,可作为队列使用。
LinkedList 实现了 List 接口,可进行列表的相关操作。
LinkedList 实现了 Deque 接口,可作为队列使用。
LinkedList 实现了 Cloneable 接口,可实现克隆。
LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。
如下:
LinkedList 定义方法和增加元素如下:
import java.util.LinkedList;
public class Link_LEARN1 {
public static void main(String[] args) {
LinkedList<String> strlink=new LinkedList<String>();
strlink.add("zxn");
strlink.add("zjp");
strlink.add("lx");
System.out.println(strlink);
}
}
结果如下:
[zxn, zjp, lx]
在列表结尾/开头增加元素:
import java.util.LinkedList;
public class Link_LEARN1 {
public static void main(String[] args) {
LinkedList<String> strlink=new LinkedList<String>();
strlink.add("zxn");
strlink.add("zjp");
strlink.add("lx");
strlink.addFirst("23");
strlink.addLast("45");
System.out.println(strlink);
}
}
结果如下:
[23, zxn, zjp, lx, 45]
在列表开头/结尾移除元素:
strlink.removeFirst();
strlink.removeLast();
获取列表开头/结尾元素:
sites.getLast();
sites.getFirst();
其他的方法请参考:
添加链接描述