collection下的另一个集合接口set
它的hashset集合特点:①无序②无下标③不可存储重复
如何判断存储元素是重复HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
set最重要的一点就是哈希表,也就是hashset的存储数据结构(哈希表)
除此之外,它的创建对象,常用方法,遍历和collection几乎一致,一个案例表明一下。但我们需要注意,它是没有下标的,所以做不到list集合那样怎么存怎么取,唯一能够判断的也就是哈希值了。
public static void main(String[] args) {
//创建hashset对象。string类型的继承set接口的hashset集合,进行存储
Set<String> set=new HashSet<String>();
//给hastset添加自定义对象
set.add("abc");
set.add("bcd");
set.add("abc");
//遍历
for(String s:set){
System.out.println(s);
}
}

这里应证了,set集合不能存储重复元素,顺序随心情而定。

它默认的长度是16,哈希值是0.75,也就是说,当一次new16个长度集合,我们在存储到12时就需要再创建一个新的。
但是为什么能通过hashcode直接判断元素重复呢,也就是哈希表是个啥东西呢?
概念上来讲
package com.oracle.demo5;
public class Demo02 {
public static void main(String[] args) {
//调取hashcod方法来写哈希值。哈希值是整形
int s1="abc".hashCode();
int s2="abc".hashCode();
int s3="bcd".hashCode();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
//当我们向hashset存元素时,add方法先去调用集合存储的类型的类中的hashcode方法元素的哈希值
//计算完哈希值,去容器中寻找是否有哈希值,
//如果没有直接将改元素存入集合,如果有,则调用该类型的equals方法比较内容,如果内容不同,将该元素存入集合。
//如果相同,则不存储该元素
}
}
得出数字发现96354是一样的,所以去掉。
它是如何判断的呢?
这里面有一个点就是如果哈希值一样,但是内容不同,通过equals方法比较不同后会仍然存入集合。如zzz
底层算法的流程,底层重写了hashcode方法,并将传进来的元素进行计算,得出数值。


以上是存储的集合中已经有的类,那么我们存储自定义类的时候,根据当时我们得知,自定义类系统是不给重写equals方法的,这里hashcode方法也不重写。
package com.oracle.demo5;
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//重写hashcode
/*public int hashCode(){
//return super.hashCode();
return name.hashCode()+age;
}*/
//重写hashcode
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age*31;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//重写equals
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
测试类:
package com.oracle.demo5;
//自定义类,需要重写equals方法和hashcode方法
import java.util.HashSet;
import java.util.Set;
public class Demo03 {
public static void main(String[] args) {
Set<Person> set=new HashSet<Person>();
//自定义类并没有重写hashcode和equals方法,需要我们自己重写
set.add(new Person("司南",18));
set.add(new Person("周戎",19));
set.add(new Person("司南",18));
//遍历
for(Person s:set){
System.out.println(s);
}
}
}

linkedlist
package com.oracle.demo5;
//LinkedHashSet与父类相比,只多了一个顺序是正常的
import java.util.LinkedHashSet;
public class Demo04 {
public static void main(String[] args) {
//创建int类型的LinkedHashSet集合
LinkedHashSet<Integer> set=new LinkedHashSet<Integer>();
set.add(1);
set.add(2);
//遍历
for(Integer s:set){
System.out.println(s);
}
}
}
输出顺序
1
2
顺序正常
ASCII码
| ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
|---|---|---|---|---|---|---|---|
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | / | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |