java系列16:集合

一、集合

1、什么是集合?

集合是将多个元素组成一个单元的对象。
是一种操作批量数据的工具。

为了满足不同场合的需要,java.util包中包含有一系列集合类;
如:ArrayList类、LinkedList类、Vector类、HashMap类等等。

集合类中只能存放对象,而不能存放原始数据类型的元素,所以当有原始数据类型需要存放时,只能将其转换成相应的包装类对象。

Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了。

java系列16:集合_第1张图片
Java集合框架的内容

任何对象加入集合类后,自动转变为Object类型;取出时,需要进行强制类型转换,恢复为特定的类型。

java系列16:集合_第2张图片
使用集合框架的注意事项

2、集合与数组的区别

数组:

  • 长度是固定的(一经创建,就不可再改变)
  • 只能存放相同数据类型的元素
  • 数组本身提供相应的工具操作数据

集合:

  • 集合的长度没有限制,可以存放任意多的元素
  • 元素的数据类型也可以不同
  • 集合还提供一系列操纵数据的方法,如存储、检索等等;可以使用工具Collections自由操作集合中数据

二、ArrayList

ArrayList是长度可变的对象引用数组,称为动态数组。
随着元素的添加,元素数目的增大,数组容量也会随之自动扩展。

java系列16:集合_第3张图片
ArrayList

访问和遍历数组元素时,ArrayList的性能优越。

ArrayList类继承了AbstractList类并实现了List接口。

java系列16:集合_第4张图片
3种构造方法
java系列16:集合_第5张图片
常用方法

例1:

package test;

import java.util.ArrayList;
import java.util.List;

public class TestArrayList {
    public static void main(String[] args) {
        List l = new ArrayList();
        l.add(12); //int
        l.add(3.56f); //float
        l.add(4.13636215d); //double
        l.add("abc"); //String

        System.out.println("集合大小:"+l.size());

        Object o = l.get(1);
        String a = o.toString();
        System.out.println("编号为1的数据:"+a);

        l.remove(2);
        l.add("cde"); //String
        //显示删除编号为2的数据后,集合中余下的所有内容。
        for (int i = 0; i < l.size(); i++) {
            Object o1 = l.get(i);
            System.out.println("所有数据:"+o1.toString());
        }

        System.out.println("判断集合中数据是否为空:"+l.isEmpty());

        System.out.println("判断集合中指定数据 12 是否存在:"+l.contains(12));
        if(l.indexOf(12) < 0) {
            System.out.println("12在集合中不存在");
        } else {
            System.out.println("12在集合中存在,索引为:" + l.indexOf(12));
        }
    }
}
java系列16:集合_第6张图片
运行结果

例2:

package test;

import java.util.ArrayList;

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList al = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Integer num = new Integer(i);
            al.add(num);
        }
        System.out.println("数组中的元素:");
        for (int i = 0; i < al.size(); i++) {
            // System.out.println(al.get(i));
            Integer temp = (Integer) al.get(i);
            System.out.println(temp);
        }
    
        System.out.println("********************");
        al.clear();
        System.out.println("数组被清空后的情况:");
        System.out.println("数组长度:"+al.size());
        if(al.isEmpty()) {
            System.out.println("数组现在为空");
        } else {
            System.out.println("数组现在不为空");
        }
    }
}
java系列16:集合_第7张图片
运行结果

例3:

开发一套小型的新闻管理系统,要求如下:
1、可以存储各类新闻标题(包含ID、名称、创建者、创建时间)
2、可以获取新闻标题的总数
3、可以逐条打印每条新闻标题的名称

java系列16:集合_第8张图片
解题思路
// NewsTitle.java
package test;

import java.util.Date;

public class NewsTitle {
    private int id; // 新闻id
    private String titleName; // 新闻名称
    private String creater; // 新闻创建者
    private Date createTime; // 创建时间
    public NewsTitle(int id, String titleName, String creater, Date createTime) {
        super();
        this.id = id;
        this.titleName = titleName;
        this.creater = creater;
        this.createTime = createTime;
    }
    public String getTitleName() {
        return titleName;
    }
    public void setTitleName(String titleName) {
        this.titleName = titleName;
    }
}

// TestNewsTitle.java
package test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TestNewsTitle {
    public static void main(String[] args) {
        NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
        NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
    
        List newsTitleList = new ArrayList();
        newsTitleList.add(car);
        newsTitleList.add(people);
        System.out.println("新闻数目:" + newsTitleList.size());
        print(newsTitleList);
    }

    private static void print(List newsTitleList) {
        for (int i = 0; i < newsTitleList.size(); i++) {
            NewsTitle newsTitle = (NewsTitle) newsTitleList.get(i);
            System.out.println((i+1) + ":" + newsTitle.getTitleName());
        }
    }
}
java系列16:集合_第9张图片
运行结果

三、LinkedList

1、LinkedList类继承了AbstractSequentialList类,并实现了List接口
2、LinkedList 类用于创建链表数据结构
3、插入或者删除元素时,它提供更好的性能。与ArrayList相比,如果需要频繁地添加和删除元素,LinkedList的性能更加优越。
4、链表中元素的数量不受任何限制,可以随意地添加和删除。

java系列16:集合_第10张图片
构造方法
java系列16:集合_第11张图片
常用方法1
java系列16:集合_第12张图片
常用方法2

例1:

升级这套小型的新闻管理系统,要求如下:
1、可以添加头条新闻标题
2、可以删除末条新闻标题

java系列16:集合_第13张图片
分析思路
// NewsTitle.java
package test;

import java.util.Date;

public class NewsTitle {
    private int id; // 新闻id
    private String titleName; // 新闻名称
    private String creater; // 新闻创建者
    private Date createTime; // 创建时间
    public NewsTitle(int id, String titleName, String creater, Date createTime) {
        super();
        this.id = id;
        this.titleName = titleName;
        this.creater = creater;
        this.createTime = createTime;
    }
    public String getTitleName() {
        return titleName;
    }
    public void setTitleName(String titleName) {
        this.titleName = titleName;
    }
}

// TestNewsTitle.java
package test;

import java.util.Date;
import java.util.LinkedList;

public class TestNewsTitle {
    public static void main(String[] args) {
        NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
        NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
    
        // List newsTitleList = new LinkedList(); 这样写,无法调用LinkedList的方法
        LinkedList newsTitleList = new LinkedList();
        newsTitleList.addFirst(car);
        newsTitleList.addLast(people);

        NewsTitle firstNews = (NewsTitle) newsTitleList.getFirst();
        System.out.println("头条新闻标题是:" + firstNews.getTitleName());
        NewsTitle lastNews = (NewsTitle) newsTitleList.getLast();
        System.out.println("末条新闻标题是:" + lastNews.getTitleName());
    
        newsTitleList.removeFirst();
        newsTitleList.removeLast();
    }
}
java系列16:集合_第14张图片
运行结果

例2:

package test;

import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();
        for (int i = 0; i < 10; i++) {
            Double temp = new Double(Math.sqrt(i));
            ll.add(temp);
        }
        System.out.println("链表中的元素:");
        for (int i = 0; i < ll.size(); i++) {
            System.out.println(ll.get(i));
        }
        System.out.println("******************");
        ll.removeFirst();
        ll.removeLast();
        System.out.println("删除第1个元素和最后1个元素后的链表:");
        for (int i = 0; i < ll.size(); i++) {
            System.out.println(ll.get(i));
        }
    }
}
java系列16:集合_第15张图片
运行结果

四、vector

Vector类与ArrayList类和LinkedList类很相似,最大的区别在于Vector是线程同步的。
如果在多线程的程序中要使用到集合框架,并且不希望线程与线程之间相互干扰,那么Vector是不错的选择。

Vector类继承于AbstractList类,并实现了List接口。

java系列16:集合_第16张图片
构造方法
java系列16:集合_第17张图片
常用方法1
java系列16:集合_第18张图片
常用方法2

例:

package test;

import java.util.Vector;

public class TestVector {
    public static void main(String[] args) {
        Vector v = new Vector();
    
        v.addElement("C");
        v.addElement("Java");
        v.addElement("Python");
        System.out.println(v.toString());
    
        v.removeElement("Java");
        System.out.println(v.toString());
    }
}
java系列16:集合_第19张图片
运行结果

五、Map和HashMap

Map接口用于维护“键-值对”的关联性,可以通过键查找值;HashMap是Map接口的一个具体实现类。

对于HashMap来说,不存在索引,也就是说不可以通过索引来访问元素,只能通过键去访问值。
由于没有索引,所以HashMap中元素的存放是没有顺序的。

如要快速检索元素的话,HashMap性能优越。

HashMap类继承了AbstractMap类,并实现了Map接口。

java系列16:集合_第20张图片
HashMap构造方法
java系列16:集合_第21张图片
HashMap常用方法

例:

package test;

import java.util.HashMap;

public class TestHashMap {
    public static void main(String[] args) {
        HashMap hm = new HashMap();
    
        hm.put("93-07", "张三");
        hm.put("84-12", "李四");
        hm.put("94-02", "王五");
        System.out.println(hm.toString());
    
        System.out.println("学号是84-12的学生是:" + hm.get("84-12"));
    
        hm.remove("93-07");
        System.out.println(hm.toString());
    }
}
java系列16:集合_第22张图片
运行结果

五、Set和HashSet

HashSet:对象不能相同。

HashSet如何判断2个对象是否相同?
答:在内部比较的时候,会调用这个对象的2个方法:equals和hashcode。

你可能感兴趣的:(java系列16:集合)