Java--Map和HashMap基础

2023-11-11

一、Map常用方法

1、Map集合在 java.util.Map 包下,Map集合以键值对 key和value 的方式存储数据

key和value都是引用数据类型;都是存储对象的内存地址

2、Map接口中常用方法:    

    V put(K key, V value) 向Map集合中添加键值对

    V get(Object key) 通过key获取value

    void clear()     清空Map集合

    boolean containsKey(Object key) 判断Map中是否包含某个key

    boolean containsValue(Object value) 判断Map中是否包含某个value

    boolean isEmpty()    判断Map集合中元素个数是否为0

    V remove(Object key) 通过key删除键值对

    int size() 获取Map集合中键值对的个数

    Collection<V> values() 获取Map集合中所有的value,返回一个Collection

    Set<K> keySet() 获取Map集合所有的key(所有的键是一个set集合)

    Set<Map.Entry<K,V>> entrySet() 将Map集合转换成Set集合

Map集合通过entrySet()方法转换成的这个Set集合,Set集合中元素的类型是 Map.Entry<K,V>(可以理解为一个对象);Map.Entry是静态内部类,是Map中的静态内部

二、Map集合遍历

Map集合遍历有两种方法

1、通过Set<K> keySet() 方法获取Map集合所有的key,然后通过key获取value

2、通过Set<Map.Entry<K,V>> entrySet()方法获取泛型对象为 Map.Entry<K,V> 的Set集合,然后使用foreach遍历,每次取出 Map.Entry<K,V> 对象的 key和value

相对来说第二种效率更高一些,直接拿到Map.Entry<K,V> 对象的属性值;而第一种还需要遍历Key获取值,本身就耗时

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王二");

        System.out.println("1、获取Key集合,通过key获取value");

        /**---- 集合遍历 ----*/
        /**
         * 1、获取Key集合,通过key获取value
         * */
        Set set = map.keySet();
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            Integer key = it.next();
            System.out.println("Key:" + key + ";" + "Value:" + map.get(key));
        }

        System.out.println("====================================================");
        System.out.println("2、拿到map中一个集合对象,遍历对象取出 key-value");

        /**
         * 2、拿到Map中的Set集合,集合中元素是Map.Entry;遍历Set集合取出Map.Entry对象的 key-value
         *
         * for each效率较高,直接拿到对象的属性值,不需要通过 下标索引 和 key 去查询
         * */
        Set<Map.Entry<Integer, String>> set1 = map.entrySet();
        for (Map.Entry<Integer, String> map1: set1) {
            System.out.println("Key:" + map1.getKey() + ";" + "Value:" + map1.getValue());
        }
    }

当然,还有一些其他扩展方法遍历,要看使用场景,相对来说上面两种用法最常见

如 :

3、在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好

Map <String,String>map = new HashMap<String,String>();
map.put(1, "棕色");
map.put(2, "黄色");
//key
for(String key : map.keySet()){
    System.out.println(key);
}
//value
for(String value : map.values()){
    System.out.println(value);
}

4、通过Iterator遍历

Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Entry<String, String> entry = entries.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key+":"+value);
}

总结:

1、entrySet的方式整体都是比keySet方式要高一些

2、单纯的获取key来说,两者的差别并不大,但是如果要获取value,还是entrySet的效率会更好,因为keySet需要从map中再次根据key获取value,而entrySet一次都全部获取出来

3、iterator的迭代器方式比foreach的效率高

注:

foreach的语法只是对iterator进行了简单的包装,使用起来更加方便而已,但是如果在foreach循环体内,对集合元素进行删除添加操作的时候,会报出ConcurrentModificationException,并报修改异常。如果需要在遍历集合的时候对象集合中元素进行删除操作,需要使用iterator的遍历方式,iterator自带的remove删除方式不会报出异常

三、Map集合为何无序不可重复

我们以HashMap集合为例

HashMap集合:

1、HashMap集合底层是哈希表/散列表的数据结构

2、HashMap集合底层的源代码:

public class HashMap{
      // HashMap底层实际上就是一个数组(一维数组)
      Node<K,V>[] table;

      // 静态的内部类HashMap.Node
      static class Node<K,V> implements Map.Entry<K,V> {
          final int hash;      // 哈希值(哈希值是key的hashCode()方法的执行结果;hash值通过哈希函数/算法,可以转换存储成数组的下标)

          final K key;         // 存储到Map集合中的那个key

          V value;             // 存储到Map集合中的那个value

          Node<K,V> next;      // 下一个节点的内存地址。
      }
}

3、哈希表是一个数组和单向链表的结合体

      数组:在查询方面效率很高,随机增删方面效率很低

      单向链表:在随机增删方面效率较高,在查询方面效率很低

      哈希表将以上的两种数据结构融合在一起,充分发挥它们各自的优点

同一个单向链表上所有节点的hash相同,因为他们的数组下标是一样的;但同一个链表上k和k的equals方法肯定都不相等,返回false 

(1)map.put(k,v) 实现原理:

        先将k,v封装到Node对象当中

        底层会调用k的hashCod( )方法得出hash值,然后通过哈希函数/哈希算法,将hash值转换成

数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上

        如果说下标对应的位置上有链表,此时会拿着 k 和链表上每一个节点中的 k 进行equals()比较

        如果所有的equals方法返回的都是false ,那么这个新节点 Node 将会被添加到链表的末尾

        如果其中有一个 k 的 equal返回了true,那么这个节点的value将会被覆盖

(2)v = map.get(k) 实现原理:

        先调用k的hashCode0方法得出哈希hash值,通过哈希算法转换成数组下标,通过数组下标快

速定位到某个位置上

        如果这个位置上什么也没有,返回null

        如果这个位置上有单向链表,那么会拿着参数 k 和单向链表上的 每个节点中的k进行equals

        如果所有equals方法返回 false,那么get方法返回null

        只要其中有一个节点的 k 和参数k equals的时候返回true ,那么此时这个节点的 value就是要

找的value ,get方法最终返回这个要找的value

4、HashMap集合的key部分特点: 无序,不可重复

(1)无序:

        不确定挂到哪一个单向链表

(2)不可重复:

        equals方法来保证HashMap集合的key不可重复。 如果key重复了,value会覆盖。 放在HashMap集合key部分的元素其实就是放到HashSet集合中了(所以HashSet集合中的元素也需要同时重写hashCode() + equals()方法)

        /** Map存储元素特点:无序不可重复 */
        // Integer是key,它的hashCode和equals都重写了。
        Map<Integer,String> map = new HashMap<>();
        map.put(11, "str11");
        map.put(22, "str22");
        map.put(33, "str33");
        map.put(44, "str44");
        map.put(55, "str55");
        map.put(66, "str66");
        map.put(66, "str86");//key重复的时候value会自动覆盖。

        System.out.println(map.size()); // 6

        // 遍历Map集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();
        for(Map.Entry<Integer,String> entry : set){
            // 验证结果:HashMap集合key部分元素:无序不可重复。
            System.out.println(entry.getKey() + "=" + entry.getValue());
            /*
            33=str33
            66=str86
            22=str22
            55=str55
            11=str11
            44=str44
            * */
        }

5、散列分布均匀OR不均匀

(1)散列分布均匀

        假设有100个元素,10个单向链表,那么每个单向链表上有10个节点,这是最好的情况, 是散列分布均匀的

(2)散列分布不均匀

        假设将所有的hashCode()方法返回值固定为某个值,导致底层哈希表变成了 纯单向链表。这种情况我们成为:散列分布不均匀。

        假设将所有的hashCode()方法返回值都设定为不一样的值,导致底层哈希表就成为一维数组了,没有链表的概念了, 也是散列分布不均匀

6、HashMap集合的默认初始化容量是16,默认加载因子是0.75 这个默认加载因子是当HashMap集合底层数组的容量达到75%的时候,数组开始扩容。 HashMap集合初始化容量必须是2的倍数,这也是官方推荐的, 这是因为达到散列均匀,为了提高HashMap集合的存取效率

    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    /**
     * The maximum capacity, used if a higher value is implicitly specified
     * by either of the constructors with arguments.
     * MUST be a power of two <= 1<<30.
     */
    static final int MAXIMUM_CAPACITY = 1 << 30;

    /**
     * The load factor used when none specified in constructor.
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

综上:

        放在HashMap集合key部分的元素,以及放在HashSet集合中的元素,需要同时重写hashCode()和equals()方法

四、HashMap重写equals()和hashCode()方法

Java中对于eqauls方法和hashCode方法是这样规定的:

(1)如果两个对象相同(equals方法返回true,比较对象内容完全相同),那么它们的hashCode值一定要相同

(2)如果两个对象的hashCode相同,它们并不一定相同

关于“==”和 equals()方法可参考

Java--“==”和 equals()方法_MinggeQingchun的博客-CSDN博客

因此,equals 方法被覆盖/重写过,则 hashCode 方法也必须被覆盖/重写

测试如下,创建一个People类(只重写equals()方法),一个Person类(equals()和hashCode()方法都重写)

public class People {
    private String name;

    public People() {
    }

    public People(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    //比较内容是否相等
    public boolean equals(Object obj){
        if (obj == null || !(obj instanceof People)) return false;
        if (this == obj) return true;
        People people = (People) obj;
        return  (this.name.equals(people.name));
    }
}

Person类

import java.util.Objects;

public class Person {
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 比较名字相同
     * */

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

 测试代码如下,且注释后都给出了控制台上的输出结果

public static void main(String[] args) {

        /** People只重写了 equals()方法 */
        People people1 = new People("张三");
        People people2 = new People("张三");

        /**
         * 未重写 equals()方法 之前,调用根类 Object的equals()方法,
         *     public boolean equals(Object obj) {
         *         return (this == obj);
         *     }
         * 此时 “==”双等号 比较的是内存地址是否相等,new 两个对象,内存地址不同
         *
         * 重写 equals()方法 之后,比较的是内容是否相等
         * */
        System.out.println("people1和people2是否相等:" + people1.equals(people2));//true

        System.out.println("people1的hashCode:" + people1.hashCode());//460141958
        System.out.println("people2的hashCode:" + people2.hashCode());//1163157884

        Set<People> peopleSet = new HashSet<>();
        peopleSet.add(people1);
        peopleSet.add(people2);
        System.out.println("peopleSet元素个数:" + peopleSet.size());//2

        System.out.println("======================================");

        /** Person重写了 equals() 和 hashCode()方法 */
        Person person1 = new Person("李四");
        Person person2 = new Person("李四");

        System.out.println("person1和person2是否相等:" + person1.equals(person2));//true

        System.out.println("person1的hashCode:" + person1.hashCode());//842092
        System.out.println("person2的hashCode:" + person2.hashCode());//842092

        Set<Person> personSet = new HashSet<>();
        personSet.add(person1);
        personSet.add(person2);
        System.out.println("personSet元素个数:" + personSet.size());//1
    }

我们会发现People类只重写equals()方法没有重写hashCode()方法,导致Set集合中存放了两个元素,Person类既重写equals()方法又重写hashCode()方法,Set集合中只能存放一个值,认为person1和person2相等,hashCode也是相等的

1、hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDKObject.java中,这就意味着Java中的任何类都包含有hashCode()函数

2、hashCode作用

“HashSet 如何检查重复为例

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位 置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode, HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让 其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样就大大减少了 equals 的次数,相应就大大提高了执行速度

3、向Map集合中存,以及从Map集合中取,都是先调用key的hashCode方法,然后再调用equals方法! equals方法有可能调用,也有可能不调用

(1)put(k,v)

        k.hashCode()方法返回哈希值,哈希值经过哈希算法转换成数组下标。数组下标位置上如果是null,equals不需要执行。    

(2)get(k)

        k.hashCode()方法返回哈希值,哈希值经过哈希算法转换成数组下标。数组下标位置上如果是null,equals不需要执行。

4、对于哈希表数据结构来说:

(1)如果o1和o2的hash值相同,一定是放到同一个单向链表上

(2)如果o1和o2的hash值不同,但由于哈希算法执行结束之后转换的数组下标可能相同(“哈希碰撞”)

五、HashMap的key和value都能为null

HashMap的key和value都允许为null

HashMap集合的key 为null值只能有一个,之后的会覆盖

Hashtable的key和value都是不能为null的

public static void main(String[] args) {

        Map map = new HashMap();

        // HashMap集合允许key为null
        map.put(null, null);
        System.out.println(map.size()); // 1

        // key重复的话value是覆盖!
        map.put(null, 100);
        System.out.println(map.size()); //1

        // 通过key获取value
        System.out.println(map.get(null)); // 100
    }

六、Hash碰撞

如果两个不同的元素,通过哈希函数得出的实际存储地址相同;也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。(HashMap 通常会用一个指针数组( table[])来做分散所有的 key,当一个 key 被加入时,会通过 Hash 算法通过 key 算出这个数组的下标 i,然后就把这个 插到 table[i] 中,如果有两个不同的 key 被算在了同一个 i,那么就叫冲突,又叫碰撞,这样会在 table[i] 上形成一个链表)

散列表要解决的一个问题就是散列值的冲突问题,哈希冲突的解决方案有 4 种:

(1)开放定址法

开放定址法就是一旦发生了冲突,就去寻找下一块空的未被占用的散列地址,只要散列表足够大,

空的散列地址总能找到,并将记录存入。

(2)链地址法(拉链法)

将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲

突时就把该关键字链在以该单元为头结点的链表的尾部。(将相同hash值的对象组织成一个链表放在hash值对应的槽位)

(3)再哈希法

当哈希地址发生冲突用其他的函数计算另一个哈希函数地址,直到冲突不再产生为止。

(4)建立公共溢出区

将哈希表分为基本表和溢出表两部分,发生冲突的元素都放入溢出表中。

而HashMap即是采用了链地址法,也就是数组+链表的方式。

在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。
在Java 8中使用常量TREEIFY_THRESHOLD来控制是否切换到平衡树来存储。目前,这个常量值是8,这意味着当有超过8个元素的索引一样时,HashMap会使用树来存储它们。

 还可参考另一篇文章
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java--Map和HashMap基础 的相关文章

  • 哈希图与数组性能

    当数组的索引已知时 使用数组或 HashMap 是否 性能方面 更好 请记住 示例中的 对象数组 映射 只是一个示例 在我的实际项目中 它是由另一个类生成的 因此我不能使用单独的变量 数组示例 SomeObject objects new
  • 动态创建对象的副本?

    我的应用程序将我的 Web 服务响应存储到 WeakHashMap 中 在我的应用程序中 我在 UI 中操作从 Web 服务返回的数据 并且由于对象被引用 因此它也会修改引用 在我的弱哈希图中 有没有一种方法可以将对象的副本而不是引用存储到
  • 同构弦

    给定两个字符串 s 和 t 确定它们是否同构 如果 s 中的字符可以替换得到 t 则两个字符串是同构的 所有出现的字符都必须替换为另一个字符 同时保留字符的顺序 任何两个字符都不能映射到同一个字符 但一个字符可以映射到其自身 例如 给定 e
  • Java:具有重复键的 Json 可以使用 Jackson 进行映射

    我有一个具有相同键但不同值的 json 文件 如下所示 domains A name a type a1 B name r type g1 A name b type b1 这是来自外部系统 如何转换json 到 java 映射对象并访问不
  • C# Java HashMap 等效项

    从 Java 世界进入 C 世界 是否有一个 HashMap 等价物 如果不是你会推荐什么 Dictionary https learn microsoft com en us dotnet api system collections g
  • Java:地图包含等于或小于另一个地图

    如何检查 1 个子集是否包含小于或等于另一个子集 下面是 SMap 和 TMap 在此示例中 执行方程式将返回 false sMap entrySet containsAll tMap entrySet 我相信它返回 false 因为它试图
  • 如何在 Java 中创建哈希表?

    在 Java 中创建哈希表 或关联数组 最直接的方法是什么 我的 google fu 已经出现了几个例子 但是有一个标准的方法来做到这一点吗 有没有一种方法可以用键 gt 值对列表填充表 而无需为每对对象单独调用 add 方法 Map ma
  • 如何使用 ngFor 迭代 Map 并在 Angular 2+ 中的 html 上按顺序显示它们?

    我正在使用 Angular 7 x 我已经实现了使用 ngFor 的代码 它迭代 Map 并将它们显示在 html 上
  • Amazon S3s 密钥背后的数据结构(过滤数据结构)

    我想实现一个类似于 Amazon S3 的查找功能的数据结构 就上下文而言 Amazon S3 将所有文件存储在平面命名空间中 但允许您通过文件名中的公共前缀查找文件组 从而复制目录树的功能 但又不那么复杂 问题是 查找和过滤操作都是 O
  • 如何根据类的值将类对象添加到 hashMap 中?

    我正在从数据库中检索一些值 这些值需要添加到列表中 然后根据其值添加到具有特定键的 MAP 中 例如 row 1 name A category 1 row 2 name B category 2 row 3 name C category
  • Java HashMap.clear()和remove()内存有效吗?

    考虑以下HashMap clear code Removes all of the mappings from this map The map will be empty after this call returns public vo
  • 查找数组中出现奇数次的所有元素

    我遇到了以下问题 查找数组中出现奇数次的所有元素 我对此的想法是 Use HashMap 将数组中的值添加为HashMap中的键 每个键对应的值将是遇到该键的次数 使用快速排序以 O N log N 的方式对数组进行排序 然后遍历数组以检查
  • 迭代 Hashmap 时如何得到 ConcurrentModificationException?

    我正在尝试将键值对添加到迭代器方法内的哈希映射中 但这并没有给我ConcurrentModificationException Why 由于 Hashmap 是快速失败的 Map
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • 如何将数据存储在对象的对象列表中?

    我有以下代码 将年龄相同且得分最高的用户分组 我现在有而不是Map
  • equals 和 hashcode 的不同字段

    我同意这篇文章的声明在Java中重写equals和hashCode时应该考虑哪些问题 https stackoverflow com questions 27581 overriding equals and hashcode in jav
  • Java 弱哈希映射 - 需要根据值的弱点而不是键来删除条目

    所以JavaWeakHashMap让我们创建一个映射 如果其键变弱 则删除该映射的条目 但是我怎样才能创建一个Map 当它的条目被删除时values地图上变弱了 我想使用映射的原因是作为全局哈希表 它根据对象的 ID 跟踪对象 ID gt
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完

随机推荐

  • cloudstack guestnetwork vpc ingress/ergess介绍

    cloudstack的advance网络中可以创建的network如下 guestnetwork IsolatedNetwork vpc vpnCustomer gateway 这个应该不算一个网络 只是连接点 1 guestnetwork
  • mac下eclipse配置tomcat

    1 到 apache官方主页 http tomcat apache org 下载 Mac 版本的完整 tar gz文件包 解压拷贝到 Library 目录下 并命名为Tomcat 其他目录也可以 我这就以 Library做讲解 2 打开终端
  • 基于Java API 方式使用Java kafka在IDEA创建依赖

    在idea创建工程Maven 在pom xml添加如下依赖
  • Java编写的图书管理系统,窗体版本-003

    今天为大家分享一个java语言编写的图书管理程序 003 目前系统功能已经很全面 后续会进一步完善 整个系统界面漂亮 有完整得源码 希望大家可以喜欢 喜欢的帮忙点赞和关注 一起编程 一起进步 开发环境 开发语言为Java 开发环境Eclip
  • 数据库第十章——数据库恢复技术

    第十章 数据库恢复技术 文章目录 第十章 数据库恢复技术 一 事务的基本概念 一 基本概念 二 特性 二 数据库恢复概述 三 故障的种类 四 恢复的实现技术 如何建立冗余数据 一 数据转储 二 登记日志文件 五 恢复策略 如何利用冗余数据进
  • ruoyi cloud 用官方自带的工具更换包名出现的问题与解决办法

    使用ruoyi cloud官方的包生成后 有2点的修改很重要 1是所有带META INF spinrg文件夹的org springframework boot autoconfigure AutoConfiguration imports文
  • oracle10g异常日志查看

    oracle10g异常日志查看 警告日志 oracle product 10 2 0 db 1 admin orcl bdump alert orcl log 监听日志 oracle product 10 2 0 db 1 NETWORK
  • SpringMVC:从入门到精通,7篇系列篇带你全面掌握--三.使用SpringMVC完成增删改查

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 目录 Welcome Huihui s Code World 效果演示 一 导入项目的相关依赖 二 添加框架的配置文件 gen
  • 高效的公式提取神器Mathpix snipping Tool+ Mathtype

    推荐一个有用高效的公式提取神器Mathpix snipping Tool Mathtype Mathpix snip是一款功能强大 很有用的公式识别及复制软件 能够将已有的PDF或CAJ等文中的公式 纸上打印的公式 甚至在纸上手写的公式统统
  • 共享计算机后防火墙能开启,Windows XP中防火墙后如何实现共享

    通过开启Windows XP系统中内置的 Internet 连接防火墙 可以让我们安心的上网冲浪 但是在开启了 Internet 连接防火墙 之后 我们就会发现不能正常的使用 网络共享 功能了 Internet 连接防火墙 在阻挡恶意程序的
  • C语言将int类型存入char型

    最近在做算法题的时候遇到了一个问题 就是怎么将int类型的值变成当成字符串 字符数组 类型 例如 有个 int 1024 如何将整形的1024转为字符串类型 String 的1024或者字符数组 char 类型的1024呢 其实可以用ito
  • Vscode快速入门、 插件安装、插件位置、修改vscode默认引用插件的路径、在命令行总配置code、快捷键

    Vscode快速入门 这里写目录标题 安装 插件安装 Ctrl Shift X 插件商店 插件位置 默认位置 修改默认路径 修改vscode默认引用插件的路径 在命令行总配置code 基本操作 安装 Visual Studio Code 官
  • RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)

    入职公司后 公司要求组件化开发 经过讨论后我将网络请求框架单独进行了封装 不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下 导致里面部分代码耦合 后来为了降低耦合性又将 Common 拆分为了lib comm
  • Python 解决百钱买百鸡问题

    我国古代数学家张丘建在 算经 一书中曾提出过著名的 百钱买百鸡 问题 该问题叙述如下 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 则翁 母 雏各几何 翻译过来 意思是公鸡一个五块钱 母鸡一个三块钱 小鸡三个一块钱 现在要用一
  • Django开发员工管理系统(Part I)

    文章目录 1 准备工作 1 1 创建django项目 1 2 创建app 1 3 配置settings py文件 完成app注册 2 设计数据库表结构 3 在MySQL中生成表 3 1 创建数据库 3 2 修改配置文件 连接MySQL数据库
  • Nature:为啥室温超导支棱不起来

    克雷西 发自 凹非寺量子位 公众号 QbitAI 引发全球热议的LK 99风波告一段落后 Nature的一篇资讯头条再次提及了 室温超导 尽管对超导的热情一直不减 但随着一次又一次被证伪 人们很难不对 室温超导 慎之又慎 Nature的这篇
  • GitHub开源:狗屁不通文章生成器

    万字申请 废话报告 魔幻形式主义大作怎么写 GitHub开源狗屁不通文章生成器了解一下 只要输入一句话 系统就会给你一篇万字长文 查看源代码编写风格清新脱俗 并且毫无算法 简单暴力 直接在关键语句前后加上废话 名人名言 GitHub Git
  • 关系数据库中连接池的机制是什么?

    前提 为数据库连接建立一个缓冲池 1 从连接池获取或创建可用连接 2 使用完毕之后 把连接返回给连接池 3 在系统关闭前 断开所有连接并释放连接占用的系统资源 4 能够处理无效连接 限制连接池中的连接总数不低于或者不超过某个限定值 其中有几
  • 模式识别之分类器

    常见分类器介绍 1 SVM分类器 监督学习分类器 答 训练样本必须先标识不同类别 然后进行训练 SVM算法就是找一个超平面 对于已经被标记的训练样本 SVM训练得到一个超平面 使得两个类别训练集中距离超平面最近的样本之间的垂直距离要最大 也
  • Java--Map和HashMap基础

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V