目的:
學(xué)習(xí)Collection接口的方法與使用,以及Collection抽象接口的子類(lèi)List的ArrayList類(lèi)的方法提佣。
技術(shù):
1.調(diào)用Collection接口的前提:
數(shù)組: 存儲(chǔ)多個(gè)對(duì)象
int[] score = {1,2,3};
int[] score = int int[10];
弊端:數(shù)組長(zhǎng)度不可變 內(nèi)容可變
實(shí)際開(kāi)發(fā)中需要一個(gè)能夠隨時(shí)改變的數(shù)組->集合Collection
* Collection抽象接口 定義集合的相關(guān)操作
* |--List接口 列表 數(shù)組 特點(diǎn):有序 重復(fù)
* |--ArrayList
* |--LinkedArrayList
* |--Set“集合” 特點(diǎn):
* |--HasSet
* Map接口 映射關(guān)系 Key-Value 鍵值對(duì) 健不能相同,值可以相同
* |--HashMap
* 語(yǔ)文 98
* 英語(yǔ) 98
*
* Collections類(lèi)
*
* 集合的元素是可變的
* 添加元素 : add addAll
* 刪除元素
* 插入元素
* 訪(fǎng)問(wèn)元素
2.Cllection接口的調(diào)用:
添加 刪除 獲取
//Collection接口
Collection<String> text = new ArrayList<>();
text.add("Jack");
text.add("Merry");
System.out.println(text);
//刪除一個(gè)對(duì)象
text.remove("Jack");
System.out.println(text);
//獲取元素個(gè)數(shù)
System.out.println(text.size());
判斷是否包含一個(gè)元素
if(text.contains("Merry")){
System.out.println("有Merry");
}else{
System.out.println("無(wú)Merry");
}
//判斷是否為空
if(text.isEmpty()){
System.out.println("是空的");
}
判斷兩個(gè)集合是否相同 (equals比較集合的內(nèi)容)
Collection<String> text2 = new ArrayList<>();
text2.add("Merry");
text2.add("Jack");
if(text.equals(text2)){
System.out.println("兩個(gè)集合相同");
}else{
System.out.println("兩個(gè)集合不相同");
}
清空
text.clear();
System.out.println(text);
System.out.println("----------------");
重點(diǎn) 集合的遍歷 遍歷過(guò)程中不要進(jìn)行插入刪除方法
1.使用Iterator遍歷
hasNext 判斷是否有元
next 獲取下一個(gè)元素
remove 刪除當(dāng)前遍歷過(guò)后的對(duì)象
Iterator iterator = text2.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("----------------");
//2. for-each 增強(qiáng)的for循環(huán) 快速循環(huán)
for(String obj :text2){
System.out.println(obj);
}
System.out.println("----------------");
//3.for-i
for(int i = 0; i < text2.size(); i++){
System.out.println(((ArrayList<String>) text2).get(i));
}
3.List類(lèi)的學(xué)習(xí)與使用:
List接口 extends Collection
1.ArrayList
2.LinkedArrayList 內(nèi)部使用鏈表實(shí)現(xiàn)
ArrayList連續(xù)的內(nèi)存空間 優(yōu)點(diǎn):訪(fǎng)問(wèn)方便 缺點(diǎn):刪除 添加
LinkedArrayList 鏈表不一定連續(xù)(基本不連續(xù)) 優(yōu)點(diǎn):增加 刪除 缺點(diǎn):訪(fǎng)問(wèn)
集合里面只能存放對(duì)象
byte char long int float double boolean ArrayList<>括號(hào)里面不能是基本數(shù)據(jù)類(lèi)型
包裝類(lèi)
Byte Char Int Long Float Double Boolean
自動(dòng)將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)化為對(duì)于包裝類(lèi)
添加 訪(fǎng)問(wèn) 修改 插入
ArrayList<Integer> score = new ArrayList<>();
score.add(2); //在末尾添加
score.add(3);
score.add(0,1);//在指定位置插入
System.out.println(score);
//訪(fǎng)問(wèn)指定元素
score.get(1);
//修改一個(gè)元素
score.set(2,4);
刪除
//刪除指定元素
score.remove(0);
System.out.println(score);
//刪除指定對(duì)象
score.remove((Integer)2);
System.out.println(score);
score.clear();//刪除所有 清空
System.out.println(score);
ArrayList<Integer> a2 = new ArrayList<>();
a2.add(5);
a2.add(6);
a2.add(7);
將一個(gè)集合的內(nèi)容添加到當(dāng)前集合中 取交集
score.addAll(a2);
System.out.println(score);
ArrayList<Integer> a3 = new ArrayList<>();
a3.add(1);
a3.add(2);
a3.add(3);
a3.add(4);
a3.add(5);
score.retainAll(a3); //取交集
System.out.println(score);
訪(fǎng)問(wèn)某個(gè)集合里面元素的位置/索引值
ArrayList<Integer> a4 = new ArrayList<>();
a4.add(1);
a4.add(2);
a4.add(2);
a4.add(1);
System.out.println(a4.indexOf(1));//第一次出現(xiàn)的位置
System.out.println(a4.lastIndexOf(1));//最后一次出現(xiàn)的位置
將ArrayList轉(zhuǎn)化為普通數(shù)組
//1.
Object[] objects = a4.toArray();//為什么這么做:讓a4轉(zhuǎn)為不可變的
for(Object i:objects){
System.out.println(i);
}
System.out.println("-------------------");
//2.
Integer[] objects2 = new Integer[a4.size()];
a4.toArray(objects2);
for(Integer i:objects2){
System.out.println(i);
}
獲取集合某個(gè)范圍的子集合
List<Integer> intederList = a4.subList(1,3); // 1到2,不包括3所對(duì)應(yīng)的元素
System.out.println(intederList);
刪除某個(gè)范圍內(nèi)的元素
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);
//Lambda表達(dá)式
nums.removeIf(obj -> obj % 2 == 0);
System.out.println(nums);
// or
for(int i = 0; i < nums.size(); i++){
Integer obj = nums.get(i);
if(obj % 2 == 0){
nums.remove(i);
i--;
}
}
System.out.println(nums);
閉包:
閉包 enclusure 把函數(shù)作為一個(gè)方法的參數(shù)
定義一個(gè)ArrayClass類(lèi)缤削,其中定義一個(gè)方法,方法參數(shù)為一個(gè)整形數(shù)組和一個(gè)接口對(duì)象
class ArrayClass{
public void test(int[] target, Show s){
for (int element: target){
s.customShow(element);
}
}
}
//必須是接口 這個(gè)接口里面只有一個(gè)方法
interface Show{
void customShow(int element);
}
class PXDClass implements Show{
@Override
public void customShow(int element) {
System.out.println(element);
}
}
調(diào)用:
1.使用方式: 定義一個(gè)類(lèi)實(shí)現(xiàn)接口
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
PXDClass pc = new PXDClass();
ac.test(num, pc);
2.使用匿名類(lèi)
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, new Show() {
@Override
public void customShow(int element) {
System.out.println(element);
}
});
- 使用Lambda表達(dá)式
//如果參數(shù)是一個(gè)接口類(lèi)對(duì)象吹榴,且接口里面只有一個(gè)方法
//把這個(gè)方法作為參數(shù)傳遞過(guò)去 可以省略方法名
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, (int element) -> {
System.out.println(element);
});
4.如果只有一個(gè)參數(shù) 參數(shù)類(lèi)型可以省略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num,element -> {
System.out.println(element);
});
5.如果代碼塊里面只有一行語(yǔ)句 大括號(hào)可以省略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num,element -> System.out.println(element));
排序 sort:
1.對(duì)整形數(shù)組排序:
//排序 sort
ArrayList<Integer> a1 = new ArrayList<>();
a1.add(2);
a1.add(1);
a1.add(4);
a1.add(3);
// //方法1.系統(tǒng)提供
// a1.sort(Comparator.comparing(Integer::intValue));
// //方法2.
// a1.sort( new PXDCompara());
// //方法3匿名
// a1.sort(new Comparator<Integer>() {
// @Override
// public int compare(Integer integer, Integer t1) {
// return integer - t1;
// }
// });
// //方法4.化簡(jiǎn)
// a1.sort((Integer integer, Integer t1)->{
// return integer - t1;
// });
System.out.println(a1);
方法2的PSDCompare類(lèi):
class PXDCompara implements Comparator{
//什么時(shí)候需要自己手動(dòng)創(chuàng)建比較器
//如果系統(tǒng)默認(rèn)提供的方法不能完成我們的需求
@Override
public int compare(Object o, Object t1) {
int mo = (int)0;
int mt1 = (int)t1;
return mo - mt1;
}
}
2.對(duì)象排序:
//對(duì)象排序
List<Person> list = new ArrayList<>();
Person person1 = new Person("jack",20);
Person person2 = new Person("rose",30);
Person person3 = new Person("jack",30);
list.add(person1);
list.add(person2);
list.add(person3);
//進(jìn)行排序
//系統(tǒng)提供 按年齡排序
//list.sort(Comparator.comparing(Person::getAge));
//自己編寫(xiě) 先按年齡 再比姓名
list.sort((Person p1 , Person p2) -> {
if(p1.getAge() != p2.getAge()){
return p1.getAge() - p2.getAge();
}else{
return p1.getName().compareTo(p2.getName());
}
});
System.out.println(list);
提供的·Person類(lèi):
class Person {
public String name;
public int age;
public Person(String name, int age){
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
實(shí)際編程:
編程一:
- 創(chuàng)建一個(gè)Person: name age屬性
- 創(chuàng)建ArrayList對(duì)象保存多個(gè)Person對(duì)象
- 1.統(tǒng)計(jì)年齡大于30的人數(shù)
- 2.統(tǒng)計(jì)姓張的人數(shù)
1.定義Person類(lèi):
public class Person {
public String name;
public int age;
public Person(String name, int age){
this.age = age;
this.name = name;
}
}
2.進(jìn)行操作:
import java.util.ArrayList;
public class Myclass {
public static void main(String[] args){
ArrayList<Person> people = new ArrayList<>();
Person person1 = new Person("wuxia",18);
Person person2 = new Person("liyuan",30);
Person person3 = new Person("wangwu",21);
Person person4 = new Person("lisi",34);
Person person5 = new Person("zhangsan",25);
/*
people.add(person1);
people.add(person2);
people.add(person3);
people.add(person4);
people.add(person5);
int countA = 0;
people.removeIf(obj -> obj.age < 30);
for(Person person : people){
countA++;
}
System.out.println(countA);
people.clear();
people.add(person1);
people.add(person2);
people.add(person3);
people.add(person4);
people.add(person5);
int countB = 0;
int count = people.size();
people.removeIf(obj -> obj.name.contains("zhang"));
for(Person person : people){
countB++;
}
System.out.println(count-countB);
*/
people.add(person1);
people.add(person2);
people.add(person3);
people.add(person4);
people.add(person5);
int ageCount = 0;
int zhangCount = 0;
for(Person person : people){
if(person.age >= 30){
ageCount++;
}
if(person.name.contains("zhang")){
zhangCount++;
}
}
System.out.println(ageCount);
System.out.println(zhangCount);
}
}