JAVA集合(容器)

1.集合的引入
存储多个元素时,我们前面讲过数组,数组可以存储。但是数组也有它的弊端,使用的时候,必须先定义好长度,也就是数组的长度是固定,不能根据我们的需求自动变长或者变短。
我们看一个实例,定义一个Student类

public class Student {
	private String name;
	private Integer age;
	public Student() {
		super();
	}
	public Student(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

现在需要存储三个学生信息

public class test {
	public static void main(String[] args) {
		Student student[]=new Student[3];
		student[0]=new Student("小明",18);
		student[1]=new Student("小红",19);
		student[2]=new Student("小刚",20);
		
		for (Student student2 : student) {
			System.out.println(student2.getName()+","+student2.getAge());
		}
	}
}

这里实现了用数组结构存储了三个学生,但是假如我们需要再存储一个学生,就懵逼了,因为长度固定了,这时就引入了可变长度的集合(容器)

2.集合体系
集合的体系结构如下图所示
在这里插入图片描述
下面我们将对几个常用的集合进行讲解
(1)Collection接口
Collection接口定义了存储一组对象的方法,其子接口Set、List和Queue分别定义了不同类型的存储方式。

(2)List接口
List代表元素有序、可重复的集合,集合中每个元素都有对应的顺序索引,允许加入重复元素,通过索引指定元素的位置,具体实现类有ArrayList、LinkedList和Vector三种。

三种实现的区别:
ArrayList: 底层实现是数组,查询快,修改、插入、删除慢,线程不安全,效率高
LinkedList: 底层实现是链表,查询慢,修改、插入、删除慢,线程不安全,效率高
Vector: 底层实现是数组,线程安全,效率低

import java.util.ArrayList;

public class testArrayList {
	//打印集合
	public static void print(ArrayList<String> arrayList) {
		System.out.println("当前元素集合");
		for (String string : arrayList) {
			System.out.println(string);
		}
	}
	public static void main(String[] args) {
		ArrayList<String>list=new ArrayList<>();
		//添加元素
		list.add("小明");
		list.add("小红");
		list.add("小刚");
		print(list);
		
		//在指定位置插入元素
		list.add(1, "小兰");
		print(list);
		
		//替换元素
		list.set(0, "小花");
		print(list);
		
		//删除元素
		list.remove(2);
		print(list);
	}
}

运行结果
在这里插入图片描述

import java.util.LinkedList;

public class testLinkedList {
	//打印集合
	public static void print(LinkedList<String>linkedlist) {
		System.out.println("当前集合元素");
		for (String string : linkedlist) {
			System.out.println(string);
		}
	}
	public static void main(String[] args) {
		LinkedList<String>linkedlist=new LinkedList<>();
		//添加元素
		linkedlist.add("花花");
		linkedlist.add("红红");
		linkedlist.add("兰兰");
		print(linkedlist);
		// indexOf 寻找位置
		int a=linkedlist.indexOf("红红");
		System.out.println("红红的索引为"+a);
		// peekFirst 获取第一个元素
		String str=linkedlist.peekFirst();
		System.out.println("第一个元素为"+str);
		// peekFirst 获取最后一个元素
		String str1=linkedlist.peekLast();
		System.out.println("最后一个元素为"+str1);
		// pollFirst 摘取第一个元素
		linkedlist.pollFirst();
		print(linkedlist);
		// pollLast 榨取最后一个元素
		linkedlist.pollLast();
		print(linkedlist);
	}
}

运行结果
在这里插入图片描述
(3)Set接口
Set继承Collection接口,不能包含重复元素,Set判断两个对象不是使用==来判断,是使用equals方法。Set常用的实现类是HashSet

import java.util.HashSet;
import java.util.Iterator;

public class testHashSet {
	public static void main(String[] args) {
		HashSet<String> hashset=new HashSet<>();
		hashset.add("小明");
		hashset.add("小兰");
		hashset.add("小红");
		
		//用Iterator遍历容器
		Iterator<String>it=hashset.iterator();
		while(it.hasNext()) {
			String s=it.next();
			System.out.println(s);
		}
	}
}

运行结果
在这里插入图片描述
(4)Map接口
是存放一对值的最大接口,即接口中的每一个元素都是一对,以key->value键值对的形式保存,Map的常用实现类是HashMap

import java.util.HashMap;
import java.util.Iterator;

public class testHashMap {
	public static void main(String[] args) {
		HashMap<Integer,String>hs=new HashMap<>();
		//添加元素put()
		hs.put(1, "小明");
		hs.put(2, "小红");
		hs.put(3, "小蓝");
		// 通过key,获取value
		String s=hs.get(2);
		System.out.println(s);
		System.out.println("####################################");
		//迭代器遍历遍历
		Iterator<Integer> it=hs.keySet().iterator();//获取key的集合,再获取迭代器
		while(it.hasNext()) {
			Integer key=it.next();// 获取key
			String string=hs.get(key);// 通过key获取value
			System.out.println(string);
		}
	}
}

运行结果
在这里插入图片描述
3.集合中的各种遍历方式
List遍历方式
(1)for循环
(2)foreach
(3)Iterator遍历

import java.util.ArrayList;
import java.util.Iterator;

public class test1 {
	public static void main(String[] args) {
		ArrayList<String>list=new ArrayList<>();
		//添加元素
		list.add("小明");
		list.add("小红");
		list.add("小刚");
		
		//for循环遍历
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println("###########################################");
		//foreach遍历
		for (String string : list) {
			System.out.println(string);
		}
		System.out.println("###########################################");
		//Iterator遍历
		Iterator<String>it=list.iterator();
		while(it.hasNext()) {
			String string=it.next();
			System.out.println(string);
		}
	}
}

运行结果
在这里插入图片描述
Set遍历方式
(1)foreach
(2)Iterator遍历

import java.util.HashSet;
import java.util.Iterator;

public class test2 {
	public static void main(String[] args) {
		HashSet<String> hashset=new HashSet<>();
		hashset.add("小明");
		hashset.add("小兰");
		hashset.add("小红");
		
		//foreach遍历
		for (String string : hashset) {
			System.out.println(string);
		}
		System.out.println("#######################################");
		//Iterator遍历
		Iterator<String>it=hashset.iterator();
		while(it.hasNext()) {
			String string=it.next();
			System.out.println(string);
		}
	}
}

运行结果
在这里插入图片描述
Map遍历方式
(1)根据key获取value
(2)使用entrySet

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class test3 {
	public static void main(String[] args) {
		HashMap<Integer,String>hs=new HashMap<>();
		//添加元素put()
		hs.put(1, "小明");
		hs.put(2, "小红");
		hs.put(3, "小蓝");
		//通过key获取value
		Iterator<Integer>it=hs.keySet().iterator();//获取key的集合,再获取迭代器
		while(it.hasNext()) {
			Integer key=it.next();// 获取key
			String string=hs.get(key);// 通过key获取value
			System.out.println(string);
		}
		System.out.println("###########################################");
		//使用entrySet
		Set<Entry<Integer,String>>s=hs.entrySet();
		for (Iterator iter=s.iterator(); iter.hasNext(); ) {
			Entry e=(Entry) iter.next();
			System.out.println(e.getValue());
		}
	}
}

运行结果
在这里插入图片描述
4.Collections工具类
Collections工具类包含了许多对集合操作的方法,下面简单讲解几个

(1)shuffle()将集合中的元素随机打乱

import java.util.ArrayList;
import java.util.Collections;

public class test4 {
	public static void main(String[] args) {
		ArrayList<String>list=new ArrayList<>();
		//添加元素
		list.add("小明");
		list.add("小红");
		list.add("小刚");
		System.out.println("-------------打乱前--------------");
		for (String string : list) {
			System.out.println(string);
		}
		Collections.shuffle(list);//shuffle()打乱
		System.out.println("-------------打乱后--------------");
		for (String string : list) {
			System.out.println(string);
		}
	}
}

运行结果
在这里插入图片描述
(2)revers()逆序

import java.util.ArrayList;
import java.util.Collections;

public class test5 {
	public static void main(String[] args) {
		ArrayList<String>list=new ArrayList<>();
		//添加元素
		list.add("小明");
		list.add("小红");
		list.add("小刚");
		System.out.println("-------------逆序前--------------");
		for (String string : list) {
			System.out.println(string);
		}
		Collections.reverse(list);//reverse()逆序
		System.out.println("-------------逆序后--------------");
		for (String string : list) {
			System.out.println(string);
		}
	}
}

运行结果
在这里插入图片描述
(3)sort()排序,binarysearch()二分查找等方法不再讲解,大家自己测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值