集合
集合是java中提供的一种容器,可以用来存储多个数据,并且可以存储任意类型的数据!
### 泛型在这简单说一下
泛型是什么,,泛型就是可以在类或方法中预支地使用未知的类型。
使用泛型最大的好处就是可以避免类型强制转换的问题,同时也能增强程序的安全性
他主要是配合集合使用,在集合类后面加上<>,括号里面写上数据类型,说明集合里面存储的元素只能是该数据类型
//例如
List<Student> list = new ArrayList<>();//这就表示该list集合只能存储Student类型的数据
-
集合分为两类
-
第一类是单列集合 collection 单列集合包含set(无序的,不允许存入重复元素。)集合和List集合(索引精确控制序列中元素,可以存入相同的元素)
List 有序的,有一个索引,可以通过索引获取元素,可以存入相同元素
ArrayList 底层是数组,每次进行数据添加和删除,都会生成一个新数组,原数组中的内容copy到新数组中,再进行新内容的追加
特点:查询速度快,但是添加和删除操作效率较低
LinkedList 底层是链表,查询速度慢,添加和删除效率高
Vector 底层也是数组,他线程安全,效率
Set 无序的,不可以存入相同元素
HashSet 底层使用HashMap进行的内容存储,数据结构为哈希表形式。
LinkedHashSet 底层是哈希表和链表,会根据元素的插入顺寻进行排序
TreeSet 底层树结构,不能存入null值,且存入值时,需要存入具有转换关系的值。该集合中会对值进行升序排序。
-
第二类是双列集合 Map ----是以键值对的形式进行存储数据的
HashMap 底层 哈希表结构, 键允许存入一个null, 值允许多null.存在
LinkedHashMap 底层是链表+哈希表结构。 在HashMap的基础上记录添加的顺序。
TreeMap 底层是红黑树结构,根据键的大小进行排序,键不允许存储null.
HashTable 底层是哈希表 。 线程安全。
与HashMap比较:
HashMap:线程不安全,效率高;
HashTable:线程安全,效率低.
-
集合的构建和方法
//1.构建collection对象,collection是一个接口是一个特殊的父类,用他的实现类来构建一个collection对象
Collection collection = new ArrayList<>();
//2.collection常用方法
//2.1 add方法,向collection集合中添加一个元素
collection.add("abcde");
collection.add("abcde");
collection.add("dada");
collection.add(new Date());
collection.add("上山打老虎");
Collection collection1 = new ArrayList<>();
collection1.add("12345");
collection1.add("iKun");
collection1.add("dada");
//2.2 addAll方法,向collection对象里加入批量加入元素(并入一个新的集合)
collection.addAll(collection);
//2.3删除集合中的一个元素
collection.remove("dada");
//2.4删除集合中的元素根据传入的集合
collection.removeAll(collection1);
//2.5 判断集合中是否包含某一个元素 返回值是布尔类型
boolean b = collection.contains("adcde");
//2.6 判断集合是否包含另一个集合
collection.containsAll(collection1);
//2.7遍历集合,,,构建一个迭代器对象来遍历
Iterator iterator = collection.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//1.构建collection对象,用List接收,他是collection的一个子接口,可以通过索引访问集合中的元素
List list = new ArrayList<>();
//2.collection常用方法
//2.1 add方法,向collection集合中添加一个元素
list.add(0,"郭八");
list.add(1,"张三");
//再次在第一个位置添加,会本原来的第一个位置的元素给挤下去,让原来的往后移动
list.add(1,"王五");
list.add(2,"李四");
List list1 = new ArrayList<>();
list1.add(0,"李四");
list1.add(1,"七七");
//2.2 addAll方法,向collection对象里加入批量加入元素(并入一个新的集合)
list.addAll(0,list1);
//2.3删除集合中的一个元素
list.remove("张三");
//2.4删除集合中的元素根据传入的集合
boolean b = list.removeAll(list1);
//2.5修改对应索引的内容
list.set(0,"张四");
//2.5 判断集合中是否包含某一个元素 返回值是布尔类型
boolean b = list.contains("adcde");
//2.6 判断集合是否包含另一个集合
list.containsAll(list1);
//2.7遍历集合,,,构建一个迭代器对象来遍历
Iterator iterator = collection.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//2.8加强for循环遍历集合
for (Object obj : list){
}
//用hashset实现类来构建set对象
HashSet set = new HashSet<>();
//在set集合里添加元素
//set.addAll();
set.add("张三");
set.add("李四");
//查看集合的大小
set.size();
//删除集合中的一个元素
set.remove("");
//判断集合中是否包含某一个元素 返回值是布尔类型
set.contains("李四");
//判断集合是否包含另一个集合
//set.containsAll(集合名)
//创建一个map对象,一般用HashMap实现类来构建map对象,双列集合一般是用键值对存放数据
Map map = new HashMap<>();
//在双列集合里放数据
map.put("姓名","张三");
map.put("性别","🚺♀");
Map map1 = new HashMap<>();
// 把 指定的map集合复制到此集合
map1.putAll(map);
//System.out.println(map1);
//从map集合里删除一个给定键的映射
map.remove("姓名");
System.out.println(map);
//修改 直接使用put覆盖原来的键值对,map中的key不能重复,一旦重复覆盖原有的值
map.put("姓名","111把");
System.out.println(map);
//查询集合中的map键值对数量
int i = map.size();
System.out.println(i);
//要获取map里面值,可以通过键来获取
//单个获取
Object obj= map.get("性别");
System.out.println(obj);
//获取集合中所有的value值
Collection values = map.values();
System.out.println(values);
//获取双列集合里面的键 set集合里面不允许放入重复的元素,map的key也不允许放入重复的
Set set = map.keySet();
System.out.println(set);
//遍历键所在的集合来遍历map集合里面的值,获取所有的键名和键值
System.out.println("遍历键所在的集合来遍历map集合里面的值");
for (Object ob:set){
System.out.println(map.get(ob));
}
//调用map的entrySet()方法,把map中的键值放到set集合里
Set set1 = map.entrySet();
for (Object o : set1) {
Map.Entry entry = (Map.Entry) o;
entry.getValue();
System.out.println(entry.getKey());
}