1、什么是集合?
集合是对象的容器,定义了对多个对象进行操作的常用方法,可以实现数组的功能。
2、集合和实验的区别?
-
数组长度固定,集合长度不固定。
-
数组可以存储基本类型和引用类型,集合只能存储引用类型。
-
PS:在Java体系中,集合可分为2大类:1、List/Set 2、Map
3、Collection体系集合:
Collection集合方法示例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 21:54
*/
public class CollectionTest {
public static void main(String[] args) {
//创建集合
Collection collection = new ArrayList();
//添加元素
collection.add("苹果");
collection.add("西瓜");
collection.add("草莓");
//获取集合长度
System.out.println("collection.size() = " + collection.size());
System.out.println("collection集合元素为:" +collection);
//删除元素
// collection.remove("苹果");
// System.out.println("collection删除后: " + collection.size());
//清除元素
// collection.clear();
// System.out.println("collection清除后: " + collection.size());
//遍历元素
//增强for循环
System.out.println("------使用增强for循环-------");
for (Object o : collection) {
System.out.println(o);
}
//使用迭代器(迭代器专门用来遍历集合的一种方式)
//hasNext();用来判断有没有下一个元素,next();获取下一个元素
System.out.println("------使用迭代器-------");
Iterator iterator1 = collection.iterator();
while (iterator1.hasNext()){
String s=(String)iterator1.next();
System.out.println(s);
}
System.out.println("元素个数:"+collection.size());
//集合判断
System.out.println(collection.contains("西瓜"));
System.out.println(collection.isEmpty());
}
}
Student类代码:
import java.util.Objects;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 21:51
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
运行截图:
PS:遍历同时不能使用集合删除方法,否则出现并发修改异常,可使用迭代器的删除方法。
4、Map集合
Map集合的特点:
-
用于存储任意键值对(Key-Value)。
-
键:无下标、不可以重复(唯一)。
-
值:无下标、可以重复 。
-
Map接口称为“映射”存储一对数据(Key-Value),键不可重复,值可以重复。
HashMap
1、线程不安全,运行效率快。
2、允许用null 作为key或是value。
3、存储结构:哈希表
HashMap方法功能演示:
import java.util.HashMap;
import java.util.Map;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 20:32
*
* Map称为“映射”存储一对数据(Key-Value),键不可重复,值可以重复。
*/
public class HashMapTest {
public static void main(String[] args) {
//创建集合
HashMap<Student,String>students=new HashMap<Student,String>();
//添加元素
Student s1 = new Student("小明",100);
Student s2 = new Student("小丽",200);
Student s3 = new Student("小红",300);
students.put(s1,"北京");
students.put(s2,"上海");
students.put(s3,"广州");
//插入s3后会覆盖之前的数据.
students.put(s3,"南京");
students.put(new Student("小刚",250),"杭州");
System.out.println("students元素个数: " + students.size());
System.out.println(students.toString());
//2删除
students.remove(s1);
System.out.println("students删除后元素个数:" + students.size());
//3遍历Map的两种方法
//3.1、使用keySet()
System.out.println("--------keySet---------");
for (Student key : students.keySet()) {
System.out.println( key.toString()+"------->"+students.get(key));
}
//3.2使用entyrSet()
System.out.println("--------entyrSet---------");
for (Map.Entry<Student, String> entry : students.entrySet()) {
System.out.println(entry.getKey()+"------->"+entry.getValue());
}
//contains方法判断是否包含某些信息
//通过key判断
System.out.println(students.containsKey(new Student("小丽", 200)));
//通过value判断
System.out.println(students.containsValue("上海"));
}
}
Student类:
import java.util.Objects;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 20:30
*/
public class Student {
private String name;
private int stuNo;
public Student() {
}
public Student(String name, int stuNo) {
this.name = name;
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", stuNo=" + stuNo +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return stuNo == student.stuNo && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, stuNo);
}
}
运行截图:
TreeMap
实现了SortedMap接口(Map的子接口),可以对key自动排序,Key需实现Comparable接口。
TreeMap方法功能演示:
import java.util.Map;
import java.util.TreeMap;
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 21:22
*/
public class TreeMapTest {
public static void main(String[] args) {
//新建集合
TreeMap<Student,String>treeMap=new TreeMap<>();
//添加元素
Student s1 = new Student("小张",10);
Student s2 = new Student("小李",15);
Student s3 = new Student("小刘",20);
treeMap.put(s1,"北京");
treeMap.put(s2,"上海");
treeMap.put(s3,"广州");
treeMap.put(new Student("小赵",20),"南京");
//遍历:1、使用keySet遍历
System.out.println("-----keySet()-------");
for (Student student : treeMap.keySet()) {
System.out.println(student.toString()+"------->"+treeMap.get(student));
}
//2、使用entrySet()
System.out.println("------entrySet()--------");
for (Map.Entry<Student, String> entry : treeMap.entrySet()) {
System.out.println(entry.getKey()+"------->"+entry.getValue());
}
//判断
treeMap.containsKey(new Student("小张",10));
System.out.println(treeMap.containsValue("北京"));
}
}
Student类:
/**
* @author 小河子~
* @VX xiaohe66i
* @date 2021年06月13日 21:23
*/
public class Student implements Comparable<Student>{
private String name;
private int stuNo;
public Student() {
}
public Student(String name, int stuNo) {
this.name = name;
this.stuNo = stuNo;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", stuNo=" + stuNo +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
@Override
public int compareTo(Student o) {
int n2=this.stuNo-o.getStuNo();
return n2;
}
}
程序运行截图:
其他实现类
Hashtable :
-
JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。
Properties :
-
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。