从零开始的Java开发1-5-4 ArrayListHashSetHashMap 概述与案例

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发1-5-4 ArrayListHashSetHashMap 概述与案例相关的知识,希望对你有一定的参考价值。

文章目录

集合框架的体系结构

List概述

  • List是元素有序并且可以重复的集合,称为序列
  • List可以精确的控制每个元素的插入位置,或删除某个位置的元素。
  • List的两个主要实现类是ArrayListLinkedList

ArrayList

  • ArrayList底层是由数组实现的
  • 动态增长,以满足应用程序的需求
  • 在列表尾部插入或删除数据非常有效
  • 更适合查找和更新元素
  • 元素可以为null

案例:在List中操作String

  1. add
  2. size
  3. get
  4. remove

代码:

public static void main(String[] args) 
		// TODO Auto-generated method stub
		// 用ArrayList存储编程语言的名称并输出:Java、C、C++、Go

		List list = new ArrayList();
		list.add("Java");
		list.add("C");
		list.add("C++");
		list.add("Go");

		// 输出列表中元素的个数
		System.out.println(list.size());

		// 遍历输出所有编程语言
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + " ");
		
		System.out.println();

		// 移除列表中的C++
		list.remove(2);

		// 移除列表中的Java
		list.remove("Java");

		// 查看
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i) + " ");
		

	

输出:

4
Java C C++ Go 
C Go 

案例:公告管理——在ArrayList中对自定义对象的操作

需求

  • 公告的添加和显示
  • 在指定位置处插入公告
  • 删除公告
  • 修改公告

即:增删查改。

公告类属性:

  • 编号 id
  • 标题 title
  • 创建人 creator
  • 创建时间 createTime

公告类方法:

  • 构造方法
  • Getter Setter

公告类:

public class Notice 
	private int id;// ID
	private String title;// 标题
	private String creator;// 创建人
	private Date createTime;// 创建时间

	public Notice(int id, String title, String creator, Date createTime) 
		super();
		this.id = id;
		this.title = title;
		this.creator = creator;
		this.createTime = createTime;
	

	public int getId() 
		return id;
	

	public void setId(int id) 
		this.id = id;
	

	public String getTitle() 
		return title;
	

	public void setTitle(String title) 
		this.title = title;
	

	public String getCreator() 
		return creator;
	

	public void setCreator(String creator) 
		this.creator = creator;
	

	public Date getCreateTime() 
		return createTime;
	

	public void setCreateTime(Date createTime) 
		this.createTime = createTime;
	



公告测试类:

public class NoticeTest 

	public static void main(String[] args) 
		// 创建Notice类的对象,生成三条公告
		Notice not1 = new Notice(1, "欢迎学习Java!", "管理员", new Date());
		Notice not2 = new Notice(2, "请按时提交作业!", "老师", new Date());
		Notice not3 = new Notice(3, "考勤通知!", "老师", new Date());

		// 添加公告
		ArrayList noticeList = new ArrayList();
		noticeList.add(not1);
		noticeList.add(not2);
		noticeList.add(not3);

		// 显示公告
		System.out.println("公告内容为:");
		for (int i = 0; i < noticeList.size(); i++) 
			// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法
			System.out.println((i + 1) + "    " + ((Notice) (noticeList.get(i))).getTitle());

		
		System.out.println();

		// 在第一条公告后添加新公告
		Notice not4 = new Notice(4, "在线编辑器可以使用了", "管理员", new Date());
		noticeList.add(1, not4);

		// 删除按时完成作业的公告
		noticeList.remove(2);
		
		// 显示公告
		System.out.println("修改后公告内容为:");
		for (int i = 0; i < noticeList.size(); i++) 
			// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法
			System.out.println((i + 1) + "    " + ((Notice) (noticeList.get(i))).getTitle());

		
		System.out.println();
		
		//将第二条公告改为:Java在线编辑器可以使用了!
		not4.setTitle("Java在线编辑器可以使用了");

		// 显示公告
		System.out.println("修改后公告内容为:");
		for (int i = 0; i < noticeList.size(); i++) 
			// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法
			System.out.println((i + 1) + "    " + ((Notice) (noticeList.get(i))).getTitle());

		
		System.out.println();
	




输出:

公告内容为:
1    欢迎学习Java!
2    请按时提交作业!
3    考勤通知!

修改后公告内容为:
1    欢迎学习Java!
2    在线编辑器可以使用了
3    考勤通知!

修改后公告内容为:
1    欢迎学习Java!
2    Java在线编辑器可以使用了
3    考勤通知!

Set概述

  • Set是元素无序且不可重复的集合,称为
  • HashSet:是Set的一个重要实现类,称为哈希集,具有良好的存取和查找性能,底层是HashMap

案例:在Set中操作String

用HashSet存储多个表示颜色的英文单词,并输出。

关于迭代器 Iterator

  • Iterator接口可以以统一的方式对各种集合元素进行遍历
  • 有两个重要的方法:HasNext()next()
  • HasNext():检测集合中是否还有下一个元素
  • next():返回集合中的下一个元素

由样例可见:set的插入是无序的,且不可重复。

public class SetDemo1 

	public static void main(String[] args) 
		// 将英文单词添加到HashSet中
		Set set = new HashSet();

		// 向集合中添加元素
		set.add("blue");
		set.add("red");
		set.add("black");
		set.add("yellow");
		set.add("whilte");

		// 显示输出
		System.out.println("集合中的元素为:");
		Iterator it = set.iterator();
		while (it.hasNext()) 
			System.out.print(it.next() + " ");
		
		System.out.println();

		// 在集合中插入新的单词
		set.add("green");

		// 再显示输出
		System.out.println("插入元素后集合中的元素为:");
		it = set.iterator();
		while (it.hasNext()) 
			System.out.print(it.next() + " ");
		
		System.out.println();

		// 重复插入
		set.add("green");
		// 再显示输出
		System.out.println("插入重复元素后的集合中的元素为:");
		it = set.iterator();
		while (it.hasNext()) 
			System.out.print(it.next() + " ");
		

		// 插入失败,但是不会报错

	



输出:

集合中的元素为:
red blue black yellow whilte 
插入元素后集合中的元素为:
red green blue black yellow whilte 
插入重复元素后的集合中的元素为:
red green blue black yellow whilte 

案例:宠物猫信息管理——在HashSet中对自定义对象的操作

需求:

  • 添加和显示宠物猫的信息
  • 查找某只宠物猫的信息并输出
  • 修改宠物猫的信息
  • 删除宠物猫的信息

即:增删查改。

宠物猫属性:

  • 名字 name
  • 年龄 month
  • 品种 species

宠物猫方法:

  • 构造方法
  • Getter Setter 方法
  • 其他方法

重写toStringhashCodeequals方法可以这样:


没有重写hashCodeequals方法的情况:

宠物猫类:

public class Cat 
	private String name;// 名字
	private int month;// 年龄
	private String species;// 品种

	public Cat(String name, int month, String species) 
		super();
		this.name = name;
		this.month = month;
		this.species = species;
	

	public String getName() 
		return name;
	

	public void setName(String name) 
		this.name = name;
	

	public int getMonth() 
		return month;
	

	public void setMonth(int month) 
		this.month = month;
	

	public String getSpecies() 
		return species;
	

	public void setSpecies(String species) 
		this.species = species;
	

	// 重写toString方法
	@Override
	public String toString() 
		return "[姓名=" + name + ", 年龄=" + month + ", 品种=" + species + "]";
	




测试类:

public class CatTest 

	public static void main(String[] args) 
		// 定义宠物猫对象
		Cat cat1 = new Cat("花花", 1, "狸花");
		Cat cat2 = new Cat("草草", 2, "英短");

		// 将宠物猫对象放到HashSet中
		Set set = new HashSet();
		set.add(cat1);
		set.add(cat2);

		// 显示
		System.out.println("显示输出:");
		Iterator it = set.iterator();
		while (it.hasNext()) 
			System.out.println(((Cat) (it.next())).toString());
		
		System.out.println();

		// 添加重复数据
		Cat cat3 = new Cat("花花", 1, "狸花");
		set.add(cat3);

		// 显示
		System.out.println("插入重复的猫后显示输出:");
		it = set.iterator();
		while (it.hasNext()) 
			System.out.println(((Cat) (it.next())).toString());
		
		System.out.println();
		
		//发现插入成功
	


输出:插入成功

显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]

插入重复的猫后显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]

重写了hashCodeequals方法的情况:

// 重写HashCode
	@Override
	public int hashCode() 
		return Objects.hash(month, name, species);
	

// 重写equals
	@Override
	public boolean equals(Object obj) 
		// 对象相等返回true
		if (this == obj)
			return true;

		// 比较内容
		if (obj.getClass() == Cat.class) 
			Cat cat = (Cat) obj;
			return cat.getName().equals(name) && cat.getMonth() == month && cat.getSpecies().equals(species);
		

		return false;
	

测试输出:插入失败

显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]

插入重复的猫后显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]

显然,重写后的才符合HashSet的要求。


测试类添加代码如下:

// 在集合中查找草草的信息并输出
		// 通过对象查找
		if (set.contains(cat2)) 
			System.out.println("草草找到了!");
			System.out.println(cat2);
		 else 
			System.out.println("草草没找到!");
		

		// 通过名字查找
		it = set.iterator();
		boolean flag = false;
		Cat temp;
		while (it.hasNext()) 
			temp = (Cat) (itJava开发从零开始!java游戏服务器开发教程

Java从零开始学习——Java基础

Java从零开始学习——Java基础

从零开始的Java开发1-2-4 Java方法

Java开发从零开始!腾讯T3团队整理

从零开始的Java开发1-4-1 Java继承:Object类final关键字注解