第11章_Java集合

目录

前言

数据结构-Java

数据结构知识结构框架图

Java基础知识图解

 1 Java集合框架概述

集合的使用场景

 1.1 Java 集合框架概述:集合的使用场景

Java 集合框架概述:Collection接口继承树

 Java 集合框架概述:Map接口继承树

 2 Collection接口方法

 3 Iterator迭代器接口

 4 Collection子接口之一: List接口

 5 Collection子接口之二: Set接口

 6 Map接口

 HashMap的存储结构:JDK 1.8之前

 HashMap的存储结构:JDK 1.8

 面试题:

 Map实现类之二:LinkedHashMap

Map实现类之三:TreeMap

 Map实现类之四:Hashtable

 Map实现类之五:Properties

 7 Collections工具类

 补充:Enumeration

 练 习

 实验:TreeSet的自然排序与定制排序

请把学生名与考试分数录入到Set中,并按分数显示前三名成绩学员的名字.怎么用Set实现?

章节练习题及面试题

Collection 和 Collections的区别

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

List, Set, Map是否继承自Collection接口

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

说出ArrayList,Vector, LinkedList的存储性能和特性

HashMap和Hashtable的区别

ArrayList和Vector的区别

你所知道的集合类都有哪些?主要方法?

定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

创建Set接口的实现类,添加10个以上的元素,通过Iterator遍历此集合元素。

创建Set接口的实现类,添加10个以上的元素,通过foreach遍历此集合元素。

创建Set接口的实现类,添加10个以上的元素,要求能够排序。

创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了;如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变

定义一个Collection接口类型的变量,引用一个List集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

创建ArrayList实例化对象,添加10个以上的元素,在2号位插入一个元素,获得5号位元素,删除6号位元素,修改7号位的元素;

通过四种方法遍历上题中的集合

创建LinkedList实例化对象,练习具有队列特点的方法

按要求实现下列问题:

定义一个Map接口类型的变量,引用一个实现类,添加键值对,判断集合中是否包含某一key值,通过某一key值得到value值,通过某一key删除键值对,把另一个map集合添加到此map集合,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

通过两种方法遍历上题中的map集合

使用Map接口的实现类完成员工工资(姓名--工资)的摸拟:

1)添加几条信息

2)列出所有的员工姓名

3列出所有员工姓名及其工资

4)删除名叫“Tom”的员工信息

5)输出Jack的工资,并将其工资加1000元(通过取值实现)

6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)

创建有序的map集合的实例化对象,添加元素,查看排序结果

封装一个新闻类,包含标题、作者、新闻内容和发布时间,新闻标题如下:

使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资,存入数据如下:

创建一个List集合的对象,添加几个数字,反转对象中元素的顺序;根据元素的自然顺序排序;

创建一个List集合的对象,添加几个字符串,反转对象中元素的顺序;根据元素的自然顺序排序;

创建一个List集合的对象,添加几条数据,将1号位和2号位交换;获得最大值,最小值,

叙述主要集合实现类的遍历方法

按要求完成如下操作

按要求完成如下操作

按要求完成如下操作

以下代码的运行结果?


前言

数据结构-Java

数据结构知识结构框架图

Java基础知识图解

 1 Java集合框架概述

集合的使用场景

 

 

 1.1 Java 集合框架概述:集合的使用场景

 

Java 集合框架概述:Collection接口继承树

 Java 集合框架概述:Map接口继承树

 

 2 Collection接口方法

 

 

 3 Iterator迭代器接口

 

 

 

 4 Collection子接口之一: List接口

 

 

 

 

 

 

 5 Collection子接口之二: Set接口

 

 

 

 

 

 

 

 

 

 

 

 

 

 6 Map接口

 

 

 

 

 

 

 

 

 HashMap的存储结构:JDK 1.8之前

 

 HashMap的存储结构:JDK 1.8

 

 

 

 面试题:

谈谈你对HashMap中put/get方法的认识?如果了解再谈谈 HashMap的扩容机制?默认大小是多少?什么是负载因子( 或填充比)?什么是吞吐临界值(或阈值、threshold)?

 Map实现类之二:LinkedHashMap

 

Map实现类之三:TreeMap

 Map实现类之四:Hashtable

 Map实现类之五:Properties

 7 Collections工具类

                                                     

 

 

 补充:Enumeration

 

 练 习

 

 

 实验:TreeSet的自然排序与定制排序

1. 定义一个 Employee 类。

该类包含:private 成员变量 name,age,birthday,其中 birthday 为 MyDate 类的对象;

并为每一个属性定义 getter, setter 方法;

并重写 toString 方法输出 name, age, birthday

MyDate 类包含: private 成员变量 year,month,day;并为每一个属性定义 getter, setter 方法;

创建该类的 5 个对象,并把这些对象放入 TreeSet 集合中(下一章: TreeSet 需使用泛型来定义)

分别按以下两种方式对集合中的元素进行排序,并遍历输出:

1). 使 Employee 实现 Comparable 接口,并按 name 排序

2). 创建 TreeSet 时传入 Comparator 对象,按生日日期的先后排序

请把学生名与考试分数录入到Set中,并按分数显示前三名成绩学员的名字.怎么用Set实现?

/*
 * 请把学生名与考试分数录入到Set中,并按分数显示前三名成绩学员的名字.怎么用Set实现?
 */
import java.util.TreeSet;
import java.util.Scanner;
import org.junit.Test;


public class ScoreTest {
	private Scanner scanner;

	@Test
	public void test1() {
		scanner = new Scanner(System.in);
		TreeSet<Student> treeSet = new TreeSet<>();
		System.out.println("请输入学生的姓名和成绩,当输入为负数时结束输入");
		for (int i = 1;; i++) {
			int score = 0;
			System.out.println("请输入第" + i + "位学生的姓名:");
			String name = scanner.next();
			System.out.println("请输入第" + i + "位学生的成绩:(输入负数,结束录入)");
			try {
				score = scanner.nextInt();
			} catch (ClassCastException e) {
				// TODO: handle exception
				System.out.println("您输入的分数有误");
			}

			if (score < 0) {
				break;
			} else {
				treeSet.add(new Student(name, score));
			}

		}
		System.out.println("您输入的成绩生成成绩单结果:");
		for (Student student : treeSet) {
			System.out.println(student.getName() + "--->" + student.getScore());
		}
		// 前三名学生的姓名
		System.out.println("前三名学生的姓名为:");
		int count = 0;
		for (Student student : treeSet) {
			if (count == 3) {
				break;
			} else {
				System.out.println(student.getName() + "--->"
						+ student.getScore());
				count++;
			}

		}
	}
}

class Student implements Comparable<Student> {
	private String name;
	private int score;

	public Student(String name, int score) {
		super();
		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 int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + score;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (score != other.score)
			return false;
		return true;
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		int num = o.score - score;
		if (num != 0) {
			return num;
		} else {
			return this.name.compareTo(o.name);
		}
	}

}

章节练习题及面试题

Collection 和 Collections的区别

答:Collection是集合类的上级接口,继承于他的接口主要有Set 和List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

答:Set里的元素是不能重复的,用equals()方法判读两个Set是否相等

    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值

List, Set, Map是否继承自Collection接口

答: List,Set是,Map不是

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

答:不对,有相同的hash code

说出ArrayList,Vector, LinkedList的存储性能和特性

答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

HashMap和Hashtable的区别

答:

1.HashMap与Hashtable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

2. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

3.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

4.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

5.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

ArrayList和Vector的区别

答:就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

你所知道的集合类都有哪些?主要方法?

答:最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

创建Set接口的实现类,添加10个以上的元素,通过Iterator遍历此集合元素。

创建Set接口的实现类,添加10个以上的元素,通过foreach遍历此集合元素。

创建Set接口的实现类,添加10个以上的元素,要求能够排序。

创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了;如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变

定义一个Collection接口类型的变量,引用一个List集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

创建ArrayList实例化对象,添加10个以上的元素,在2号位插入一个元素,获得5号位元素,删除6号位元素,修改7号位的元素;

通过四种方法遍历上题中的集合

创建LinkedList实例化对象,练习具有队列特点的方法

按要求实现下列问题:

1)封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题;(10分)

2)只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:

新闻一:中国多地遭雾霾笼罩空气质量再成热议话题

新闻二:春节临近北京“卖房热”

3)将新闻对象添加到ArrayList集合中,并且使用ListIterator倒序遍历;

4)在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前14个,然后在后边加“…”

5)在控制台打印遍历出经过处理的新闻标题;

定义一个Map接口类型的变量,引用一个实现类,添加键值对,判断集合中是否包含某一key值,通过某一key值得到value值,通过某一key删除键值对,把另一个map集合添加到此map集合,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

通过两种方法遍历上题中的map集合

使用Map接口的实现类完成员工工资(姓名--工资)的摸拟:

1)添加几条信息

2)列出所有的员工姓名

3列出所有员工姓名及其工资

4)删除名叫“Tom”的员工信息

5)输出Jack的工资,并将其工资加1000元(通过取值实现)

6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)

创建有序的map集合的实例化对象,添加元素,查看排序结果

封装一个新闻类,包含标题、作者、新闻内容和发布时间,新闻标题如下:

新闻一:中国多地遭雾霾笼罩空气质量再成热议话题

新闻二:民进党台北举行“火大游行”

新闻三:春节临近北京“卖房热”

新闻四:春节临近北京“卖房热”

完成如下要求(共50分,每小题10分):

1)完成对新闻类的设计,要求在初始化新闻类对象时 ,通过构造传参的形式对新闻标题赋值,并要求实例化四个对象,标题内容如题。

2)要求打印新闻对象时,直接打印新闻标题;

3)要求使用equals方法比较新闻时,只要标题相同,就认为是同一新闻,请输出新闻一与新闻二的比较结果,新闻三与新闻四的比较结果。

4)将新闻对象存入HashSet集合中,并且遍历集合,打印新闻类对象;

5)打印集合中新闻数量。

使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资,存入数据如下:

张三——800元;李四——1500元;王五——3000元;

1)将张三的工资更改为2600元

2)为所有员工工资加薪100元;

3)遍历集合中所有的员工

4)遍历集合中所有的工资

创建一个List集合的对象,添加几个数字,反转对象中元素的顺序;根据元素的自然顺序排序;

创建一个List集合的对象,添加几个字符串,反转对象中元素的顺序;根据元素的自然顺序排序;

创建一个List集合的对象,添加几条数据,将1号位和2号位交换;获得最大值,最小值,

叙述主要集合实现类的遍历方法

按要求完成如下操作

  1. 生成10个随机数,值在100到200之间;
  2. 将这十个数存入HashSet集合中(有可能集合的长度小于10)。
  3. 将这个HashSet集合转换成ArrayList集合
  4. 重新为ArrayList集合排序,按照从小到大的顺序;
  5. 使用foreach遍历集合;

按要求完成如下操作

1 )封装一个汽车类,包含String  name、int  speed属性,在测试类中实例化三个对象:c1,c2,c3,分别设置name为:“奥拓”,“宝马”,“奔驰”,速度分别设置为:100,200,300

2 )使用Map集合对象m1将这三个汽车类对象保存成key,然后将int型的汽车价钱作为值保存在m1的value中,上述三款汽车分别对应的价钱是10000,500000,2000000

3 )遍历m1的键,打印name属性

4 )通过合适的方法,求出m1中“宝马”的价格,并打印结果;

5 )经过折旧,所有汽车都降价到原来的80%,请打印降价后“宝马”的价格

按要求完成如下操作

1 ) 要求集合对象c1中,只能添加字符串形式的单个元素,元素可以重复,在测试类中为c1集合添加字符串“这是一个可以重复的集合”三遍,然后遍历打印结果。

2 )要求集合对象c2中只能添加整型数值,并且不可重复,按自然顺序排序。要求遍历集合对象,打印添加进1,2,3,4,5五个数字的c2集合

3 )要求创建一个合适的Map集合对象m1,它的键和值都只能是字符串,并且值可以是null,像map集合中添加三组字符串,其中一个只有键,值是空,遍历这个集合对象的键,并打印键。

4)想办法将m1中所有值为null都替换成一个字符串”这里是空值”

5)遍历m1的所有值。

以下代码的运行结果?

    public static void main(String[] args) {

       Integer[] datas = {1,2,3,4,5};

       List<Integer> list = Arrays.asList(datas);

       list.add(5);

       System.out.println(list.size());

    }

运行异常,不允许添加元素

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EthanMilk

你的鼓励是我创作的最大动力谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值