list集合
ArrayList集合
底层是数组
特点:
- 元素增删慢
- 查找块
- 日常在查找多的场景下使用
LinkedList集合
linkedList集合的特点:
底层是一个链表结构:查询慢,增删快
里面包含了大量操作首位元素的方法
linkedList集合的常用方法:
boolean add(E e)
将指定元素添加到此列表的结尾。
void add(int index, E element)
在此列表中指定的位置插入指定的元素
void addFirst(E e)
将指定元素插入此列表的开头。
void addLast(E e)
将指定元素添加到此列表的结尾。
void clear()
从此列表中移除所有元素。
E get(int index)
返回此列表中指定位置处的元素。
E getFirst()
返回此列表的第一个元素。
E getLast()
返回此列表的最后一个元素。
E pop()
从此列表所表示的堆栈处弹出一个元素。
void push(E e)
将元素推入此列表所表示的堆栈。
public static void main(String[] args) {
LinkedList<String> strings = new LinkedList<>();
strings.add("wang");
strings.add("xu");
strings.add("yang");
System.out.println(strings);
System.out.println("*******************");
/*
void add(int index, E element)
在此列表中指定的位置插入指定的元素
*/
System.out.println("在此列表中指定的位置插入指定的元素");
strings.add(1,"wang");
System.out.println(strings);
System.out.println("*******************");
/*
void addFirst(E e)
将指定元素插入此列表的开头。
void addLast(E e)
将指定元素添加到此列表的结尾。
*/
System.out.println("将指定元素插入此列表的开头");
strings.addFirst("开头");
System.out.println(strings);
System.out.println("将指定元素添加到此列表的结尾");
strings.addLast("结尾");
System.out.println(strings);
System.out.println("***********************");
/*
E getFirst()
返回此列表的第一个元素。
E getLast()
返回此列表的最后一个元素。
*/
System.out.println("返回此列表的第一个元素");
String first = strings.getFirst();
System.out.println(first);
System.out.println("返回此列表的最后一个元素");
System.out.println(strings.getLast());
System.out.println("***********************");
/*
E pop()
从此列表所表示的堆栈处弹出一个元素。
void push(E e)
将元素推入此列表所表示的堆栈。
*/
System.out.println("从此列表所表示的堆栈处弹出一个元素");
String pop = strings.pop();
System.out.println(pop);
System.out.println("将元素推入此列表所表示的堆栈");
strings.push("0000");
System.out.println(strings);
System.out.println("***********************");
}
Set集合
set集合的定义及特点
一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,
并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
set:
不允许有重复的值
没有索引,没有带索引的犯非法,也不能使用普通的for循环遍历
HashSet集合
HashSet集合的定义及特点
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;
特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
hashSet:
哈希表结构(查询速度快)
不允许存储重复的值
没有索引,没有带索引的方法
是一个无序的集合,存储的数据和取出的数据不一致
public static void main(String[] args) {
Set<String> set = new HashSet<>();
//添加方法
set.add("王");
set.add("旭");
set.add("阳");
set.add("王");
//迭代器遍历
Iterator<String> it = set.iterator();
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
System.out.println("*********************");
}
扩展:怎么将ArrayList转换成HashSet
/*
怎么将ArrayList转换成HashSet
*/
System.out.println("怎么将ArrayList转换成HashSet");
ArrayList<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(1);
for (Integer integer : integers) {
System.out.println(integer);
}
System.out.println("*********************");
HashSet<Integer> integers1 = new HashSet<>(integers);
for (Integer integer1 : integers1) {
System.out.println(integer1);
}
哈希值
定义:
是一个是十进制的整数,由系统随机给出(对象的地址值,是一个逻辑地址,是模拟出来得到的地址值,不是数据实际存储的物理地址)
方法:
在Object类有一个方法,可以获取对象的哈希值
int hashCode() //返回获取对象的哈希值
hashCode的源码
public native int hashCode();
native 调用的是本地操作系统的方法
public static void main(String[] args) {
Student s1 = new Student();
int i = s1.hashCode();
System.out.println(i);//460141958
Student s2 = new Student();
int i1 = s2.hashCode();
System.out.println(i1);//1163157884 十进制的整数
System.out.println(s2);//day0819.listDemo.Student@4554617c
/*
toString的源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
}
HashSet集合
HashSet集合的结构
jdk1.8 版本之前:哈希表 = 数组 + 链表
jdk1.8 版本之后:哈希表= 数组+ 链表/红黑数
哈希表的特点速度快
HashSet集合的存储过程
存储数据到集合中先计算元素的哈希值
有两个元素不同但是哈希值相同储存到一起
如果链表的长度超过了8位,那么就会把链表转换成红黑数(提高查询的速度)
Set集合存储不重复元素的原理
前提:存储的元素必须重写hashCode方法和equals方法
Set集合在调用add方法的时候,add方法会调用 hashCode方法和 equals方法,判断元素是否重复
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
String s1 = new String("abc");
String s2 = new String("abc");
set.add(s1);
set.add(s2);
set.add("重地");
set.add("通话");
set.add("abc");
System.out.println(set);//[重地, 通话, abc]
}
执行:
set.add(s1);
add 方法会调用hashCode方法,计算字符串"abc"的哈希值,哈希值为96354
在集合中找有没有96354这个哈希值的元素
发现没有
那么就会把 s1 存储到 set集合中
执行:
set.add(s2);
add 方法会调用hashCode方法,计算字符串"abc"的哈希值,哈希值为96354
在集合中找有没有96354这个哈希值的元素
发现有,不储存
执行:
set.add("重地");
add 方法会调用hashCode方法,计算字符串"重地"的哈希值,哈希值为1179395
在集合中找有没有1179395这个哈希值的元素
发现没有
那么就会把“重地”存储到 set集合中
执行:
set.add("通话");
add 方法会调用hashCode方法,计算字符串"通话"的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素
发现有,那么就会产生哈希冲突
接下来 通话 会调用equals方法与哈希值相同的元素进行比较 通话.equals(重地),发现元素不一样,返回false
两个元素的哈希值相同,但是equals方法返回false,认定两个元素不相同
那么就会把s4存储到 通话集合中
执行完毕后
HashSet存储自定义类型的元素
Set集合存储自定义元素的要求:
存储元素(String,Integer…)必须重写hashCode()方法和equals方法
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
Student s1 = new Student(18, "王");
Student s2 = new Student(18, "王");
Student s3 = new Student(19, "王");
students.add(s1);
students.add(s2);
students.add(s3);
System.out.println(students);
}
LinkedHashSet集合
特点
是一个哈细表(数组+链表/红黑树)+链表;多了一条链表(记录元素的存储顺序),保证元素有序
public static void main(String[] args) {
HashSet<String> strings = new HashSet<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
strings.add("e");
strings.add("f");
strings.add("王");
strings.add("阳");
System.out.println(strings);
LinkedHashSet<String> s1 = new LinkedHashSet<>();
s1.add("a");
s1.add("b");
s1.add("c");
s1.add("d");
s1.add("e");
s1.add("f");
s1.add("王");
s1.add("阳");
System.out.println(s1);
}
/*
[a, b, c, 阳, d, e, f, 王]
[a, b, c, d, e, f, 王, 阳]
*/
Collections集合工具类
常用方法
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
ArrayList<String> list1 = demo01(list);
System.out.println(list1);
ArrayList<String> list2 = demo02(list1);
System.out.println(list2);
ArrayList<String> list3 = demo03(list2);
System.out.println(list3);
}
private static ArrayList<String> demo01(ArrayList<String> list) {
Collections.addAll(list,"w","s","d","a");
return list;
}
/**
* static <T extends Comparable<? super T>>
* void
* sort(List<T> list)
* 根据元素的自然顺序 对指定列表按升序进行排序。
* @param list
* @return
*/
private static ArrayList<String> demo03(ArrayList<String> list) {
Collections.sort(list);
return list;
}
/**
* static void shuffle(List<?> list)
* 使用默认随机源对指定列表进行置换。
*/
private static ArrayList<String> demo02(ArrayList<String> list) {
Collections.shuffle(list);
return list;
}