集合框架的基本结构图
1、ArrayList集合
①ArrayList的创建增删改查
package cn.cduestc.list.arrayList;
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
//创建一个ArryList集合,ArrayList集合底层是object数组
List list = new ArrayList();
//添加数据
list.add("张虎");
list.add(true);
list.add(32);
list.add(53L);
list.add(0.12F);
//删除数据
//根据数据删除(如果要删除某个整数,那么需要使用Integer类型,如果是int类型会默认是按照下标进行删除)
list.remove(new Integer(32));
//根据下标删除
list.remove(3);
//修改数据
list.set(0, "虎子哥哥");
//查询单个
System.out.println(list.get(2));
//ArrayList集合使用size()方法输出集合的长度时,不是集合的能存储值长度,而是集合现在已经存储值的长度。
System.out.println(list.size());
System.out.println("============================");
//遍历查询
//方案一:普通for循环
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
System.out.println("============================");
//方案二:高级for循环
for(Object temp : list) {
System.out.println(temp);
}
System.out.println("============================");
//方案三:lambda表达式(jdk1.8的新特性)
list.forEach(temp->System.out.println(temp));
}
}
2、LinkedList和ArrayList增删改查操作方法一样
List的特点?
答:
List是有序可重复的,且有索引,可以根据索引对List集合进行操作。
LinkedList和ArrayList的区别?
答:
1、数据结构不同:LinkedList使用的链表数据结构,ArrayList是使用的数组的数据结构
2、效率不同:LinkedList使用的是链表,所以增删操作时效率较高,而ArrayList使用的数组,则查询和修改效率更高。
3、HashSet集合
①HashSet进行增删改查
package cn.cduestc.set;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
//创建一个HashSet集合
Set set = new HashSet();
//添加数据
set.add("张三");
set.add("李四");
set.add("李四");
set.add("王五");
set.add("赵六");
//删除数据(删除数据只能根据数据删除,不能根据下标)
set.remove("王五");
//修改:删除+添加
set.remove("李四");
set.add("炮灰甲");
//遍历(我们发现set集合会对数据进行自动去重)
set.forEach(temp->System.out.println(temp));
//打印集合长度(和List集合一样,只计算存储了值的长度)
System.out.println(set.size());
}
}
②HashSet的特点?
答:
1、HashSet底层是HashMap,数据结构是数组+链表的形式,HashSet源码中使用HashMap中的key进行存储的,所以,是不允许重复的。
2、数据存储是无序的:其实HashSet存储数据是有序的,但是不是按照我们存值的顺序,是按照数据的Hash值进行存储的。
3、HashSet的自增功能:创建一个HashSet集合的初始容量是16,如果数据量达到了阈值(容量乘以加载因子),那么会自增为现在容量的两倍。加载因子也可以在创建集合的时候自定义。
③HashSet保证数据唯一性的操作方法?
答:
前提是HashSet必须实现了Object的hashCode() 和equals()方法。首先存值的时候HashSet会将新添加的数据使用哈希算法生成一个哈希值,然后根据这个哈希值去判断集合中存不存在该值,如果不存在,那么直接添加;如果存在,再使用equals()判断这个哈希值对应的数据和新添加的数据是否一致,如果不一致,那么直接添加(出现hash值一致,数据不一致的情况,是将新添加的数据指向原来的数据,即是使用链表结构);如果一致就不要添加了。
4、TreeSet集合:对数据的增删改查和HashSet基本一致
①TreeSet的特点?
答:TreeSet底层是基于二叉树的,不可以重复,但是是有序的(仅对实现comparable、comparator接口的类型有效)
②TreeSet和HashSet的区别?
答:
1、实现方式:HashSet是数组+链表实现的(依赖HashMap),TreeSet是二叉树实现的(依赖TreeMap)
2、数据是否有序:HashSet数据是无序的(其实是按照Hash值进行排序了);TreeSet是有序的(前提是实现了Comparable、Comparator接口),且不是按照存储顺序进行排序,是对数据进行自动排序(如:存储的全是Integer类型的值,那么它会按照大小来进行排序)
3、是否能放入null:HashSet是可以放入null值的,但是只能放入一个;TreeSet是不能放入null值的。
5、HashMap集合增删改查
package cn.cduestc.map;
import java.util.HashMap;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
//添加
map.put("1", "枫");
map.put("2","最长的电影");
map.put("3", "搁浅");
map.put("4", "晴天");
map.put("5","说好不哭");
map.put("6","听妈妈的话");
//删除
map.remove("5");
//修改
map.put("6","告白气球");
//遍历
map.forEach((k,v)->System.out.println(k+"==="+v));
//HashMap覆写了toString方法,所以可以直接打印
System.out.println(map);
}
}
①HashMap的特点?
答:
1、HashMap是双列型,存放数据时key-value的形式。HashMap底层是数组+链表的形式。key不可以重复,value可以重复。key是无序的(其实key是有序的,是按照key的哈希值进行排序的)。
2、HashMap是可以序列化的(实现了Serializable接口),非synchronized,线程不安全。
3、创建HashMap集合,初始容量也为16,加载因子为0.75,且可以自定义加载因子。
6、TreeMap和HashMap的增删改查操作方法基本一致
①TreeMap的特点?
答:TreeMap底层是二叉树,key不可以重复,value可以重复;key是有序的(前提是key的类型实现了Comparable、Comparator接口)。
7、常用集合的分类
Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表存储元素,线程不安全
│————————└ LinkedHashSet 链表维护元素的插入次序,线程不安全
└ —————-TreeSet 底层实现为二叉树,元素排好序,线程不安全
Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap