Java知识点整理(Springboot) Map集

本文介绍了Java中的Map接口,强调了Map并非集合,它以键值对的形式存储数据,并且键必须唯一。Map的主要实现类包括HashMap和TreeMap,HashMap基于散列算法,而TreeMap则采用二叉树结构。Map接口的遍历方法也在文中提及。

1.Map集:

* java.util.Map 查找表
* Map是JAVA集合框架的一员。但是Map不是集合!!!并没有实现Collection接口。
* Map体现的结构是一个多行两列的表格。其中左列称为key,右列称为value。
* Map总是根据key提取对应的value。
* Map要求key不允许重复(不能有equals比较为true的两个key同时在Map中存在)
*
* Map是一个接口,常用实现类:
* java.util.HashMap:散列表,使用散列算法实现的Map
* java.util.TreeMap:使用二叉树算法实现的Map

Map集可以想象成多行两列的表格,第一列为Key 键 第二列为value 值

public class MapDemo {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        /*
            V put(K k,V v)
            将一组键值对存入Map中
            返回值为被替换的value:由于Map不允许重复的key,因此如果使用重复的key存放
            则是将存入的value替换原有的value并将被替换的value返回。否则返回值为null。
         */
        Integer value = map.put("语文",99);//"语文"Map中不存在因此没有替换value
        System.out.println(value);//null
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);

        value = map.put("英语",55);//替换Map中"英语"的值
        System.out.println(map);
        System.out.println(value);//"英语"原来对应的值:97

        /*
            V get(K k)
            根据给定的key获取对应的value。如果给定的key在Map中不存在则返回值为null
         */
        value = map.get("语文");
        System.out.println("语文:"+value);
        value = map.get("体育");
        System.out.println("体育:"+value);

        /*
            int size()
            获取Map中的元素个数(一组键值对为一个元素)
         */
        int size = map.size();
        System.out.println("size:"+size);
        /*
            boolean containsKey(Object key)
            判断当前Map是否含有给定的key
            boolean containsValue(Object value)
            判断当前Map是否含有给定的value
         */
        boolean ck = map.containsKey("语文");
        boolean cv = map.containsValue(99);
        System.out.println("是否包含给定的key:"+ck);
        System.out.println("是否包含给定的value:"+cv);

        /*
            V remove(Object key)
            根据给定的key删除对应的这组键值对。返回值为这个key对应的value。
         */
        value = map.remove("语文");
        System.out.println(map);
        System.out.println(value);

    }

 Map集遍历方法:

/**
 * Map提供了三种遍历方式:
 * 1:遍历所有的key
 * 2:遍历每一组键值对
 * 3:遍历所有的value(相对不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);

        /*
            遍历所有的key
            Set keySet()
            将当前Map中所有的key以一个Set集合形式返回。
         */
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            System.out.println("key:"+key);
        }

        /*
            遍历每一组键值对
            Set entrySet()
            将当前Map中每一组键值对以一个Entry实例表示,并最总以Set集合形式返回
            所有的键值对。
            Map.Entry的每一个实例用于表示Map中的一组键值对,有两个常用方法:
            K getKey():获取key
            V getValue():获取value
         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for(Map.Entry<String,Integer> e : entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }

        /*
            遍历所有的value
            Collection values()
            将当前Map中所有的value以一个集合形式返回
         */
        Collection<Integer> values = map.values();
        for(Integer value : values){
            System.out.println("value:"+value);
        }


        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        c.add("five");
        for(String e : c){
            System.out.println(e);
        }
        //JDK8之后集合和Map都提供了forEach方法基于lambda表达式遍历
        c.forEach(e->System.out.println(e));
//        c.forEach(System.out::println);//方法引用


        map.forEach((k,v)-> System.out.println(k+":"+v));

    }
}

HTTP协议:

HTTP协议  超文本传输协议 由万维网制定(w3c)
是浏览器与服务器通讯的应用层协议,规定了浏览器与服务器之间的交互规则以及交互数据的
格式信息等。


HTTP协议对于客户端与服务端之间的交互规则有以下定义:
要求浏览器与服务端之间必须遵循一问一答的规则,即:浏览器与服务端建立TCP连接后需要
先发送一个请求(问)然后服务端接收到请求并予以处理后再发送响应(答)。注意,服务端永远
不会主动给浏览器发送信息。

HTTP要求浏览器与服务端的传输层协议必须是可靠的传输,因此是使用TCP协议作为传输层
协议的。

HTTP协议对于浏览器与服务端之间交互的数据格式,内容也有一定的要求。
浏览器给服务端发送的内容称为请求Request
服务端给浏览器发送的内容称为响应Response

请求和响应中大部分内容都是文本信息(字符串),并且这些文本数据使用的字符集为:
ISO8859-1.这是一个欧洲的字符集,里面是不支持中文的!!!。而实际上请求和响应出现
的字符也就是英文,数字,符号。

请求Request
请求是浏览器发送给服务端的内容,HTTP协议中一个请求由三部分构成:
分别是:请求行,消息头,消息正文。消息正文部分可以没有。


1:请求行
请求行是一行字符串,以连续的两个字符(回车符和换行符)作为结束这一行的标志。
回车符:在ASC编码中2进制内容对应的整数是13.回车符通常用cr表示。
换行符:在ASC编码中2进制内容对应的整数是10.换行符通常用lf表示。
回车符和换行符实际上都是不可见字符。

请求行分为三部分:
请求方式(SP)抽象路径(SP)协议版本(CRLF)    注:SP是空格
GET /myweb/index.html HTTP/1.1

URL地址格式:
协议://主机地址信息/抽象路径
http://localhost:8088/TeduStore/index.html
GET /TeduStore/index.html HTTP/1.1

2:消息头
消息头是浏览器可以给服务端发送的一些附加信息,有的用来说明浏览器自身内容,有的
用来告知服务端交互细节,有的告知服务端消息正文详情等。

消息头由若干行组成,每行结束也是以CRLF标志。
每个消息头的格式为:消息头的名字(:SP)消息的值(CRLF)
消息头部分结束是以单独的(CRLF)标志。
例如:
Host: localhost:8088(CRLF)
Connection: keep-alive(CRLF)
Upgrade-Insecure-Requests: 1(CRLF)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36(CRLF)
Sec-Fetch-User: ?1(CRLF)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9(CRLF)
Sec-Fetch-Site: none(CRLF)
Sec-Fetch-Mode: navigate(CRLF)
Accept-Encoding: gzip, deflate, br(CRLF)
Accept-Language: zh-CN,zh;q=0.9(CRLF)(CRLF)


3:消息正文
消息正文是2进制数据,通常是用户上传的信息,比如:在页面输入的注册信息,上传的
附件等内容。



GET /index.html HTTP/1.1
Host: localhost:8088
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
1010101101001.....


HTTP响应Response
响应是服务端发送给客户端的内容。一个响应包含三部分:状态行,响应头,响应正文

1:状态行
状态行是一行字符串(CRLF结尾),并且状态行由三部分组成,格式为:
protocol(SP)statusCode(SP)statusReason(CRLF)
协议版本(SP)状态代码(SP)状态描述(CRLF)
例如:
HTTP/1.1 200 OK

状态代码是一个3位数字,分为5类:
1xx:保留
2xx:成功,表示处理成功,并正常响应
3xx:重定向,表示处理成功,但是需要浏览器进一步请求
4xx:客户端错误,表示客户端请求错误导致服务端无法处理
5xx:服务端错误,表示服务端处理请求过程出现了错误

具体的数字在HTTP协议手册中有相关的定义,可参阅。
状态描述手册中根据不同的状态代码有参考值,也可以自行定义。通常使用参考值即可。


响应头:
响应头与请求中的消息头格式一致,表示的是服务端发送给客户端的附加信息。

响应正文:
2进制数据部分,包含的通常是客户端实际请求的资源内容。

响应的大致内容:
HTTP/1.1 404 NotFound(CRLF)
Content-Type: text/html(CRLF)
Content-Length: 2546(CRLF)(CRLF)
1011101010101010101......

这里的两个响应头:
Content-Type是用来告知浏览器响应正文中的内容是什么类型的数据(图片,页面等等)
不同的类型对应的值是不同的,比如:
文件类型              Content-Type对应的值
html          text/html
css           text/css
js            application/javascript
png           image/png
gif           image/gif
jpg           image/jpeg

MIME
Content-Length是用来告知浏览器响应正文的长度,单位是字节。

浏览器接收正文前会根据上述两个响应头来得知长度和类型从而读取出来做对应的处理以
显示给用户看。







 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值