我在上海樂字節學習Java的第二十天(持續更新中)

Java集合(上)java

Java中的集合是工具類,能夠存儲任意數量的具備共同屬性的對象編程

  • 爲何使用集合,而不用數組呢?
    – 存儲20名學生信息(數組)
    – 存儲商品信息(集合)
  • 應用場景
  • 沒法預測存儲數據的數量
  • 同時存儲具備一對一關係的數據
  • 須要進行數據的增刪
  • 數據重複問題

Java集合框架體系結構

在這裏插入圖片描述

List(列表)

  • List 是元素有序而且能夠重複的集合,稱爲序列
  • List 能夠精確的控制每一個元素的插入位置,或刪除某個位置的元素
  • List 的兩個主要實現類是 ArrayList 和 LinkedList

ArrayList

  • ArrayList 底層是由數組實現的
  • 動態增加,以知足應用程序的需求
  • 在列表尾部插入或刪除很是有效
  • 更適合查找和更新元素
  • ArrayList 中的元素能夠爲 null

集合是屬於 java.util 包的(想要具體瞭解能夠查找API文檔,下面我所有列舉)
Collectionswift

在這裏插入圖片描述

List數組

在這裏插入圖片描述

ArrayListapp

在這裏插入圖片描述

在這裏插入圖片描述

案例一

  • 用ArrayList存儲編程語言的名稱,並輸出
  • 名稱包括「 Java」 、「C」、「C++」、「Go」 和 「Swift」
  • 具體用到了 add()、size()、remove(int index)、remove(Object o) 方法
package com.sh.set;

import java.util.ArrayList;框架

import java.util.List;編程語言

public class ListDemo1 {編輯器

public static void main(String[] args) {ide

// 用ArrayList存儲編程語言的名稱,並輸出工具

List list=new ArrayList();

list.add("Java");

list.add("C");

list.add("C++");

list.add("Go");

list.add("swift");

//輸出列表中元素的個數

System.out.println("列表中元素的個數爲:"+list.size());

//遍歷輸出全部編程語言

System.out.println("**");

for(int i=0;i<list.size();i++){

System.out.print(list.get(i)+",");

}

//移除列表中的C++

System.out.println();

list.remove(2);

// list.remove("C++");

System.out.println("**");

System.out.println("移除C++之後的列表元素爲:");

for(int i=0;i<list.size();i++){

System.out.print(list.get(i)+",");

}

}

}

  • 在內存中的存儲方法

在這裏插入圖片描述

  • 運行結果

在這裏插入圖片描述

案例二(公告管理)

  • 需求
    – 公告的添加和顯示
    – 在指定位置處插入公告
    – 刪除公告
    – 修改公告
  • 公告類屬性
    – 編號 id
    – 標題 title
    – 建立人 creator
    – 建立時間 createTime
  • 公告類方法
    –構造方法
    –獲取和設置屬性值的方法
  • 所用方法
    – add(int index, E element) 在列表的指定位置插入指定元素
    – remove(int index) 移除列表中指定位置的元素
    – set(int index, E element) 用指定元素替換列表中指定位置的元素
package com.sh.set;

import java.util.Date;

public class Notice {

private int id;//ID

private String title;//標題

private String creator;//建立人

private Date createTime;//建立時間

public Notice(int id, String title, String creator, Date createTime) {

super();

this.id = id;

this.title = title;

this.creator = creator;

this.createTime = createTime;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getCreator() {

return creator;

}

public void setCreator(String creator) {

this.creator = creator;

}

public Date getCreateTime() {

return createTime;

}

public void setCreateTime(Date createTime) {

this.createTime = createTime;

}

}

//測試類

package com.sh.set;

import java.util.ArrayList;

import java.util.Date;

public class NoticeTest {

public static void main(String[] args) {

// 建立Notice類的對象,生成三條公告

Notice notice1 = new Notice(1, "歡迎來到學習網!", "管理員", new Date());

Notice notice2 = new Notice(2, "請同窗們按時提交做業!", "老師", new Date());

Notice notice3 = new Notice(3, "考勤通知!", "老師", new Date());

// 添加公告

ArrayList noticeList = new ArrayList();

noticeList.add(notice1);

noticeList.add(notice2);

noticeList.add(notice3);

// 顯示公告

System.out.println("公告的內容爲:");

for (int i = 0; i < noticeList.size(); i++) {

      System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());

}

      System.out.println("時間:"+((Notice)(noticeList.get(1))).getCreateTime());

System.out.println("**");

// 在第一條公告後面添加一條新公告

Notice notice4 = new Notice(4, "在線編輯器能夠使用啦!", "管理員", new Date());

noticeList.add(1, notice4);

// 顯示公告

System.out.println("公告的內容爲:");

for (int i = 0; i < noticeList.size(); i++) {

System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());

}

System.out.println("**");

// 刪除按時提交做業的公告

noticeList.remove(2);

// 顯示公告

System.out.println("刪除公告後的內容爲:");

for (int i = 0; i < noticeList.size(); i++) {

System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());

}

//將第二條公告改成:Java在線編輯器能夠使用啦!

System.out.println("**");

//修改第二條公告中title的值

notice4.setTitle("Java在線編輯器能夠使用啦!");

noticeList.set(1, notice4);

System.out.println("修改後公告的內容爲:");

for (int i = 0; i < noticeList.size(); i++) {

System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());

}

}

}

運行結果

LinkedList

  • 與 ArrayList 同樣,LinkedList 也按照索引位置排序,但它的元素之間是雙向連接的
  • 適合快速地插入和刪除元素
  • LinkedList 實現 List 和 Queue 兩個接口

構造方法

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

案例一:使用 LinkedList 對字符串進行管理

package com.sh.set;

import java.util.LinkedList;

public class LinkedListDemo1 {

public static void main(String[] args) {

LinkedList<String> list = new LinkedList<String>();

//向鏈表添加數據

list.add("apple");

list.add("pear");

//將數據添加到鏈表的開始

list.addFirst("banana");

//將數據添加到鏈表的末尾

list.addLast("grape");

//在指定位置處添加數據,第一個參數爲index值,從0開始

list.add(2, "orange");

//顯示鏈表中的全部數據

System.out.println(list);

//判斷列表中是否包含指定的元素,並輸出相應的結果

boolean flag = list.contains("grape");

if (flag) {

System.out.println("grape找到了!");

} else {

System.out.println("grape沒找到!");

}

//返回index值爲3的數據並輸出

System.out.println("index值爲3的數據爲:" + list.get(3));

//返回第一個元素

System.out.println("第一個元素爲:" + list.getFirst());

//返回最後一個元素

System.out.println("最後一個元素爲:" + list.getLast());

}

}

  • 運行結果

在這裏插入圖片描述

案例二:使用 LinkedList 對自定義類進行管理

Student類

package com.sh.set;

public class Student {

private String stuNum;

private String stuName;

private int age;

public Student(String stuNum, String stuName, int age) {

this.stuNum = stuNum;

this.stuName = stuName;

this.age = age;

}

public String getStuNum() {

return stuNum;

}

public void setStuNum(String stuNum) {

this.stuNum = stuNum;

}

public String getStuName() {

return stuName;

}

public void setStuName(String stuName) {

this.stuName = stuName;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return " [學號:" + stuNum + ", 姓名:" + stuName + ", 年齡:" + age + "]";

}

}

LinkedListDemo2類

package com.sh.set;

import java.util.LinkedList;

public class LinkedListDemo2 {

public static void main(String[] args) {

LinkedList<Student> stuList = new LinkedList<Student>();

Student stu1 = new Student("001", "Mike", 18);

Student stu2 = new Student("002", "Jack", 20);

Student stu3 = new Student("003", "Lucy", 19);

// 將學生添加到鏈表,使用push完成

// LinkedList實現List接口的同時,也實現了Queue接口

// push和pop就是針對Queue進行添加和取出數據的操做的

stuList.push(stu1);

stuList.push(stu2);

stuList.push(stu3);

System.out.println("鏈表爲:" + stuList);

// 彈出一個元素,這裏能夠把鏈表當作一個容器,先加入到鏈表的數據後彈出,

// 依據的原則是先進後出

System.out.println("彈出的數據爲:" + stuList.pop());

System.out.println("調用pop()方法後的鏈表爲:n" + stuList);

// peek()方法獲取並不移除元素

System.out.println("調用peek()方法的數據爲:" + stuList.peek());

System.out.println("調用peek()方法後的鏈表爲:n" + stuList);

// 再次調用pop()方法,發現調用pop()方法後數據從鏈表中移除了,而peek()方法不會

System.out.println("再次調用pop()方法" + stuList.pop());

System.out.println("再次調用pop()方法後的鏈表爲:n" + stuList);

// 在鏈表中再從新添加元素

stuList.push(stu2);

stuList.push(stu3);

System.out.println("再次添加元素後的鏈表爲:n" + stuList);

// 調用poll()方法

System.out.println("調用poll()方法輸出元素" + stuList.poll());

// 調用poll()方法將獲取元素的同時從鏈表中刪除了元素

System.out.println("調用poll()方法後的鏈表爲:n" + stuList);

}

}

  • 運行結果

在這裏插入圖片描述

Set

  • Set 是元素無序而且不能夠重複的集合,被稱爲集

HashSet

  • HashSet 是Set 的一個重要實現類,稱爲哈希集
  • HashSet 中的元素無序而且不能夠重複
  • HashSet 中只容許一個null元素
  • 具備良好的存取和查找性能

TreeSet(具體能夠查看API文檔)

Set

在這裏插入圖片描述

HashSet

在這裏插入圖片描述

Iterator(迭代器)

  • Iterator 接口能夠以統一的方式對各類集合元素進行遍歷
  • hasNext() 方法檢測集合中是否還有下一個元素
  • next() 方法返回集合中的下一個元素

在這裏插入圖片描述

  • 迭代器遍歷流程
    –實現方法 for 循環和while 循環

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

案例一

  • HashSet 存儲多個表示顏色的英文單詞,並輸出
  • 單詞包括 「blue」、「red」、「black」、" yllow" 和 「white」
  • 使用 add()方法 迭代器Iterator
package com.sh.set;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

public class WordDemo {

public static void main(String[] args) {

// 將英文單詞添加到HashSet中

Set set = new HashSet();

// 向集合中添加元素

set.add("blue");

set.add("red");

set.add("black");

set.add("yellow");

set.add("white");

// 顯示集合的內容

System.out.println("集合中的元素爲:");

Iterator it = set.iterator();

// 遍歷迭代器並輸出元素

while (it.hasNext()) {

System.out.print(it.next() + "   ");

}

// for(Iterator<Set> it1=set.iterator();it1.hasNext();) {

//        System.out.println(it1.next());

//        }

System.out.println();

// 在集合中插入一個新的單詞

// set.add("green");

set.add("white");

it = set.iterator();

// 遍歷迭代器並輸出元素

System.out.println("");

System.out.println("插入重複元素後的輸出結果爲:");

while (it.hasNext()) {

System.out.print(it.next() + "   ");

}

//插入失敗,可是不會報錯

}

}

案例二(寵物貓信息管理)

  • 需求
    – 添加和顯示寵物貓信息
    – 查找某隻寵物貓的信息並輸出
    – 修改寵物貓的信息
    – 刪除寵物貓信息
  • 屬性
    –名字 name
    –年齡 month
    –品種 species
  • 方法
    –構造方法
    –獲取和設置屬性值的方法
    –其餘方法 hashCode 和 equals
    –查找方法

hashCode 和 equals

在這裏插入圖片描述

哈希表和普通存儲序列 (哈希表能夠提升數據查找速度)

在這裏插入圖片描述

哈希表分三個(多個)區域來存放數據,什麼數據放到哪一個區域 有一的規則(hashCode)

在這裏插入圖片描述

在這裏插入圖片描述

  • 判斷屬於哪一個區域用hashCode方法
  • 判斷某個區域對象是不是咱們所要找的,用equals方法
package com.sh.set;

public class Cat {

private String name; //名字

private int month; //年齡

private String species;//品種

//構造方法

public Cat(String name, int month, String species) {

super();

this.name = name;

this.month = month;

this.species = species;

}

    //getter與setter方法

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public String getSpecies() {

return species;

}

public void setSpecies(String species) {

this.species = species;

}

@Override

public String toString() {

return "[姓名:" + name + ", 年齡:" + month + ", 品種:" + species + "]";

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + month;

result = prime * result + ((name == null) ? 0 : name.hashCode());

result = prime * result + ((species == null) ? 0 : species.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

//判斷對象是否相等,相等則返回true,不用繼續比較屬性了

if(this==obj)

return true;

//判斷obj是不是Cat類的對象

if(obj.getClass()==Cat.class){

Cat cat=(Cat)obj;

return cat.getName().equals(name)&&(cat.getMonth()==month)&&(cat.getSpecies().equals(species));

}

return false;

}

}

//測試類

package com.sh.set;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

public class CatTest {

public static void main(String[] args) {

// 定義寵物貓對象

Cat huahua = new Cat("花花", 12, "英國短毛貓");

Cat fanfan = new Cat("凡凡", 3, "中華田園貓");

// 將寵物貓對象放入HashSet中

Set<Cat> set = new HashSet<Cat>();

set.add(huahua);

set.add(fanfan);

// 顯示寵物貓信息

Iterator<Cat> it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

// 再添加一個與花花屬性同樣的貓

Cat huahua01 = new Cat("花花", 12, "英國短毛貓");

set.add(huahua01);

System.out.println("");

System.out.println("添加劇複數據後的寵物貓信息:");

it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

System.out.println("");

// 從新插入一個新寵物貓

Cat huahua02 = new Cat("花花二代", 2, "英國短毛貓");

set.add(huahua02);

System.out.println("添加花花二代後的寵物貓信息:");

it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

System.out.println("");

// 在集合中查找花花的信息並輸出

if (set.contains(huahua)) {

System.out.println("花花找到了!");

System.out.println(huahua);

} else {

System.out.println("花花沒找到!");

}

// 在集合中使用名字查找花花的信息

System.out.println("");

System.out.println("經過名字查找花花信息");

boolean flag = false;

Cat c = null;

it = set.iterator();

while (it.hasNext()) {

c = it.next();

if (c.getName().equals("花花")) {

flag = true;// 找到了

break;

}

}

if (flag) {

System.out.println("花花找到了");

System.out.println(c);

} else {

System.out.println("花花沒找到");

}

// 刪除花花二代的信息並從新輸出

for (Cat cat : set) {

if ("花花二代".equals(cat.getName())) {

set.remove(cat);

break;

}

}

System.out.println("");

System.out.println("刪除花花二代後的數據");

for(Cat cat:set){

System.out.println(cat);

}

//刪除集合中的全部寵物貓信息

System.out.println("");

boolean flag1=set.removeAll(set);

if(set.isEmpty()){

System.out.println("貓都不見了。。。");

}else{

System.out.println("貓還在。。。");

}

}

}

運行截圖

在這裏插入圖片描述

相關文章
相關標籤/搜索