public class List{
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
// list集合可以存储重复元素
System.out.println(list);
System.out.println("-----------------------------------");
// list集合在指定位置添加元素
list.add(2,"nana");
System.out.println(list);
System.out.println("-----------------------------------");
/*// remove方法
String s1 = list.remove(3);
System.out.println(s1);
System.out.println(list);
System.out.println("-----------------------------------");*/
// set方法
list.set(2,"yoyo");
// get方法
String s = list.get(2);
System.out.println(s);
System.out.println(list);
System.out.println("-----------------------------------");
// 遍历list集合,三种方式
// 普通for循环
for(int i=0;i<list.size();i++){
String s2 = list.get(i);
System.out.println(s2);
}
System.out.println("-----------------------------------");
// 增强for循环
for (String a : list) {
System.out.println(a);
}
System.out.println("-----------------------------------");
// 迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
String next = it.next();
System.out.println(next);
}
}
}
1、List集合的特点:继承了Collection接口;有序的集合,存储和取出的顺序是一样的;有索引;与set不同,允许存储重复的元素。
操作索引时候,一定要注意防止索引越界异常。
2、set:不允许存储重复的元素,没有索引,没有带索引的方法,也不能使用普通的for循环遍历,可以用迭代器遍历和增强for循环;
3、Hashset:底层是一个哈希表结构(查询的速度非常的快),无序集合(存储元素和取出元素的顺序有可能不一致),不是同步的(多线程)
存储数据的结构:哈希表
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是实际存储的物理地址)
在Object类中有一个方法,可以获取对象的哈希值。hashcode()返回对象的哈希码值,就是一个整数
数组结构:把元素进行了分组(相同哈希值的元素是一组),链表/红黑树结构把相同哈希值的元素连在一起。
两个元素不同,但是相同哈希值,叫做哈希冲突。
jdk1.8之前,哈希表是数组+链表。jdk1.8之后,哈希表=数组+红黑树/链表(提高查询的速度),如果链表长度超过了8位,就转换成红黑树。
4、set集合不允许存储重复元素的原理:set集合在调用add方法时,会调用元素的hashcode方法,计算哈希值。和equals方法,判断元素是否重复。
Hashset存储自定义类型元素,如果想做到元素唯一,必须要重写hashcode方法和equals方法。
5、sort方法使用的前提:被排序的集合里边存储的元素,必须实现comparable,重写接口中的方法compareto定义排序的规则。并且接口的排序规则,如果是自己(this)减去参数就是升序,反之亦然
还有一个compartor,二者的区别就是:comparable是自己(this)和别人(参数)比较,自己需要实现comparable接口,重写比较的规则compareto方法。comparator是相当于找一个第三方的裁判,比较两个。return o1-o2;就是升序(前减后)