Java学习之集合(三)

###17.01_集合框架(HashSet存储字符串并遍历)(掌握)

  • A:Set集合的特点(无序、不重复)
    *与之相对的List是可以重复的(查看API即可)

    B:案例演示

    • HashSet存储字符串并遍历
        HashSet<String> hs = new HashSet<>();		//创建HashSet对象
		boolean b1 = hs.add("a");
		boolean b2 = hs.add("a");   //当向set集合中存储重复元素的时候返回为false
		hs.add("b");
		hs.add("c");
		hs.add("d");
		System.out.println(hs);			//HashSet的继承体系中有重写toString方法
		System.out.println(b1);
		System.out.println(b2);
		
		for (String string : hs){
      //只要能用迭代器迭代的,就可以使用增强for循环遍历
			System.out.println(string);
		}

###17.02_集合框架(HashSet存储自定义对象元素保证元素的唯一性)(掌握)

  • A:案例演示
    HashSet hs = new HashSet<>();
    hs.add(new Person(“张三”, 23));
    hs.add(new Person(“张三”, 23));
    hs.add(new Person(“李四”, 24));
    hs.add(new Person(“李四”, 24));
    hs.add(new Person(“李四”, 24));
    hs.add(new Person(“李四”, 24));

  • 重写equals()方法 和 hashCode()方法//自动生成Ctrl+Shift+s
    @Opublic int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((age == null) ? 0 : age.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
    }

  • 为什么是31?
    1> 31是一个质数,质数是能被1和自己本身整除的数
    2> 31这个数既不大也不小
    3> 31这个数好算,2的五次方-1,2向左移动5位

总结:
在添加的时候会调用add方法触发hashCode(),根据hashcode的返回值再确定是否调用 equals方法
1> 如果hashcode()返回值相同 就会调用equals方法
2> 不同则不会调用equals方法

###17.03_集合框架(HashSet存储自定义对象元素保证元素的唯一性图解以及优化)(掌握)

  • A:画图演示
    • 画图演示比较过程
  • B:代码优化
    • 为了减少比较优化hashCode()代码
    • 最终版就是自动生成

###17.04_集合框架(HashSet如何保证元素的唯一性原理)(掌握)

  • 1:Hash原理

  • 我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()方法去比较,效率较低,哈希算法提高了去重复的效率,降低了equals()方法的次数

  • 当HashSet调用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象
    * 如果没有有哈希值相同的对象直接存入

  • 如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入,true则不存

  • 2:将自定义类对象存入hashSet去重复

    • 类中重写hashCode()和equals()方法
    • hashCode()属性相同对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
    • equals() 属性相同返回true,属性不相同返回false,返回false的时候存储

###17.05_集合框架(用LinkedHashSet的概述和使用)

  • A:LinkedHashSet的特点
  • B:案例演示
    • LinkedHashSet的特点
      • 可以保证怎么存怎么取

###17.06_集合框架(练习-产生10个 1-20之间的随机数要求不重复)(掌握)

  • A:案例演示
  • 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。
  • 分析:
    1.用Random类创建随机数对象。
    2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合。
    3.如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储。
    4.通过Random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存储在HashSet集合中。
    5.遍历HashSet
    //1.用Random类创建随机数对象
	Random r = new Random();
	//2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合
	HashSet<Integer> hs = new HashSet<>();
	//3.如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储
	while(hs.size() < 10) {
	/*4.通过Random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存储在HashSet集合中*/
		hs.add(r.nextInt(20) + 1);
	}
	// 5.遍历HashSet
	for (Integer integer : hs) {
		System.out.println(integer);
	}

###17.07_集合框架(练习-使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符)(掌握)

  • A:使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
  • B:步骤
    分析:
    1.创建Scanner对象
    2.创建HashSet对象,将字符存储,去掉重复
    3.将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
    4.遍历HashSet,打印每一个字符
  • C:代码
        //1.创建Scanner对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一行字符串:");
		//2.创建HashSet对象,将字符存储,去掉重复
		HashSet<Character> hs = new HashSet<>();
        //3.将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
		String line = sc.nextLine();
		char[] arr = line.toCharArray();
		
		for (char c : arr) {							//遍历字符数组
			hs.add(c);
		}
		
		//4.遍历HashSet,打印每一个字符
		
		for(Character ch : hs) {
			System.out.print(ch);
		}

###17.08_集合框架(练习-将List集合中的重复元素去掉)

  • A:需求:将集合中的重复元素去掉
  • B:分析:
    * 1.创建List集合存储若干个重复元素
    * 2.单独定义方法去除重复
    * 3.打印一下List集合
  • C:代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class Test04 {
	public static void main(String[] args) {
		String[] s = {"aa","bb","aa","cc"};
		List<String> asList = Arrays.asList(s);
		//1.创建List集合存储若干个重复元素
		List<String> list = new ArrayList<>(asList);
		//2.单独定义方法去除重复
		List<String> list1= delElement(list);
		//3.打印
		System.out.println(list1);
	}
	private static List<String> delElement(List<String> list) {
		// 创建 set
		HashSet<String> set = new HashSet<>();
		// 添加到set 去重复
		set.addAll(list);
		// 清空
		list.clear();
		list.addAll(set);
		return list;
	}
}

###17.09_集合框架(TreeSet存储Integer类型的元素并遍历)

  • A:案例演示
    • TreeSet存储Integer类型的元素并遍历

###17.10_集合框架((TreeSet存储自定义对象)

  • A:案例演示
    • 存储Person对象

###17.11_集合框架(TreeSet保证元素的唯一和自然排序的原理图解)

  • A:画图演示
    *TreeSet保证元素的唯一和自然排序的原理图解

###17.12_集合框架(TreeSet存储自定义对象并遍历练习)

  • A:案例演示
  • TreeSet存储自定义对象并遍历 - (按照姓名排序)

###17.13_集合框架(TreeSet存储自定义对象并遍历练习)

  • A:案例演示
  • TreeSet存储自定义对象并遍历 - (按照姓名长度排序)

###17.14_集合框架((TreeSet保证元素的唯一和比较器排序的原理以及代码实现)

  • A:案例演示
  • TreeSet保证元素的唯一和比较器排序的原理以及代码实现

###17.15_集合框架(TreeSet原理)(掌握)

  • 1.特点
    • TreeSet是用来排序的,可以指定一个顺序,对象存入之后就会按照指定的顺序排列
  • 2.使用方式
    • a.自然排序
      TreeSet类的add()方法中会把存入的对象提升为Comparable类型
      调用对象的compareTo()方法和集合的对象比较
      根据compareTo()方法返回的结果进行存储
    • b.比较器比较(Comparator)
      创建TreeSet的时候可以制定一个Comparator
      如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序
      add()方法内部会自动调用Comparator接口中的compare()方法排序
    • c.区别
      TreeSet构造函数什么都不传。默认是按照Comparable的顺序,没有就报错
      TreeSet如果传入Comparator,就会按照Comparator的进行排序

###17.16_集合框架(练习)

  • 在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复

  • 分析:

  • 1.定义一个List集合,并存储重复的无序的字符串

  • 2.定义方法对其排序保留重复

  • 3.打印List集合

###17.17_集合框架(练习)

  • 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloneudeu程序打印:deeehllnouu
  • 分析:
  • 1.键盘录入字符串,Scanner
  • 2.将字符串转换为字符数组
  • 3.定义TreeSet集合,传入比较器对字符排序并保留重复
  • 4.遍历字符数组,将每一个字符存储在TreeSet集合中
  • 5.遍历TreeSet集合,打印每一个字符

###16.18_集合框架(练习)

  • 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
  • 1.创建Scanner对象,键盘录入
  • 2.创建TreeSet集合对象,TreeSet集合中传入比较器
  • 3.无限循环不断接收整数,遇到quit退出,因为退出是quit,所以键盘录入的时候应该都以字符串的形式录入
  • 4.判断是quit就退出,不是将其转换为Integer,并添加到集合中
  • 5.遍历TreeSet集合并打印每一个元素
发布了29 篇原创文章 · 获赞 11 · 访问量 3970

猜你喜欢

转载自blog.csdn.net/weixin_41462017/article/details/86582894