集合
Set集合
可以存储任意对象类型的数据 包括null。
无序(存储时的顺序跟遍历时的顺序不一定一样)
数据不能重复(自动去重)
数据结构跟List不同,没有下标
查找慢,插入删除快。(插入和删除不会引起元素位置改变。红黑二叉树)
使用hashset
HashSet asdc = new HashSet();
asdc.add('s');
asdc.add("dscsd");
Iterator iterator = asdc.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
for (Object o : asdc) {
System.out.println(o);
}
System.out.println();
常用方法
迭代器
iterator HashSet类中没有提供根据集合索引获取索引对应的值的⽅法, 因此遍历HashSet时需要使⽤Iterator迭代器。Iterator的主要⽅法如下
HashSet的底层就是HashMap
Set中元素不可以重复,是无序的(这里无序是指存入元素的先后顺序与输出元素的先后顺序不一致)HashSet:内部的数据结构是哈希表,是线程不安全的。HashSet 中保证集合中元素是唯一的方法:通过对象的hashCode和equals方法来完成对象唯一性的判断。
TreeSet
实现原理:TreeSet 基于 TreeMap 实现,需要实现比较器基本数据类型 按照默认的排序 。和String类中重写了compareTo()方法定义了字符排序的规则。默认按照元素的自然顺序进行排序,必须实现Comparable接口
有序
无重复
添加、删除元素、判断元素是否存在,效率比较高
TreeSet:可以对Set集合中的元素进行排序,是线程不安全的。
TreeSet中判断元素唯一性的方法是:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。
TreeSet对元素进行排序的方式:如果是基本数据类型和String类型,无需其它操作,可以直接进行排序。对象类型元素排序1,需要实现Comparable接口,并覆盖其compareTo方法。并按照方法中的定义的规则排序
package ClassTestletter;
import java.util.List;
import java.util.TreeSet;
public class Person implements Comparable<Person> {
String name;
int age;
private List<Person> friend;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Person> getFriend() {
return friend;
}
public void setFriend(List<Person> friend) {
this.friend = friend;
}
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(List<Person> friend) {
this.friend = friend;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", friend=" + friend +
'}';
}
public static void main(String[] args){
Person person = new Person();
person.setName("张三");
Person person1 = new Person();
person1.setName("张四");
person1.setAge(25);
Person person2 = new Person();
person2.setName("张四1");
person2.setAge(21);
Person person3 = new Person();
person3.setName("张四2");
person3.setAge(22);
TreeSet tr = new TreeSet<>();
tr.add(person1);
tr.add(person2);
tr.add(person3);
for (Object o : tr) {
System.out.println(o);
}
}
@Override
public int compareTo(Person o) {
if (age == o.age){
return 0;
}else if (age > o.age){
return 1;
}
return -1;
}
}
HashSet 去重,无序 取值 添加值
Map
HashMap
存取方式是 key-value形式Key和value都可以是任意对象类型。Key不能重复,value可以重复,可以为null。HashMap是无序的。如果put重复的key,后⾯的覆盖前⾯的。
HashMap创建和使用
containsKey(“key”)获取map中是否包含某个key。containsValue(“value”)判断map中是否包含某个value。 增 :put() 方法
删 :remove() 方法
改 :map.put(“key”,“value”) 直接修改
遍历: map.keySet():
获取所有keySet集合 通过遍历keySet集合得到单个的key,然后使用map.get(key)方法得出需要的value。
map.entrySet():直接遍历map.entrySet()方法得到的set集合,得到entrySet映射关系key=value,通过entry.getKey() 和entry.getValue() 来取出对应的key和value。
package Map01;
import java.util.*;
public class HashMap001 {
public static void main(String[] args){
HashMap<Object, Object> map = new HashMap<>();
ArrayList<String> objects = new ArrayList<>();
objects.add("sdc");
objects.add("sdc");
HashSet<Object> objects1 = new HashSet<>();
objects1.add(objects);
Iterator<Object> iterator = objects1.iterator();
System.out.println(iterator.next());
map.put("name","dscsd");
map.put("age", 18);
map.put("height",179);
map.get("name");
Set a = map.keySet();
for (Object o : a) {
System.out.println(o +" "+ map.get(o));
}
Set<Map.Entry<Object, Object>> entries = map.entrySet();
for (Map.Entry<Object, Object> entry : entries) {
System.out.println(entry.getKey()+""+entry.getValue());
}
}
}
HashMap底层原理
HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。
HashTable
线程同步,锁定所有数据,键和值都不能为null;