集合
定义:如果一个类是专门用来存放其他类对象的,则这个类有一个另外特殊的词叫做集合
容器和类的关系:集合一定是类,但类不一定是集合
Collection 接口
List接口:线性表
有序,允许重复
实现类:ArrayList linkedList
import java.util.ArrayList;
/*
* ArrayList:
* 1.长度可变的动态数组(下标从0开始)
* 2.对查询和随机访问性能高
*/
public class D1 {
public static void main(String[] args) {
// 创建ArrayList集合
ArrayList list = new ArrayList();
// 增加----集合可以存储任意数据
list.add("墨渐生微"); // 参数为Object对象--参数的多态
list.add("Dream");
list.add(0, "Hello"); // 以下标存储对象
// 删除
list.remove(2); // 以下标删除元素
list.remove("墨渐生微");
// 修改
list.set(0, "生命");
// 遍历
for (int i = 0; i < list.size(); i++) {
/*
* size()方法可获取集合的长度 get(int index) 方法是以下标获取集合元素
*/
System.out.println(list.get(i));
}
// 判断是否存在传入元素
System.out.println(list.contains("生命"));
// 判断集合是否为空?
boolean flag = list.isEmpty();
if (!flag) {
// 清空集合!!!
list.clear();
}
}
}
import java.util.LinkedList;
/*
* LinkedList:
* 1.采用链表保存元素
* 2.新增、插入、删除效率较高
*/
public class D2 {
public static void main(String[] args) {
// 创建LinkedList集合
LinkedList list = new LinkedList();
// 增删改查---LinkedList与ArrayList的基本方法相同
list.add("墨渐生微");
list.add(1,"加油");
list.set(0,"Dream");
list.remove(0);
// LinkedList特有的方法
list.addFirst("Future"); // 在集合首添加元素
list.addLast("梦想"); // 在集合尾添加元素
System.out.println(list.getFirst()); // 获取第一个元素
System.out.println(list.getLast()); // 获取最后一个元素
list.removeFirst(); // 删除第一个元素
list.removeLast(); // 删除最后一个元素
for (Object object : list) {
System.out.println(object);
}
}
}
Set接口:集合
无序,不允许重复
实现类:TreeSet HashSet
import java.util.HashSet;
/*
* HashSet:
* 1.Set是集合,所以没有下标
* 2.集合无序,唯一
*/
public class D3 {
public static void main(String[] args) {
// 创建HashSet集合
HashSet set = new HashSet();
// 增删查
set.add("春天");
set.add("夏天");
set.add("秋天");
set.add("冬天");
set.add("冬天");//set唯一
set.add("Dream");
set.remove("Dream");
System.out.println("数据个数:"+set.size());
// 遍历一
for (Object object : set) {
System.out.println(object);
}
// 遍历二
Object[] obj = set.toArray(); // 将HashSet集合转换成数组
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
}
}
Map接口
定义:既保存数据本身,也保存数据的主键的一种接口
实现类:HashMap TreeMap
import java.util.HashMap;
import java.util.Set;
/*
* map无序且key唯一,保存映射关系的数据,即键值对(key-value)存储数据
* HashMap
*/
public class D4 {
public static void main(String[] args) {
// 创建HashMap集合
HashMap map = new HashMap();
// 增加
map.put(1, "鼠");
map.put(2, "鼠");
map.put(3, "牛");
map.put(4, "虎"); // key 唯一
map.put(2, "牛");
// 长度
System.out.println(map.size());
// 删除(通过key进行删除)
map.remove(4);
// 清空
// map.clear();
// 判断key或value是否包含
System.out.println(map.containsKey(1));
System.out.println(map.containsValue("虎"));
// 通过key获取到对应的value
System.out.println(map.get(2));
// 获取所有key
System.out.println("默认获取到所有key" + map.keySet());
// 获取所有value
System.out.println("默认获取所有value" + map.values());
// 遍历
Set set = map.keySet(); // 获取所有的key并存入Set集合中
Object[] obj = set.toArray(); // 将Set集合转换成数组
for (int i = 0; i < map.size(); i++) {
// 以数组的键值作为参数遍历map集合
System.out.println(map.get(obj[i]));
}
}
}
Iterator接口:利用该接口提供的方法可以遍历所有容器中的元素
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/*
* 迭代
* 1.集合.Iterator( )方法获取迭代器,返回Iterator类型引用
* 2.引用.hasNext( )方法判断是否有下一个值
* 3.引用.next( )方法获取下一个元素
*
* 泛型:在集合实例化时指定集合的元素类型
*/
public class D5 {
public static void main(String[] args) {
// 多态引用
List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 遍历
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1, "10");
map.put(2, "20");
map.put(3, "30");
map.put(4, "40");
map.put(5, "50");
map.put(6, "60");
// map 没有Iterator迭代器,所以需要将借助Set
Set<Integer> set = map.keySet();
iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(map.get(iterator.next()));
}
}
}
hashCode()和equals()方法:
基于哈希表实现的集合类型,为避免哈希冲突,需要重写hashCode()和equals()方法
Collections类:该类提供了对Collection接口实现的排序、倒置、查找等功能
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/*
* Collections工具类
*/
public class D1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add(6);
list.add(66);
list.add(12);
list.add(88);
// 排序(升序)
Collections.sort(list);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
// 反转
Collections.reverse(list);
iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
// 填充
Collections.fill(list, 0); // 集合所有元素都是0
// 最大最小值
Collections.max(list);
Collections.min(list);
// 洗牌
Collections.shuffle(list);
}
}
排序规则接口接口:
Comparable : 定义默认排序规则
Comparator : 定义临时排序规则
通过接口的方法可以制定出对象之间比较的标准;凡是需要进行对象的比较排序均可以实现接口
/**
* 学生类
*/
public class Student implements Comparable<Student>{
private String name;
private int score;
public Student() {
}
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
/*
重写Comparable接口的方法,定义默认排序规则,按照name进行排序
*/
@Override
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
}
import java.util.Comparator;
/**
* Student类的临时排序规则
*/
public class SortScore implements Comparator<Student> {
// 重写Comparator接口的方法,定义临时排序规则,按照成绩进行排序
@Override
public int compare(Student o1, Student o2) {
return o1.getScore()-o2.getScore();
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 集合排序规则测试
*/
public class Test {
public static void main(String[] args){
List<Student> stus = new ArrayList<Student>();
stus.add(new Student("Myth",88));
stus.add(new Student("Lisa",45));
stus.add(new Student("Abo",56));
stus.add(new Student("Huilin",76));
// 输出排序前的集合
for (Student student : stus) {
System.out.println(student);
}
System.out.println("-------------------------");
/******************* 测试集合的默认排序规则 : begin*******************/
// 按照name进行排序
Collections.sort(stus);
// 输出按照name排序后的集合
for (Student student : stus) {
System.out.println(student);
}
System.out.println("-------------------------");
/******************* 测试集合的默认排序规则 : end*******************/
/******************* 测试集合的临时排序规则 : begin*******************/
// 按照成绩进行排序
Collections.sort(stus,new SortScore());
// 输出按照score排序后的集合
for (Student student : stus) {
System.out.println(student);
}
System.out.println("-------------------------");
}
}