Java几个常用的集合
- ArrayList
- TreeSet:以有序状态保持并可防止重复
- HashMap:可用成对的name/value来保存与取出
- LinkedList:针对经常插入或删除中间元素所设计的高效率集合
- HashSet:防止重复的集合,可快速的找寻相符的元素
- LinkedHashMap:类似HashMap,但可以记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序
用Collections.sort()来排序
Collections.sort()会把list中的String依照字母排序
import java.util.*;
import java.io.*;
public class JukeBox {
ArrayList<String> songList = new ArrayList<String>();
public static void main(String[] args) {
new JukeBox().go();
}
public void go() {
getSongs();
System.out.println(songList);
Collections.sort(songList);
System.out.println(songList);
}
public void getSongs() {
try {
File file = new File("SongList.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addSong(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
void addSong(String line) {
String[] tokens = line.split("/");
songList.add(tokens[0]);
}
}
输出:
泛型
几乎所有以泛型写的程序都与处理集合有关,它的主要目的是让集合有类型安全性。能防止把不同类的东西加到集合中。
关于泛型要知道的几个问题
创建被泛型化类(例如ArrayList)的实例。创建ArrayList时你必须要指定它所容许的对象。
new ArrayList<Song>();
声明与指定泛型类型的变量
- 声明(与调用)取用泛型类型的方法
使用泛型的类
ArrayList的说明文件:
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
E部分会用你所声明与创建的真正类型来取代。
运用泛型的方法
使用定义在类声明的类型参数
public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable使用未定义在类声明的类型参数
public void taking(ArrayList list)
这里的参数可以是Animal和他的子类。
自建类使用Collections.sort()
自己创建的类在使用sort()的时候,必须要实现Comparable接口。
要实现多种方式排序,可以用Comparator接口。
靠歌名来排序的Song类
public class Song implements Comparable<Song> {
String title;
String artist;
public int compareTo(Song a) {//负数小于,零相等,正数大于
return title.compareTo(a.getTitle());
}
Song (String t, String a) {
title = t;
artist = a;
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public String toString() {
return title;
}
}
加入歌星排序
import java.util.*;
import java.io.*;
public class JukeBox2 {
ArrayList<Song> songList = new ArrayList<Song>();
public static void main(String[] args) {
new JukeBox2().go();
}
class ArtistCompare implements Comparator<Song> {//创建Comparator
public int compare(Song a, Song b) {//实现比较方法
return a.getArtist().compareTo(b.getArtist());
}
}
public void go() {
getSongs();
System.out.println(songList);
Collections.sort(songList);
System.out.println(songList);
ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, artistCompare );
System.out.println(songList);
}
void getSongs() {
try {
File file = new File("SongList.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addSong(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
void addSong(String line) {
String[] tokens = line.split("/");
Song nextSong = new Song(tokens[0],tokens[1]);
songList.add(nextSong);
}
}
输出:
Collection
三个主要的接口
- List:一种知道索引位置的集合
- Set:注重独一无二的性质
- Map:使用键值对
HashSet
对象相等
- 引用相等性:堆上同一对象的两个引用是相等的。
- 对象相等性:堆上两个不同对象在意义上是相等的。
HashSet如何检查重复
把对象加入HashSet时,HashSet会使用对象的hashcode值来判断对象加入的位置。同时也会与其他已经加入的对象的hashcode做对比,如果hashcode不相同,HashSet会假设对象不相同,如果hashcode相同,就调用equals()来检查hashcode相等的对象是否真的相同。
public class Song implements Comparable<Song> {
String title;
String artist;
public boolean equals(Object aSong) {//相等的判断方法
Song s = (Song) aSong;
return getTitle().equals(s.getTitle());
}
public int hashCode() {//hashCode的判断方法
return title.hashCode();
}
public int compareTo(Song a) {//负数小于,零相等,正数大于
return title.compareTo(a.getTitle());
}
Song (String t, String a) {
title = t;
artist = a;
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public String toString() {
return title;
}
}
import java.util.*;
import java.io.*;
public class JukeBox2 {
ArrayList<Song> songList = new ArrayList<Song>();
public static void main(String[] args) {
new JukeBox2().go();
}
class ArtistCompare implements Comparator<Song> {//创建Comparator
public int compare(Song a, Song b) {//实现比较的方法
return a.getArtist().compareTo(b.getArtist());
}
}
public void go() {
getSongs();
System.out.println(songList);
Collections.sort(songList);
System.out.println(songList);
HashSet<Song> songSet = new HashSet<Song>();
songSet.addAll(songList);//addAll()方法可以把其他集合的元素加进来
System.out.println(songSet);
}
void getSongs() {
try {
File file = new File("SongList.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addSong(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
void addSong(String line) {
String[] tokens = line.split("/");
Song nextSong = new Song(tokens[0],tokens[1]);
songList.add(nextSong);
}
}
输出:
TreeSet
要使用TreeSet,下列其中一项必须为真:
- 集合中的元素必须是实现Comparable的类型。
使用重载、取用Comparator参数的构造函数来创建TreeSet。
import java.util.*;
public class TestTree {
public static void main(String[] args) {
new TestTree().go();
}public void go() { Book b1 = new Book("How Cats Work"); Book b2 = new Book("Remix Your Body"); Book b3 = new Book("Finding Me"); TreeSet<Book> tree1 = new TreeSet<Book>(); tree1.add(b1); tree1.add(b2); tree1.add(b3); System.out.println(tree1); BookCompare bCompare = new BookCompare(); TreeSet<Book> tree2 = new TreeSet<Book>(bCompare); tree2.add(b1); tree2.add(b2); tree2.add(b3); System.out.println(tree2); } public class BookCompare implements Comparator<Book> {//定义到使用的类中 public int compare(Book one, Book two) { return (two.title.compareTo(one.title));//降序排列 } }
}
class Book implements Comparable {
String title;
public Book(String t) {
title = t;
}public int compareTo(Object b) { Book book = (Book) b; return title.compareTo(book.title); } public String toString() { return title; }
}
输出:
Map
import java.util.*;
public class TestMap {
public static void main(String[] args) {
HashMap<String, Integer> scores = new HashMap<String, Integer>();
scores.put("KaKa", 56);
scores.put("Henry", 100);
scores.put("Matic", 61);
System.out.println(scores);
System.out.println(scores.get("Henry"));
}
}
输出: