目的:
掌握集合中的相关知识,复习并且掌握数组的遍历方式
技术及其相关知识:
1.复习文件相关的基础知识
String - StringBuffer&StringBuilder
File:文件的创建 目录的创建删除
文件的输入和输出:
OutputStream InputStream
FileOutputStream FileInputStream
FileWriter FileReader
ObjectOutputStream ObjectInputStream
BufferedOutputStream BufferedInputStream
RandomAccessFile mode:rw(可读可写)
close();
2.数组和集合的优劣与特点
数组:存储多个对象
int[] score = {1,2,3};
int[] score = new int[10];
弊端:数组是不可变的 内容可变
实际开发中需要一个能够随时改变的数组 -> 集合Collection
Collection抽象接口 定义集合的相关操作
--List 接口 列表 数组
特点:有序 可重复
--ArrayList
--LinkedArrayList
--Set"集合"
特点:无序 不重复
--HashSet
Map接口 映射关系 Key-Value 键值对 键不能相同 值可以相同
语文 98
英语 98
3.集合的元素个数是可变的
//Collection接口的方法
Collection<String> t1 = new ArrayList();
添加元素:
add
addAll
t1.add("Jack");
t1.add("Merry");
System.out.println(t1);
删除元素:
remove
//删除一个对象
t1.remove("Jack");
System.out.println(t1);
获取元素个数:
size
//获取元素个数
System.out.println(t1.size());
是否包含一个对象:
contains
//判断是否包含一个元素
if (t1.contains("Merry")){
System.out.println("有Merry");
}else{
System.out.println("没有Merry");
}
是否为空:
imEmpty
//判断是否为空
if (t1.isEmpty()){
System.out.println("是空的");
}else{
System.out.println("不是空的");
}
是否相同:
equals
//判断两个集合是否相同
Collection<String> t2 = new ArrayList<>();
t2.add("Merry");
t2.add("Jack");
t2.add("Rose");
t2.add("Tom");
if (t1.equals(t2)){
System.out.println("两个集合相同");
}else{
System.out.println("两个集合不相同");
}
清空:
clear
//清空
t1.clear();
System.out.println(t1);
4.三种常用的遍历方法
(1)使用Iterator来遍历
// hasNext 判断是否有元素
// next 获取下一个对象
// remove 删除当前遍历过后的对象
System.out.println("--------------------");
Iterator iterator = t2.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
// while (iterator.next() != null){
// System.out.println(iterator.next());
// }
(2)for-each 增强for循环 快速循环
for (String obj:t2){
System.out.println(obj);
}
(3)for-i
for (int i = 0 ; i<t2.size() ; i++){
System.out.println(((ArrayList<String>) t2).get(i));
}
5.ArrayList操作
添加元素add
ArrayList<Integer> score = new ArrayList<>();
score.add(2);
score.add(3);
score.add(0,1);//在指定位置插入
System.out.println(score);
访问指定元素get
score.get(1);
修改一个元素set
score.set(0,0);
System.out.println(score);
删除remove
score.remove(0);//删除指定位置的元素
System.out.println(score);
score.remove((Integer)2);//删除指定的对象
System.out.println(score);
score.clear();//删除所有 情况
System.out.println(score);
ArrayList<Integer> a2 = new ArrayList<>();
a2.add(1);
a2.add(2);
a2.add(3);
将一个集合里面的内容添加到当前集合中
score.addAll(a2);
System.out.println(score);
ArrayList<Integer> a3 = new ArrayList<>();
a3.add(1);
a3.add(2);
取两个集合的交集retainAll()
score.retainAll(a3);//取两个集合的交集
System.out.println(score);
访问某个对象在集合里面的索引(第一次出现indexOf();最后一次出现lastIndexO())
ArrayList<Integer> a4 = new ArrayList<>();
a4.add(1);
a4.add(2);
a4.add(2);
a4.add(1);
System.out.println(a4.indexOf(1));//第一次出现的位置
System.out.println(a4.lastIndexOf(1));//最后一次出现的位置
将ArrayList转化为普通数组
Integer[] objects = new Integer[a4.size()];
a4.toArray(objects);
for (Integer i:objects) {
System.out.print(i);
}
System.out.println("--------------------");
Object[] objects1 = a4.toArray();
for (Object i:objects1){
System.out.println(i);
}
System.out.println("--------------------");
Iterator iterator = a4.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
6.Lambda表达式
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);
//Lambda表达式
//nums.removeIf( obj -> obj % 2 ==0 );
nums.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer obj) {
return obj % 2 == 0;
}
});
System.out.println(nums);
1.使用方式 定义一个类实现接口
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
PXDClass pc = new PXDClass();
ac.test(num,pc);
2.使用匿名类
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);
}
});
3. 使用Lambda表达式
//如果参数是一个接口类对象,且接口里面只有一个方法
//可以省略方法名
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num,(int element)->{System.out.println(element);});
4.如果只有一个参数 参数类型可以省略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num,element -> {System.out.println(element);});
5.如果代码块里面只有一行语句 大括号可以忽略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num,element -> System.out.println(element));
//闭包 enclusure 把函数作为一个方法的参数
class ArrayClass{
public void test(int[] target,Show s){
for (int element:target){
s.customShow(element);
}
}
}
//必须是接口 这个接口里面只有一个方法
interface Show{
void customShow(int element);
}
class PXDClass implements Show{
@Override
public void customShow(int element) {
System.out.println(element);
}
}
7.java.util.ArrayList < E > 的一些方法
8.数组和ArrayList的比较
实际使用:
1.写一个小demo
创建一个类Person:name age属性
创建ArrayList对象保存多个Person对象
1.统计年龄大于30的人数
2.统计名字中有张的人数
Person类
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
MyClass主程序
import java.util.ArrayList;
public class MyClass {
public static void main(String[] args){
ArrayList<Person> people = new ArrayList<>();
people.add(new Person("刘转",50));
people.add(new Person("李盐漏",40));
people.add(new Person("王大拿",60));
people.add(new Person("张阉宁",20));
people.add(new Person("环喜",25));
System.out.println("年龄大于30的:");
for (int i=0 ; i <people.size() ; i++){
if (people.get(i).getAge()>30) {
System.out.println(people.get(i).getName());
}
}
System.out.println("-----------------");
System.out.println("名字里面带有张的:");
for (Person p:people){
if (p.getName().contains("张")) {
System.out.println(p.getName());
}
}
}
}
2.任务:自己编写一个ArrayList的类功能
自己实现ArrayList功能 支持所有对象的存储
- 什么叫泛型
- add
- add(i,o)
- remove(i)
- remove(o)
- remove(s,e)
- set(i,o)
- sort
- Person::getAge();
心得感悟:
今天学习的这个和之前学习String的有很多相似点。思维难度不算很大,但是却需要去理解,需要去了解使用方法。
这两天眼睛看的好酸啊,我太难了。