Java集合与泛型

14 篇文章 0 订阅
4 篇文章 0 订阅

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]);
    }

}

输出:

SongList

泛型

几乎所有以泛型写的程序都与处理集合有关,它的主要目的是让集合有类型安全性。能防止把不同类的东西加到集合中。

关于泛型要知道的几个问题

  1. 创建被泛型化类(例如ArrayList)的实例。创建ArrayList时你必须要指定它所容许的对象。

    new ArrayList<Song>();
    
  2. 声明与指定泛型类型的变量

  3. 声明(与调用)取用泛型类型的方法

使用泛型的类

ArrayList的说明文件:

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable  

E部分会用你所声明与创建的真正类型来取代。

运用泛型的方法

  1. 使用定义在类声明的类型参数

    public class ArrayList
    extends AbstractList
    implements List, RandomAccess, Cloneable, Serializable

  2. 使用未定义在类声明的类型参数

    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);
    }

}   

输出:

artist

Collection

三个主要的接口

  • List:一种知道索引位置的集合
  • Set:注重独一无二的性质
  • Map:使用键值对

collection

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);
    }

}

输出:

hashCode


规则

TreeSet

要使用TreeSet,下列其中一项必须为真:

  1. 集合中的元素必须是实现Comparable的类型。
  2. 使用重载、取用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;
    }
    

    }


输出:

treeset

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"));
    }
}

输出:

map

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值