🤦♂️🤦♂️集合详细解读+使用 🤦♂️🤦♂️
🎉🎉Java入门级教程🎉🎉
🌹🌹适合刚学习Java的小白选手🌹🌹
😃😃快来学习一下吧~~~ 😃😃
🤦♂️🤦♂️看完意犹未尽如果想用集合实现一个简易系统的话可以看👇这一篇🐱🏍🐱🏍
🎁🎁极简图书管理系统🐱👤🐱👤
目录
一、集合的体系和特点
集合是一个大小可变的容器。
容器中的每个数据称为一个元素。
集合的特点是:类型可以不确定,大小不固定。
集合有很多种,不同的集合特点和使用场景不同。
数组:类型和长度一旦被定义就已经固定。
集合的作用:
在开发中,很多时候元素个数是不确定的。
经常要进行元素的增删改查,集合都是非常合适的。Java中集合的代表是:collection
collection集合是Java中集合的祖宗类。接口 Collcetion<E>
/ \
接口 Set<E> List<E>
/ \ / \
HashSet<E> TreeSet<> ArrayList<E> LinkedList<E>
/
LinkedHashSet<>
集合的特点:
set系列集合:添加的元素是无序,不重复,无索引的。
--hashset:添加的元素是无序,不重复,无索引的。
--linkedhashset:添加的元素是有序,不重复,无索引的。
--treeset:按照大小默认升序排序。List系列集合:添加的元素是有序,可重复,有索引。
--arraylist:添加的元素是有序,可重复,有索引。
--linkedlist:添加的元素是有序,可重复,有索引。二、集合的常用API
package 集合; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class List1 { public static void main(String[] args) { // TODO Auto-generated method stub //添加元素,添加成功返回true Collection<String> list = new ArrayList<>(); System.out.println(list.add("贾乃亮")); System.out.println(list.add("贾乃亮")); System.out.println(list.add("王宝强")); System.out.println(list.add("陈羽凡")); //清空集合 list.clear(); //判断集合是否为空 System.out.println(list.isEmpty()); //获取集合的大小。 System.out.println(list.size()); //集合中是否包含某个元素 System.out.println(list.contains("贾乃亮")); //删除某个元素,如果有重复元素默认删除第一个。 list.remove("贾乃亮"); //把集合转成数组。 Object []arr = list.toArray(); System.out.println(Arrays.toString(arr)); } }
三、集合的遍历方式
迭代器遍历:
public class List2 { public static void main(String[] args) { // TODO Auto-generated method stub Collection<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); System.out.println(list); //得到集合的迭代器对象 Iterator<Integer> it = list.iterator(); //1.不断的获取下一个元素 //E next()获取下一个元素 System.out.println(it.next()); System.out.println(it.next()); System.out.println(it.next()); System.out.println(it.next()); //2.使用while循环 //boolean hasnext()判断是否有下一个元素 while(it.hasNext()) { int ele = it.next(); System.out.println(ele); } } }
foreach遍历
foreach可以遍历集合或者数组。
缺点:无法知道遍历到了哪个元素。
package 集合; import java.util.ArrayList; import java.util.Collection; public class List3 { public static void main(String[] args) { // TODO Auto-generated method stub Collection<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); for(int ele:list) { System.out.println(ele); } int []ages = new int[] {10,12,14}; for(int age:ages) { System.out.println(age); } } }
四、List集合
ArrayList集合的研究
ArrayList实现类集合底层基于数组存储数据的,查询快,增删慢、
增删慢是相对来说。
ArrayList在开发中用的最多。import java.util.ArrayList; import java.util.List; public class List4 { public static void main(String[] args) { // TODO Auto-generated method stub //创建一个ArrayList集合对象,一行经典代码 List<String> list = new ArrayList<>(); list.add("java1"); list.add("java1"); list.add("java2"); list.add("java2"); //在某个索引处插入元素 list.add(2,"mysql"); //根据索引删除元素, 返回被删除元素 System.out.println(list.remove(2)); //根据索引获取元素 System.out.println(list.get(2)); //修改索引位置处的元素 list.set(2, "mybatis"); System.out.println(list); } }
LinkedList集合的研究
是list的实现类,底层是基于链表的,增删比较快,查询慢。
支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的。import java.util.LinkedList; public class List5 { public static void main(String[] args) { // TODO Auto-generated method stub //用linkedlist做一个队列:先进先出 LinkedList<String> queue = new LinkedList<>(); queue.addLast("1号"); queue.addLast("2号"); queue.addLast("3号"); queue.addLast("4号"); System.out.println(queue); //出队:每次出第一个位置。 System.out.println(queue.removeFirst()); System.out.println(queue.removeFirst()); System.out.println(queue); LinkedList<String> stack = new LinkedList<>(); //实现一个栈结构:先进后出,后进先出。 //入栈 stack.push("1号"); stack.push("2号"); stack.push("3号"); stack.push("4号"); System.out.println(stack); //出栈 System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack); } }
五、Set集合
set系列无重复的原因,如何去重复?
1、对于有值特性的,Set集合可以直接判断进行去重复。
2、对于引用数据类型的对象,Set集合是按照如下流程进行是否重复的判断。
Set集合会让两个对象,先调用自己的Hashcode()方法,得到彼此的哈希值。
然后比较两个对象的哈希值是否相同,如果不相同则直接认为两个对象不重复。
如果哈希值相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为重复。
六、Map集合
map集合的特点:
1、map集合的特点都是由键决定的。
2、map集合的键时无序的,不重复的,无索引的。
map集合后面重复的键对应的元素会覆盖前面的整个元素。!
3、map集合的值无要求。
4、map集合的键值对都可以为null。
Map集合常用的API
package map; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Map3 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,Integer> map = new HashMap<>(); map.put("object1", 1); map.put("object2", 2); map.put("object3", 3); map.put(null, null); System.out.println(map); //判断集合是否为空 System.out.println(map.isEmpty()); //根据键值获取对应值 System.out.println(map.get("object1")); //根据键删除某个元素 map.remove("object1"); //判断是否包含某个键,包含则返回true System.out.println(map.containsKey("object2")); //判断是否包含某个值 System.out.println(map.containsValue(2)); //获取全部键的集合 Set<String> keys = map.keySet(); for(String key:keys) { System.out.println(key); } //获取全部值的集合 Collection<Integer> values = map.values(); for(Integer value:values) { System.out.println(value); } //获取集合的大小 System.out.println(map.size()); //合并其他map集合 Map<String,Integer> map2 = new HashMap<>(); map2.put("object4", 4); map2.put("object5", 5); map.putAll(map2);//把map2的数据全部倒入到map中去 System.out.println(map); } }
Map集合的遍历方式
键找值的方式遍历:先获取map集合全部的键,再根据遍历键找值。
先获取map集合的全部键的set集合。
遍历键的set集合,然后通过键找值。package map; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Map1 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,Integer> map = new HashMap<>(); map.put("object1", 1); map.put("object2", 2); map.put("object3", 3); Set<String> keys = map.keySet(); for(String key:keys) { Integer value = map.get(key); System.out.println(key+"="+value); } } }
键值对的方式遍历:难度较大。
面向对象的方式。
把键值对当成一个整体来遍历,也是用foreach步骤:
1、把Map集合转换成一个Set集合:Set<Map.Entry<K,V>> entrySet();
2、此时键值对元素的类型就确定了,类型是键值对实体类型:Map.Entry<K,V>
3、接下来就可以用foreach遍历这个Set集合,package map; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Map2 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,Integer> map = new HashMap<>(); map.put("object1", 1); map.put("object2", 2); map.put("object3", 3); Set<Map.Entry<String, Integer>> entries = map.entrySet(); for(Map.Entry<String, Integer> entry:entries) { String key =entry.getKey(); Integer value = entry.getValue(); System.out.println(key+"="+value); } } }
lambda遍历:
package map; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Map2 { public static void main(String[] args) { // TODO Auto-generated method stub Map<String,Integer> map = new HashMap<>(); map.put("object1", 1); map.put("object2", 2); map.put("object3", 3); map.forEach((k,v)->{ System.out.println(k+"->"+v); }); } }
七、Collections工具类的使用
package 集合; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; public class List7 { public static void main(String[] args) { // TODO Auto-generated method stub Collection<Integer> number = new ArrayList<>(); //给集合批量添加元素 /** * 参数一:被添加元素的集合 * 参数二:要添加的元素 */ Collections.addAll(number, 1,2,3); System.out.println(number); //打乱集合的顺序 List<Integer> newNumber = new ArrayList<>(); Collections.addAll(newNumber, 1,2,3); Collections.shuffle(newNumber); System.out.println(newNumber); } }
八、可变参数
可变参数的格式:数据类型...参数名称
可变参数的作用:
传输参数非常灵活。
可以不传参数。
可以传输一个参数。
可以传输多个参数。
可以传输一个数组。
可变参数在方法内部本质上就是一个数组。
package 集合; import java.util.Arrays; public class List8 { public static void main(String[] args) { // TODO Auto-generated method stub sum();//不传参数 sum(1);//一个参数 sum(1,2,3);//多个参数 sum(new int[] {1,2,3});//一个数组 } public static void sum(int...num) { //长度 System.out.println(num.length); //内容 System.out.println(Arrays.toString(num)); } }