发表于: 2019-11-17 20:23:42

1 1062


基础学习集合框架

集合框架(HashSet存储字符串并遍历)
* A:设置集合概述及重点
*通过API查看即可
* B:案例
* HashSet存储字符串并遍历
  HashSet <String> hs =新的HashSet <>();
布尔值b1 = hs.add(“ a”);
布尔值b2 = hs.add(“ a”);  //当存储不成功的时候,返回false
System.out.println(b1);
System.out.println(b2);
for(String s:hs){
System.out.println(s);
}

import java.util.HashSet;

import com.heiam.bean.Person;

public class Demo1_HashSet {

public static void main(String[] args) {

demo1();

}

public static void demo1() {

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);

}

}

}

集合框架(HashSet存储自定义对象保证元素唯一性)

* 重写hashCode()和equals()方法
注意:当没有在Person类中重写hashCode()方法和equals()方法时,则运行结果会出现相同的信息,因为HashSet虽然会保证元素不可重复,但是依据hashCode()方法和equals()方法,因为Person类中未重写这两个方法,但是会使用Person类中从Object类里继承的hashCode()和equals(),然而Object中的hashCode()比较的是对象的地址,而每new出一个对象地址总是不同的,所以会出现相同的元素.

集合框架(HashSet如何保证元素唯一性的原理)
* 1.HashSet原理
* 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
* 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
* 如果没有哈希值相同的对象就直接存入集合
* 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
* 2.将自定义类的对象存入HashSet去重复
* 类中必须重写hashCode()和equals()方法
* hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
* equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储
----(String重写了EQUALS)----

/*@Override

public boolean equals(Object obj) {

System.out.println("执行了吗");

Person p = (Person)obj;

return this.name.equals(p.name) && this.age == p.age;

}

@Override

public int hashCode() {

//40+23  39+24

//return name.hashCode()+age;

final int NUM = 38;

return name.hashCode() * NUM + age;

}*/

//IDE帮我们自动生成的hashCode和equals方法如下,

/*

* 为什么是31?

* 1,31是一个质数,质数是能被1和自己本身整除的数

* 2,31这个数既不大也不小

* 3,31这个数好算,2的五次方-1,2向左移动5位

*/

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj) //调用的对象和传入的对象是同一个对象

return true; //直接返回true

if (obj == null) //传入的对象为null

return false; //返回false

if (getClass() != obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码

return false; //如果不是直接返回false

Person other = (Person) obj; //向下转型

if (age != other.age) //调用对象的年龄不等于传入对象的年龄

return false; //返回false

if (name == null) { //调用对象的姓名为null

if (other.name != null) //传入对象的姓名不为null

return false; //返回false

} else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名

return false; //返回false

return true; //返回true

}

LinkedHashSet的特点
* 可以保证怎么存就怎么取

需求:编写一个程序,获取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

*/

public static void main(String[] args) {

//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);

}

}

**

* * 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

* aaaabbbcccddd

* 分析:

* 1,创建Scanner对象

* 2,创建HashSet对象,将字符存储,去掉重复

* 3,将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复

* 4,遍历HashSet,打印每一个字符

*/

public static void main(String[] args) {

//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);

}

}

画图演示
* TreeSet保证元素唯一和自然排序的原理和图解,小的放左侧,大的放右侧

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

小的总结

 1.List
* a.普通for循环, 使用get()逐个获取
* b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
* c.增强for循环, 只要可以使用Iterator的类都可以用--------因为增强for循环的底层是用iterator实现的------
* d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
* 2.Set
* a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
* b.增强for循环, 只要可以使用Iterator的类都可以用
* 3.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除 -------增强FOR和迭代不可以,但是可以调用迭代然后过程中删除--------

明天计划 继续把基础没过完的过了  进入任务二 没有遇到特别的坑 

收获  复习了基础集合 感觉思路清晰了许多


返回列表 返回列表
评论

    分享到