文章目录
List 和 set 集合 重写了toString() 的方法,直接打印便可以查看元素。
自己经常理解的混乱的概念:
存取有序:
1. 存储元素的数据跟返回元素的数据一致。跟list集合一样
2. 输出的元素是以某种规则进行排序,返回的。(比如:从小到大)
慢慢的补
集合线程的安全性
集合的常见面试题
list集合的常见子类
set集合的常见子类
特点:
set集合:
1. 不允许存储重复的元素
2. 没有索引。
- HashSet
- linkHashSet
- treeSet
HashSet
特点:
1. 有set集合本身的特点,(无法存储相同的元素,无法通过索引进行获取元素,只能通过 迭代器 和增强for循环 获取元素 )
(不bb)上代码:
Set<String> link1 = new HashSet<>();
link1.add("www");
link1.add("abc");
link1.add("itcast");
System.out.println(link);
System.out.println("========================");
结果:
Set<Integer> set = new HashSet<>();
set.add(2);
set.add(1);
set.add(5);
set.add(4);
set.add(8);
System.out.println(set);
可以发现:
前提:泛型指定了的。不是Object类型
会根据存储的值,进行排序,输出的结果:就是排好顺序的结果
特点:
存储的顺序会和取出来的顺序可能不同。存的数据,本来就是按照从小到大的顺序,
那么,取出来的顺序就和存的顺序相同。
如果泛型是 自定义的对象呢?
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Person person = new Person("a_zhangsan",21);
Person person1 =new Person("b_lisi",31);
Person person2 = new Person("c_wangwu",41);
Person person3 = new Person("d_zhaoliu",51);
Set<Person> personSet = new HashSet<>();
personSet.add(person);
personSet.add(person1);
personSet.add(person2);
personSet.add(person3);
System.out.println(personSet);
存取的顺序,和取出来的顺序不同。
Person person = new Person("a_zhangsan",21);
Set<Object> personSet = new HashSet<>();
personSet.add(person);
personSet.add(123);
personSet.add("123hahah");
personSet.add(213.4);
System.out.println(personSet);
至于:为什么 泛型为Integer ,String 的时候,输出的结果是:有序的。
我认为是二者实现了 Comparable接口。 但是,在自定义的person类中,实现了 Comparable接口 ,但是却无法,有顺序的输出结果。(待解决,知道的大佬指明一下,谢谢)
hashset的底层是:数组+链表(哈希表) 链表长度为8,就会变成红黑树
原理是如何进行存放的,根据hashCode() , equals()方法进行比较的.
hashCode()没有重写之前,它的值就是看到的地址值
equals()没有重写之前,比较的就是地址值。
hashset特点总结
HashSet特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
linkHashset
存取有序
System.out.println("=====================");
Set<String> link = new LinkedHashSet<>();
link.add("www");
link.add("abc");
link.add("itcast");
System.out.println(link);
/*
link 和 set 集合中,重写了toString ()方法的。
*/
System.out.println("========================");
Set<String> link1 = new HashSet<>();
link1.add("www");
link1.add("abc");
link1.add("itcast");
System.out.println(link1);
System.out.println("========================");
底层原理:
哈希表+多个一个链表进行来记录拿取的顺序
linkHashSet特点
存取有序
treeSet
集合的数据类型是必须是一致的。
不一致的情况:
Person person = new Person("a_zhangsan",21);
Set<Object> personSet = new TreeSet<>();
personSet.add(person);
personSet.add(123);
personSet.add("123hahah");
personSet.add(213.4);
System.out.println(personSet);
System.out.println("========================");
一致的情况:
string类型实现了Comparable接口
Set<String> personSet = new TreeSet<>();
personSet.add("ccc");
personSet.add("aaa");
personSet.add("123");
personSet.add("213.4");
System.out.println(personSet);
自定义的类型:
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
Set<Object> personSet = new TreeSet<>();
Person p1 =new Person("a",30);
Person p2 =new Person("a",40);
Person p3 =new Person("a",50);
personSet.add(p1);
personSet.add(p2);
personSet.add(p3);
System.out.println(personSet);
System.out.println("========================");
实现了Comparable接口的Person
public class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age);//升序
}
}
Set<Object> personSet = new TreeSet<>();
Person p1 =new Person("a",30);
Person p2 =new Person("a",40);
Person p3 =new Person("a",50);
personSet.add(p1);
personSet.add(p2);
personSet.add(p3);
System.out.println(personSet);
System.out.println("========================");
说明了:
使用TreeSet集合:
必须是相同的数据类型,返回的结果是按照某种规则排序的。
另一个情况:
Set<Object> personSet = new TreeSet<>();
Person p1 =new Person("a",20);
Person p2 =new Person("b",20);
Person p3 =new Person("c",20);
personSet.add(p1);
personSet.add(p2);
personSet.add(p3);
System.out.println(personSet);
结果只有一个。
说明了是根据 Comparable 接口中的 compareTo方法 来进行判断是否元素相同。返回0,代表元素相同。不进行存储。符合了set的规则。
treeSet集合特点总结
1. 数据类型必须是一致的。
2. 读取的结果,是按照一定的规则进行排序的输出的。
3. 没有定义规则,会报错的。
其他的后面补