Java集合知识点,猿人花了几天时间整理,还有Java超神之路脑图、月薪3万Java优秀简历模板、全网最全一线大厂Java笔试面试题、1000+本Java开发精华电子书送给大家,希望大家认真学习哦!
集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。
数组与集合的区别如下:
1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)
其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。
集合体系中常用的实现类,分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类。
如下给出了集合的思维导图:
猿码天地-Java知识学堂脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)
猿码天地-Java超神之路脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)
List用法
实现方式:ArrayList,LinkedList,Vector
添加对象:list.add()
获取对象:list.get()
获取对象大小:list.size()
1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
为什么要用 List list = new ArrayList() ,而不用 ArrayList list = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如LinkedList或者Vector等等,这时你只要改变这一行就行了。
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList list = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
Map用法
Map接口中键和值一一映射. 可以通过键来获取值。
实现类:HashMap、LinkedHashMap、Hashtable 和 TreeMap
插入元素:map.put()
移除元素:map.remove()
清空元素:map.clear()
获取map里有多少个键值对:map.size()
1、Map不是collection的子接口或者实现类。Map是一个接口。
2、Map 的 每个Entry都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap也通过 Comparator 或者 Comparable维护了一个排序顺序。
4、Map里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
java中遍历map具体方式:
在Map接口中,共有四种实现:HashMap、LinkedHashMap、Hashtable 和 TreeMap。
HashMap 线程不安全,效率高。允许null键和null值,是基于哈希表的Map接口实现,哈希表的作用是用来保证键的唯一性。
Hashtable:线程安全,效率低。不允许null键和null值。
TreeMap 是基于红黑树的Map接口的实现。
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
结果:
{key4=value4, key3=value3, key6=value6, key5=value5, key2=value2, key1=value1, key8=value8, key7=value7}
8
true
[key4, key3, key6, key5, key2, key1, key8, key7]
键key4,键key3,键key6,键key5,键key2,键key1,键key8,键key7,value3
{key4=value4, key6=value6, key5=value5, key2=value2, key1=value1, key8=value8, key7=value7}
[value4, value6, value5, value2, value1, value8, value7]
value6
key4<->value4
key6<->value6
key5<->value5
key2<->value2
key1<->value1
key8<->value8
key7<->value7
map遍历的7种方式
package com.bowen.demo.demo004;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* <h3>java-study</h3>
* <p>MapBL</p>
* @author : zhang.bw
* @date : 2021-03-22 12:30
**/
public class MapBL {
/**
* HashMap 遍历
* 大体上可以分为4类:
* 1,迭代器 (EntrySet、KeySet)
* 2,ForEach 遍历 (EntrySet、KeySet)
* 3,lambda 表达式遍历(lambda遍历)
* 4,StreamsApi 遍历(StreamsApi单线程、StreamsApi所线程)
*/
/**
* 迭代器 (EntrySet)
*/
public static void test1(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, String> next = iterator.next();
System.out.println(next.getKey());
System.out.println(next.getValue());
}
}
/**
* 迭代器 (KeySet)
*/
public static void test2(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
Iterator<Integer> iterator = map.keySet().iterator();
while (iterator.hasNext()){
Integer key = iterator.next();
System.out.print(key);
System.out.print(map.get(key));
}
}
/**
* ForEach 遍历 (EntrySet)
*/
public static void test3(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
for (Map.Entry<Integer,String> entry: map.entrySet()) {
System.out.println("entry.getKey() = " + entry.getKey());
System.out.println("entry.getValue() = " + entry.getValue());
}
}
/**
* ForEach 遍历 (KeySet)
*/
public static void test4(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
for (Integer key: map.keySet()) {
System.out.println(key);
System.out.println(map.get(key));
}
}
/**
* lambda 表达式遍历(lambda遍历)
*/
public static void test5(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
map.forEach((key,value) -> {
System.out.print(key);
System.out.print(value);
});
}
/**
* treamsApi 遍历(StreamsApi单线程)
*/
public static void test6(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
map.entrySet().stream().forEach((integerStringEntry -> {
System.out.println(integerStringEntry.getKey());
System.out.println(integerStringEntry.getValue());
}));
}
/**
* treamsApi 遍历(StreamsApi所线程)
*/
public static void test7(){
//创建Map 对象
Map<Integer, String> map = new HashMap<>();
//添加数据
map.put(1,"我爱中国1");
map.put(2,"我爱中国2");
map.put(3,"我爱中国3");
map.put(4,"我爱中国4");
map.put(5,"我爱中国5");
//遍历
map.entrySet().parallelStream().forEach((integerStringEntry -> {
System.out.println(integerStringEntry.getKey());
System.out.println(integerStringEntry.getValue());
}));
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
MapBL.test1();
MapBL.test2();
MapBL.test3();
MapBL.test4();
MapBL.test5();
MapBL.test6();
MapBL.test7();
}
}
Set用法
Set类继承了Conllection类,是一种集合类。
Set的实现类有三个:HashSet()、LinkedHashSet()、TreeSet()
1.不允许重复对象。
2.无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3.只允许一个 null 元素。
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
HashSet()
1.Set中是不能出现重复数据的。
2.Set中可以出现空数据。
3.Set中的数据是无序的。
LinkedHashSet()
1.Set中是不能出现重复数据的。
2.Set中可以出现空数据。
3.Set中的数据是有序的。
TreeSet()
1.不能写入空数据。
2.写入的数据是有序的。
3.不写入重复数据。
使用场景
keyset()和entryset()区别(推荐使用entrySet())
Map<String, String> map = new HashMap<String, String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
//先获取map集合的所有键的Set集合,即为map中所有key值的集合
Set<String> keySet = map.keySet();
//有了Set集合,就可以获取其迭代器。
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next();
//有了键可以通过map集合的get方法获取其对应的值。
String value = map.get(key);
//获得key和value值
System.out.println("key: " + key + "-->value: " + value);
}
Map<String, String> map = new HashMap<String, String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
通过entrySet()方法将map集合中的映射关系取出(这个关系就是Map.Entry类型)
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//将关系集合entrySet进行迭代,存放到迭代器中
Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();
while (it2.hasNext()) {
//获取Map.Entry关系对象me
Map.Entry<String, String> me = it2.next();
//通过关系对象获取key
String key2 = me.getKey();
//通过关系对象获取value
String value2 = me.getValue();
System.out.println("key: " + key2 + "-->value: " + value2);
}
虽然使用keyset及entryset来进行遍历能取得相同的结果,但两者的遍历速度是有差别的。
keySet():迭代后只能通过get()取key;再根据key值取value。
entrySet():迭代后可以e.getKey(),e.getValue()取key和value。
getParameterMap和putAll使用
Map readOnlyMap = request.getParameterMap();
Map writeAbleMap = new HashMap();
writeAbleMap.putAll(readOnlyMap);
writeAbleMap.remove()或者put()...
在后续的程序代码中使用writeAbleMap即可
putAll可以合并两个map,只不过如果有相同的key那么用后面的覆盖前面的。
List转Map
List results= null; // R类有no 和 name 属性值
Map<String, String> collect = results.stream ().collect (Collectors.toMap (R::getNo, R::getName));
参考:https://www.cnblogs.com/IvesHe/p/6108933.html
粉丝福利
猿码天地-Java知识学堂脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)
猿码天地-Java超神之路脑图 (文件密码:请关注公众号【猿码天地】,回复关键字‘活到老学到老’获取)
福利一:月薪3万Java优秀简历模板
简历是对你过往学习和工作的一个总结,一份好的简历容易给人留下深刻印象,更容易被企业发现,创造更多的就业机会。优秀的简历可以把你推销给优秀的企业,看看别人的优秀简历范文,让自己的简历更加优秀吧。
可以在微信搜索
「猿码天地」
,关注后回复关键字「简历」
即可获取!
福利二:全网最全一线大厂Java笔试面试题
面试题涵盖了Spring核心知识、SpringMVC、SpirngBoot、SpringCloud、JVM、数据库、常用消息组件Kafka、RabbitMQ、分布式、微服务组件Eureka、Ribbon、Config、Feign、Nacos、Zookeeper等、SQL优化、常用服务器Tomcat、Nginx、多线程、高并发等等。
可以在微信搜索「猿码天地」,关注后回复关键字「BAT面试」即可获取!
福利三:1000+本Java开发精华电子书
猿人从事Java开发多年,从最初的小白,一步步通过自己不断的学习、摸索,终于走上了码农这条没有回头的路。学习是无止境的,有时零零散散的学习资料难以将我们的知识成体系的串联起来。为此,为了让大家在学习Java的道路上成系统的学习,少走弯路,猿人为大家整理了1000+本Java开发精华电子书,毕竟现在电子书也是挺贵的,哈哈,希望能给大家带来帮助。
电子书涵盖:Java入门、并发编程、底层、常用框架、性能优化、设计模式、工具、计算机网络、操作系统、数据库、数据结构与算法、大数据、架构设计、Linux知识、面试、扩展、管理、容器化技术、云计算、微服务、领域设计等方方面面,猿人还会给持续更新。
获取方式
第一种:微信搜索「猿码天地」或者扫描下面的二维码,关注后回复关键字「电子书」即可获取!
第二种:Gitee:https://gitee.com/zhangbw666/java-books
希望程序员朋友能认真学习,根据自身需要获取对应的电子书,学习是永无止境的。
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。
——《写给程序员朋友》
转载:https://blog.csdn.net/zbw125/article/details/116055818