HeadFirstJava——14_数据结构

来源:互联网 发布:淘宝里的微淘是什么 编辑:程序博客网 时间:2024/06/05 11:39

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()方法返回IteratorIterator<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());}


0 0