List——知道索引的集合
Set——没有重复元素的集合
Map——成对的键、值得集合
ArrayList
1 概念
ArrayList是可动态增长或缩减的索引序列,相当于动态数组;
是用数组结构实现;
随机访问效率高;
不适合经常作插入或删除操作;
对容量不确定的效率较低,可能经常需要对元素进行复制;
2 使用
2.1 定义ArrayIist对象
ArrayList<String> list1 = new ArrayList<String>();
2.2 添加数据
a 在ArrayList末尾添加数据
list1.add("y");
list1.add("q");
list1.add("a"); // 输出list1是[y, q, a]
b 在下标为N处添加数据
list1.add(1, "t"); // 输出list1是[y, t, q, a]
c 将一个ArrayList中所有数据添加到另一个ArrayList中
ArrayList<String> list2 = new ArrayList<String>();
list2.add("w");
list2.add("c");
list1.addAll(list2); // 输出list1是[y, t, q, a, w, c]
d 将一个ArrayList中所有数据添加到另一个ArrayList中的下标为N处
list1.addAll(2, list2); // 输出list1是[y, t, w, c, q, a, w, c]
2.3 删除数据
a 删除下标为N处的数据
list1.remove(3); // 输出list1是[y, t, w, q, a, w, c]
b 按照指定内容删除第一个匹配的数据
list1.remove("w"); // 输出list1是[y, t, q, a, w, c]
c 按照指定集合删除缩合匹配的数据
前提是list1=[s, y, q, a, t, y, q, a],lsit2=[y, q, a]
list1.removeAll(list2); // 输出list1是[s, t]
d 清空ArrayList
list1.clear(); // 输出list1是[]
2.4 修改数据
a 修改下标为N处的数据
list1.set(1, "y"); // 前提list1=[s, t],执行后list1=[s, q]
2.5 查询数据
a 获取下标为N的数据
String first = list1.get(1); //前提是list1=[s, q],执行后first="q"
2.6 迭代器遍历
ArrayList<String> list = new ArrayList<String>();
list.add("y");
list.add("q");
list.add("a");
list.add("t");
list.add("w");
list.add("c");
// iterator()方法返回Iterator
Iterator<String> it = list.iterator();
// hasNext()方法检查ArrayList中是否有下一个元素
while (it.hasNext()){
// next()方法返回类型为Object,需强制类型转换成String
// 第一次调用next()方法返回ArrayList的下标为0的对象
String str = (String) it.next();
System.out.print(str);
}
2.7 排序
ArrayList没有sort()方法,因此需要借助Collections.sort()方法对ArrayList的中String按照字母进行排序;
LinkedList<String> list = new LinkedList<String>();
list.add("y");
list.add("q");
list.add("a");
list.add("t");
list.add("w");
list.add("c");
// 排序前list=[y,q,a,t,w,c],排序后list=[a,c,q,t,w,y]
Collections.sort(list);
而对于自己定义的类进行排序,无法简单使用上述方法进行排序,否则编译器报错;
方法1——使用Comparable
首先查看sort()方法的帮助文档,一个如下:
public static <T extends Comparable<? super T>> void sort(List<T> list)
其中,Comparable是接口;对于泛型,extends代表“是一个……”,适用于类和接口;”T extends Comparable“可读作“T必须有实现Comparable的类型”
”Lsit<T>“表示仅能继承Comparable的参数化类型的list;
”<? super T>表示Comparable的类型参数必须是T或T的父型“
因此,对于自己编写的类的ArrayList进行排序,必须实现Comparable;
Comparable接口只有一个方法需要实现,返回值为负整数、零、正整数,分别表示当前对象小于、等于、大于指定对象;
public interface Comparable<T>{
int compareTo(T o);
}
接着确定如何比较才能有办法实现Comparable接口,这里按照歌名字母进行排序;
class Song implements Comparable<Song>{
String title;
String artist;
public int compareTo(Song s){
return title.compareTo(s.getTitle());
}
Song(String t, String a, String r, String b){
title = t;
artist = a;
rating = r;
bpm = b;
}
public String getTitle(){
return title;
}
public String getArtist(){
return artist;
}
}
方法2——使用Comparator
还有另一个sort()方法,取用Comparator参数;
sort(List<T> list, Comparator<? super T> c)
Comparator接口只有一个方法需要实现;
public interface Comparator<T>{
int compare(T o1, T o2);
}
sort()方法带有Comparator,不会调用元素的compareTo()方法,而是调用Comparator的compare()方法;
class ArtistCompare implements Comparator<Song>{
public int compare(Song one, Song two){
return one.getArtist().compareTo(two.getArtist());
}
}
ArrayList<Song> songList = new ArrayList<Song>();
ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, artistCompare);
LinkedList
1 概念
LinkedList在任何位置可高效地插入和删除的有序序列;
是用链表结构实现;
随机访问效率低;
适合作插入或删除操作;
2 操作
因为LinkedList是使用链表结构实现的,因此没有get()和set()方法;
HashSet
1 概念
HashSet是没有重复元素的无序集合;
2 使用
3 对象的等价
3.1 引用相等性
堆上同一对象的两个引用;
使用==判断两个引用是否相等;
3.2 对象相等性
堆上的两个不同对象在意义上是相同的;
使用equals()方法判断两个对象在意义上是否相等;
TreeSet
1 概念
没有重复元素的有序集合;
2 使用
要使用TreeSet,以下其中一项必须为真;
2.1 集合中的元素必须是有实现Comparable的类型
2.2 使用重载、取用Comparator参数的构造函数创建TreeSet
HashMap
1 概念
存储键/值关联的数据结构;
2 使用
2.1 常用方法
HashMap<String, double> map = new HashMap<String, double>();
map.put("math", 100);
map.put("english", 97);
System.out.println(map.containsKey("chinese"));
System.out.println(map.containsValue(100));
double scoreMath = map.get("math");
System.out.println(map.size());
map.remove("math");
2.2 遍历
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("twc", 25);
map.put("yq", 28);
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, Integer> entry = (Map.Entry) it.next();
System.out.print(entry.getKey() + " ");
System.out.println(entry.getValue());
}