学习大数据,所必需的java基础(6)

文章目录

  • 集合
    • Set集合介绍
    • HashSet集合的介绍和使用
    • LinkedHashSet的介绍以及使用
    • 哈希值
    • 哈希值的计算方式
    • HashSet的存储去重的过程
  • Map集合
    • Map的介绍
    • HashMap的介绍以及使用
    • HashMap的两种遍历方式
      • 方式1:获取key,然后再根据key获取value
      • 方式2:同时获取key和value
    • HashMap存储自定义对象
    • Map的练习
    • LinkedHashMap
  • TreeSet
  • TreeMap
  • HashTable和Vector集合
    • HashTable集合
    • Vector集合
  • Properties集合(属性值)
    • List嵌套Map
    • Map嵌套map
  • 哈希表结构存储过程
    • HashMap无参数构造方法的分析
    • HashMap有参数的构造方法的分析
    • tableSizeFor方法分析
    • Node内部类的分析
    • 存储元素的put方法源码
    • putVal方法源码
    • resize方法的扩充计算
    • 确定元素存储的索引
    • 遇到重复哈希值的对象

集合

Set集合介绍

1.概述:set是一个接口,是Collection下的子接口
2.使用:
a.所用的方法和Collection接口中的方法一模一样
b.set接口中的方法并没有堆Collection中的方法进行任何的扩充
c.set以及下面所有的实现类集合相当是一个傀儡
因为所用的set集合底层都是依靠map集合实现的

HashSet集合的介绍和使用

1.概述:HashSet是Set接口的实现类对象
2.特点
a.元素无序
b.元素不可重复
c.无索引
d.线程不安全
3.数据结构:哈希表
jdk8之前: 哈希表 = 数组+链表
jdk8之后:哈希表 = 数组+链表+红黑树
方法
和Collection一模一样

import java.util.HashSet;
import java.util.Iterator;

public class test08 {
    public static void main(String[] args) {
        final HashSet<String> set = new HashSet<>();
        set.add("张三");
        set.add("李四");
        set.add("王五");
        set.add("孙六");
        System.out.println(set);
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("=======================");
        for (String s : set) {
            System.out.println(s);
        }
    }
}

运行结果
在这里插入图片描述

LinkedHashSet的介绍以及使用

概述 LinkedHashSet extends HashSet
特点:
a.元素有序
b.元素布克重复
c.无索引
d.线程不安全
数据结构
哈希表+双向链表
使用 和HashSet一样

public static void main(String[] args) {
        final HashSet<String> set = new HashSet<>();
        set.add("张三");
        set.add("李四");
        set.add("王五");
        set.add("孙六");
        set.add("张三");
        System.out.println(set);
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("=======================");
        for (String s : set) {
            System.out.println(s);
        }
    }

哈希值

概述 计算机计算出来的一个十进制数,我们可以理解为是对象的地址值
获取哈希值:Object类中的
int hashCode()
结论:
如果内容一样,哈希值一定一样
如果内容同不用,哈希值也有可能不一样

public class test10 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println("==================");
        String s3 = "通话";
        String s4 = "重地";
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
    }
}

运行结果
在这里插入图片描述

哈希值的计算方式

通过进入String的hashCode方法,查看相关的代码

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

从上述代码中看到31作为常量相乘,31是一个质数,因为31这个数可以尽可能的解决哈希碰撞问题
尽量的不出现,内容不一样,但是哈希值一样的问题

HashSet的存储去重的过程

1.计算元素的哈希值,比较元素哈希值
2.如果哈希值不一样,直接存
3.如果哈希值一样,再比较内容(equals)
4.如果哈希值不一样,内容一样,存
5.如果哈希值一样,内容一样,去重复,后面的会把前面的覆盖掉

Map集合

Map的介绍

概述:双列集合的顶级接口
组成部分
一个元素是有两部分构成
key = value ----- 键值对

HashMap的介绍以及使用

概述:是Map的实现类
特点:
a.元素无序
b.key唯一,value可重复
c.无索引
d.线程不安全
数据结构:哈希表
常用方法
V put(K key, V value) -> 存储元素
V remove(Object key) ->根据key删除对应的键值对
V get(Object key) -> 根据key获取对应的value
boolean containsKey(Object key) ->判断Map中是否包含指定的key
Collection values() -> 将Map中所有的value存储到Collection集合中

Set keySet() -> 将Map中所有的key获取出来存到Set集合中
Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中

public class test {
    public static void main(String[] args) {
        final HashMap<Integer, String> set = new HashMap<>();
        //存储元素
        set.put(0001,"李云龙");
        set.put(0002,"丁伟");
        set.put(0003,"孔捷");
        System.out.println(set);
        //根据key删除对应的键值对
        set.remove(0001);
        System.out.println(set);
        //根据key获取对应的Value
        System.out.println(set.get(2));
        //判断map中是否含有指定的key
        System.out.println(set.containsKey(1));
    }
}

注意 如果key重复了,后米的会把前面的覆盖掉,去重复过程和set一模一样

HashMap的两种遍历方式

方式1:获取key,然后再根据key获取value

Set keySet() ----- 将Map中所有的key获取出来存到Set集合中

public class test02 {
    public static void main(String[] args) {
        final HashMap<Integer, Object> hashMap = new HashMap<>();
        hashMap.put(1,"李云龙");
        hashMap.put(2,"丁伟");
        hashMap.put(3,"孔捷");
        /*
        * 先调用keySet方法,获取map中所有的key,存储到Set集合中
        * 遍历Set集合,调用map中的get方法,根据key获取value
        * */
        Set<Integer> set = hashMap.keySet();
        for (Integer key : set) {
            String value = (String) hashMap.get(key);
            System.out.println(key + "....." + value);
        }
    }
}

方式2:同时获取key和value

Set<Map.Entry<K,V>> entrySet() — 获取Map中所有的键值对对象,放到set集合中
1.我们只需要获取到每个键值对的条目就行了
2.拿到条目,就能拿到条目上的key和value
3.记录key和value的条目, Map中的静态接口 — Map.Entry

Map.Entry中有两个方法
getKey() 获取key
getValue() 获取value

Set<Map.Entry<Integer, Object>> set1 = hashMap.entrySet();
        for (Map.Entry<Integer, Object> integerObjectEntry : set1) {
            Integer key = integerObjectEntry.getKey();
            String value = (String) integerObjectEntry.getValue();
            System.out.println(key + "...." + value);
        }

HashMap存储自定义对象

1.key存储自定义对象,value类型随意
2.需要key重写hashCode和equals方法
相关代码

public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

public class test03 {
    public static void main(String[] args) {
        HashMap<Person, String> hashMap = new HashMap<>();
        hashMap.put(new Person("李云龙",18),"独立团");
        hashMap.put(new Person("孔捷",26),"新一团");
        hashMap.put(new Person("丁伟",26),"新二团");

        System.out.println(hashMap);
    }
}

Map的练习

需求:用Map集合统计字符串中每一个字符出现的次数
步骤
1.创建Scanner对象,调用next方法录入字符串
2.创建HashMap集合,key为String用于存储字符串,value作为Integer用于存储字符对应的个数
3.遍历字符串,判断,集合中有没有该字符
4.如果没有,将该字符以及对用的1存到Map集合中
5.如果有,根据该字符获取对用的value,对value进行加一
6.将该字符以及对用的value值存进去
7.输出

public class test03 {
    public static void main(String[] args) {
        System.out.println("请输入字符串");
        final Scanner scanner = new Scanner(System.in);
        String data = scanner.next();
        final HashMap<String, Integer> hashMap = new HashMap<>();
        char[] chars = data.toCharArray();
        for (char aChar : chars) {
            String achar = aChar + "";
            if (!hashMap.containsKey(achar)){
                hashMap.put(achar,1);
            }else {
                int value = hashMap.get(achar);
                value ++;
                hashMap.put(achar,value);
            }
        }
        System.out.println(hashMap);
    }
}

LinkedHashMap

概述 LinkedHashMap extends HashMap
特点:
a.有序
b.无索引
c.key唯一,value可重复
d.线程不安全
数据结构
哈希表+双向链表
用法:和HashMap一样

public class test04 {
    public static void main(String[] args) {
        final LinkedHashMap<String, String> hashMap = new LinkedHashMap<>();
        hashMap.put("001","李云龙");
        hashMap.put("002","丁伟");
        hashMap.put("003","孔捷");
        System.out.println(hashMap);
        //使用keyset方式遍历
        final Set<String> set = hashMap.keySet();
        for (String s : set) {
            final String s1 = hashMap.get(s);
            System.out.println(s+"...."+s1);
        }
        //使用entrySet方式遍历
        final Set<Map.Entry<String, String>> entries = hashMap.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+ "...." +entry.getValue());
        }
    }
}

TreeSet

1.概述:ThreeSet是Set接口的实现类
2.特点:
a.可以对元素进行排序
b.元素唯一
c.无索引
d.线程不安全
3.数据结构
红黑树
4.方法 和HashSet一样

构造
TreeSet() — 对元素进行自然排序 ---- ASCII
TreeSet(Comparator<? suoer E> comparator) ----------- 按照指定规则进行排序

相关练习代码

public class Person {
    private String name;
    private int age;

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

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

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
import java.util.Comparator;
import java.util.TreeSet;

public class test05 {
    public static void main(String[] args) {
        final TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("d");
        treeSet.add("a");
        treeSet.add("v");
        treeSet.add("c");
        treeSet.add("e");
        System.out.println(treeSet);
        System.out.println("=================");
        final TreeSet<Person> people = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        people.add(new Person("李云龙",30));
        people.add(new Person("丁伟",21));
        people.add(new Person("孔捷",42));
        System.out.println(people);
    }
}

TreeMap

1.概述:TreeMap是Map接口的实现类
2.特点:
a.可以对key进行排序
b.无索引
c.线程不安全
3.数据结构:
红黑树
4.方法:
和HashMao一样

1.构造:
TreeMap() -> 按照自然顺序对key进行排序
TreeMap(Comparator<? super K> comparator)-> 按照指定规则对key进行排序

public class test06 {
    public static void main(String[] args) {
        final TreeMap<String, String> treeMap = new TreeMap<>();
        treeMap.put("a","宝儿姐");
        treeMap.put("b","张之维");
        treeMap.put("c","王也");
        treeMap.put("e","张楚岚");
        System.out.println(treeMap);
        System.out.println("====================");
        final TreeMap<Person, String> treeMap1 = new TreeMap<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        treeMap1.put(new Person("李云龙",32),"独立团");
        treeMap1.put(new Person("丁伟",42),"新一团");
        treeMap1.put(new Person("孔捷",33),"新二团");
        System.out.println(treeMap1);
    }
}

HashTable和Vector集合

HashTable集合

1.概述:是Map的实现类
2.特点:
a.无序
b.key唯一,value可重复
c.无索引
d.线程安全
3.数据结构
哈希表
4.用法
和HashMap一样

public class test07 {
    public static void main(String[] args) {
        final Hashtable<String, String> hashtable = new Hashtable<>();
        hashtable.put("老天师","张之维");
        hashtable.put("不要碧莲","张楚岚");
        hashtable.put("土豪道士","王也");
        System.out.println(hashtable);
    }
}

Vector集合

1.概述 是Collection的实现类
2.特点
a.有序
b.有索引
c.元素可重复
d.线程安全
3.数据结构
数组
4.用法 和ArrayList一样
5.底层分析:
a.Vector ---- new底层会直接产生一个长度为10 的空数组
b.数组扩容 Arrays.copyof 扩容两倍

public class test08 {
    public static void main(String[] args) {
        final Vector<String> vector = new Vector<>();
        vector.add("李云龙");
        vector.add("丁伟");
        vector.add("孔捷");
        System.out.println("vector = " + vector);
    }
}

HashMap和Hashtable的区别
1.相同点
key唯一,无索引,元素无序,底层都是哈希表
2.不同点
HashMap线程不安全,允许有null键null值
Hashtable线程安全,不允许有null键null值

Properties集合(属性值)

1.概述:Properties是Hashtable的子类
2.特点
a.无序
b.key唯一,value可重复
c.无索引
d.线程安全
e.Properties的key的value类型默认是String
f.不允许有null键null值
3.数据结构
哈希表
4.用法:
可以使用HashMap的方法
5.特有方法
Object setProperty(String key, String value) -> 存储键值对
String getProperty(String key) -> 根据key获取value
Set stringPropertyNames() -> 获取所有的key,存放到Set集合中
void load(InputStream inStream) -> 将流中的数据信息加载到Properties集合中

public class test01 {
    public static void main(String[] args) {
        final Properties properties = new Properties();
        //将键值对存入集合
        properties.setProperty("username","root");
        properties.setProperty("password","1234");
        System.out.println("properties = " + properties);
        //根据key获取相应的value
        System.out.println(properties.getProperty("username"));
        //获取所有的key,存放到set集合中和keyset方法效果一致
        final Set<String> set = properties.stringPropertyNames();
        for (String s : set) {
            System.out.println(properties.getProperty(s)+"...."+s);
        }
    }
}

List嵌套Map

需求:
一班有四名同学。学号和姓名分别为:
1=张楚岚,2=冯宝宝,3=王也,4=诸葛青
二班有三名同学,分别为:
1=张之维,2=张灵玉 3=夏禾
将同学的信息以键值对形式存入到2个Map集合中,再将2个map集合存储到list集合中

public class test02 {
    public static void main(String[] args) {
        final HashMap<Integer, String> hashMap = new HashMap<>();
        final HashMap<Integer, String> hashMap1 = new HashMap<>();
        hashMap.put(1,"张楚岚");
        hashMap.put(2,"冯宝宝");
        hashMap.put(3,"王也");
        hashMap.put(4,"诸葛青");
        hashMap1.put(1,"张之维");
        hashMap1.put(2,"张灵玉");
        hashMap1.put(3,"夏禾");
        final ArrayList<HashMap<Integer,String>> list = new ArrayList<>();
        list.add(hashMap);
        list.add(hashMap1);
        //遍历列表
        for (HashMap<Integer, String> integerStringHashMap : list) {
            final Set<Map.Entry<Integer, String>> entries = integerStringHashMap.entrySet();
            for (Map.Entry<Integer, String> entry : entries) {
                System.out.println(entry.getKey()+"..."+entry.getValue());
            }
        }
    }
}

Map嵌套map

javaSE集合存储的是学号 键,值学生姓名
1 张三
2 李四
javaEE 结合存储的是学号 键,值学生姓名
1 王五
2 赵六

public class test03 {
    public static void main(String[] args) {
        final HashMap<Integer, String> hashMap = new HashMap<>();
        final HashMap<Integer, String> hashMap1 = new HashMap<>();
        hashMap.put(1,"张三");
        hashMap.put(2,"李四");
        hashMap1.put(1,"王五");
        hashMap1.put(2,"田六");
        final HashMap<HashMap<Integer,String>, String> map = new HashMap<>();
        map.put(hashMap,"javaSE");
        map.put(hashMap1,"javaEE");
        //遍历大map
        final Set<Map.Entry<HashMap<Integer, String>, String>> entries = map.entrySet();
        for (Map.Entry<HashMap<Integer, String>, String> entry : entries) {
            System.out.println(entry.getKey()+"...."+entry.getValue());
        }
    }
}

哈希表结构存储过程

在这里插入图片描述
要知道的点
a.在不指定长度时,哈希表中的数组默认长度为16,HashMap创建出来,一开始没有床架长度为16的数组
b.在第一次put的时候,底层会创建出来长度为16的数组
c.哈希表中有一个数据加【加载因子】---- 默认为0.75(加载因子)---- 代表当元素存储到百分之七十五的时候要扩容了—0–2倍
d.如果元素的哈希值出现相同,内容不一样时,就会在同一个索引上以链表的形式存储,当链表长度达到8,并且当前数组长度>64时,链表就会改成使用红黑树存储
e.加入红黑树目的:查询快
面试时可能会问到的变量
default_initial_capacity:HashMap默认容量 16
defaul_load_factor:HashMap默认加载因子 0.75f
threshold 扩充的临界值 等于 容量8*0.75 =12 第一次扩容
threeify_threshold: 链表长度默认值,转为红黑树:8
min_treeify_capacity: 链表被树化时最小的数组容量 64

HashMap无参数构造方法的分析

HashMap中的静态成员变量

static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

解析:使用无参数构造方法创建HashMap对象,将加载因子设置成默认的加载因子,loadfactor=0.75

HashMap有参数的构造方法的分析

解析 如果带有参数构造方法,传递哈希表的初始化容量和加载因子

HashMap(int initialCapacity, float loadFactor) ->创建Map集合的时候指定底层数组长度以及加载因子
    
public HashMap(int initialCapacity, float loadFactor) {
//如果初始化容量小于0,直接抛出异常
    if (initialCapacity < 0)
    	throw new IllegalArgumentException("Illegal initial capacity: " +
    initialCapacity);
//如果初始化容量大于最大容量,初始化容量直接等于最大容量
    if (initialCapacity > MAXIMUM_CAPACITY)
    	initialCapacity = MAXIMUM_CAPACITY;
//如果loadFactor(加载因子)小于等于0,直接抛出异常
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
    	throw new IllegalArgumentException("Illegal load factor: " +
    loadFactor);
    this.loadFactor = loadFactor;
    this.threshold = tableSizeFor(initialCapacity);//10

tableSizeFor方法分析

tableSizeFor(initCapacity)方法计算哈希表的初始化容量
注意 哈希表是进行计算得出的容量,而初始化容量不直接等于我们传递的参数。
8 4 2 1规则—无论指定了多少容量,最终经过tableSizeFor这个方法计算以后,都会遵守8421规则去初始化列表容量
解析:该方法对我们传递的初始化容量进行位移运算,位移的结果是8421码
例如传递2,结果还是2,传递的是4,结果还是4
传递3,结果传递4,传递5,结果是8,传递20,结果是32

Node内部类的分析

哈希表是采用数组加链表的实现方法
HashMap中的内部类Node非常重要,证明HashSet是一个单向链表

 static class Node<K,V> implements Map.Entry<K,V> {
     final int hash;
     final K key;
     V value;
     Node<K,V> next;
 Node(int hash, K key, V value, Node<K,V> next) {
     this.hash = hash;
     this.key = key;
     this.value = value;
     this.next = next;
}

解析:内部类Node中具有四个成员变量
hash 对象的哈希值
key 作为键的对象
value 作为值的对象
next,下一个节点对象

存储元素的put方法源码

public V put(K key, V value) {
	return putVal(hash(key), key, value, false, true);
}

解析:put方法中调用putVal方法,putVal方法中调用hash方法
hash(key)方法;传递要存储的元素,获取对象的哈希值
putVal方法:传递对象哈希值和要存储的对象key

putVal方法源码

Node<K,V>[] tab; Node<K,V> p; int n, i;
	if ((tab = table) == null || (n = tab.length) == 0)
		n = (tab = resize()).length;

解析,方法中进行Node对象数组的判断,如果数组是null或者长度等于0,那么就会调用resize()方法进行数组的扩充

resize方法的扩充计算

if (oldCap > 0) {
     if (oldCap >= MAXIMUM_CAPACITY) {
         threshold = Integer.MAX_VALUE;
         return oldTab;
     }
     else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
              oldCap >= DEFAULT_INITIAL_CAPACITY)
         newThr = oldThr << 1; // double threshold
}

解析:计算结果,新的数组容量 = 原始数组容量 <<1,也就是乘以2

确定元素存储的索引

if ((p = tab[i = (n - 1) & hash]) == null)
	 tab[i] = newNode(hash, key, value, null);

解析:i = (数组长度-1) & 对象的哈希值,会得到一个索引,然后在此索引下tab[i],创建链表对象。不同的哈希值的对象,也是有可能存储在同一个数组索引下

遇到重复哈希值的对象

 Node<K,V> e; K k;
 if (p.hash == hash &&
 	((k = p.key) == key || (key != null && key.equals(k))))
		 e = p;

解析 如果对象的哈希值相同,对象的equals方法返回true,判断为一个对象,进行覆盖操作

else {
     for (int binCount = 0; ; ++binCount) {
     	if ((e = p.next) == null) {
     		p.next = newNode(hash, key, value, null);
     	if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
     		treeifyBin(tab, hash);
     	break;
 }

解析:如果对象哈希值相同吗,但是对象的equals方法返回false,将对此链表进行遍历
当链表没有下一个节点的时候,创建下一个节点存储对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/416110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

trie树(前缀树)

前缀树 1. 前缀树的的介绍2.前缀树的实现2.1插入功能2.2删除功能2.3查找前缀和查找单词功能2.4 哈希表版本 1. 前缀树的的介绍 在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是…

《Spring Security 简易速速上手小册》第1章 Spring Security 概述(2024 最新版)

文章目录 1.1 Spring Security 的重要性1.1.1 基础知识详解1.1.2 主要案例&#xff1a;用户认证与授权1.1.3 拓展案例 1&#xff1a;OAuth2 社交登录1.1.4 拓展案例 2&#xff1a;JWT 认证 1.2 Spring Security 的核心特性1.2.1 基础知识详解1.2.2 主要案例&#xff1a;基于角色…

11.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏接收网络数据包的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接管游戏发送数据的操作 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;8256eb53e8c16281bc1a29cb8d26d352bb5bbf4c 代…

Android Duplicate class 排除重复类

一、起因&#xff1a; 在迭代开发的时候&#xff0c;发现2个ijk很多类重复。但又2个库实现的功能是不一样&#xff0c;目前不能合并。但又想保留2个功能。需要排除其中一个库。 二、报错如何下图&#xff1a; 三、解决方法&#xff1a; 3.1 在terminal 也就是命令行处输入 …

js 面试 什么是WebSockets?HTTP和HTTPS有什么不同?web worker是什么?

概念&#xff1a; webSocket 是一种在客户端和服务端之间建立持久连接的协议&#xff0c;它提供全双工通信通道&#xff0c;是服务器可以主动向客户端推送数据&#xff0c;同时也可以接受客户端发送的数据。 1 webSocket与https区别&#xff1f; 在网络通信中&#xff0c;We…

【mysql版本修改】

1、使用telnet确认当前mysql版本号 telnet <MySQL服务器IP地址> <MySQL端口号> telnet 192.168.38.20 33062、使用strings查看/usr/sbin/mysqld中包含版本号的字符串 # 查看/usr/sbin/mysqld文件中是否包含对应的版本号 strings /usr/sbin/mysqld | grep 5.7.30 …

Unity | 动态读取C#程序集实现热更新

目录 一、动态语言 二、创建C#dll 1.VS中创建一个C#语言的库工程 2.添加UnityEngine.dll的依赖 3.编写代码&#xff0c;生成dll 三、Unity使用dll 一、动态语言 计算机编程语言可以根据它们如何将源代码转换为可以执行的代码来分类为静态语言和动态语言。 静态语言&…

Spark Bloom Filter Join

1 综述 1.1 目的 Bloom Filter Join&#xff0c;或者说Row-level Runtime Filtering&#xff08;还额外有一条Semi-Join分支&#xff09;&#xff0c;是Spark 3.3对运行时过滤的一个最新补充   之前运行时过滤主要有两个&#xff1a;动态分区裁剪DPP&#xff08;开源实现&am…

ISO_IEC_18598-2016自动化基础设施管理(AIM)系统国际标准解读(一)

██ ISO_IEC_18598-2016是什么标准&#xff1f; ISO/IEC 18598国际标准是由ISO&#xff08;国际标准化组织&#xff09;/IEC&#xff08;国际电工委员会&#xff09;联合技术委员会1-信息技术的第25分委员会-信息技术设备互连小组制定的关于信息基础设施自动化管理的国际标准&…

C++中atomic的使用

atomic使用 概述介绍使用场景头文件atomic的使用创建load()store()exchange()compare_exchange_weakcompare_exchange_strong&#xff08;&#xff09;fetch_add()fetch_sub()fetch_and()fetch_or()fetch_xor() 示例实现代码运行结果 概述 本文只要讲述C11中atomic的使用&…

一文读懂Prometheus和Grafana的区别(适合小白)

Prometheus和Grafana是两种开源软件&#xff0c;分别用于监控和可视化数据。它们的主要功能和特点如下&#xff1a; Prometheus 监控系统&#xff1a;Prometheus是一个专门用于收集和存储时间序列数据的监控系统。它可以从各种目标&#xff08;如服务器、数据库等&#xff09…

Spring中的事务和事务的传播机制

事务是一组操作的集合&#xff0c;不可以被分割。事务会把所有的操作作为一个整体&#xff0c;这组操作要么全部成功&#xff0c;要么全部失败。 事务有三种操作&#xff1a; 开启事务&#xff1b;提交事务&#xff1b;回滚事务。 如果代码的执行逻辑是这样&#xff1a; 开…

NutUI + taro +vue 开发遇到的问题 使用popup组件 内部元素滚动遇到的的问题

1 popup 弹出内容时 弹出的框内元素数据很长需要滚动时 本地可以正常滚动 打包成小程序后无法滚动 如这样的免责条款内容 代码如下 解决办法 1 把2处的单位换成百分比 弹框能滚动但是 是popup 里面所有的元素都一起滚动 导致标题都滚走了 2 scroll-y 改成&#xff1a; :scrol…

Excel数据表定制分组排序

实例需求&#xff1a;某学校体育活动统计表如下图左侧表格所示&#xff0c;数据按照班级排列&#xff0c;现在需要根据如下规格对表格进行排序 “幼儿”班级排列在表格最后按照“次数”降序排列“幼儿”班级同样按“次数”降序排列 排序结果如下图中右侧表格所示。 示例代码…

GDB之(8)GDB-Server远程调试

GDB之(8)GDB-Server远程调试 Author&#xff1a;Once Day Date&#xff1a;2024年2月27日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客 参考文档: 用GDB调试程序 _CSDN博客 _陈皓GDB: The GNU Project Debugger…

UE4c++ ConvertActorsToStaticMesh ConvertProceduralMeshToStaticMesh

UE4c ConvertActorsToStaticMesh 创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建蓝图函数UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量生成模型&#xff0c;我们把虚幻带有的方法迁移成函…

【数据结构与算法】回溯法解题20240229

【数据结构与算法】回溯法解题20240229 一、46. 全排列1、以[1,2,3]为例&#xff0c;抽象成树形结构2、回溯三部曲 二、LCR 084. 全排列 II1、以[1,1,2]为例&#xff0c;抽象成树形结构 三、面试题 08.07. 无重复字符串的排列组合四、面试题 08.08. 有重复字符串的排列组合 一、…

基于视觉识别的自动采摘机器人设计与实现

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展&#xff0c;农业生产效率与质量的提升成为重要的研究对象。其中&#xff0c;果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下&#xff0c;而且在劳…

163邮箱SMTP端口号及服务器地址详细设置?

163邮箱SMTP端口号是什么&#xff1f;163邮件SMTP设置教程&#xff1f; 除了基本的邮箱账号和密码外&#xff0c;还需要了解SMTP服务器地址和端口号&#xff0c;以及相应的设置。这些设置对于确保邮件能够顺利发送至关重要。下面&#xff0c;蜂邮EDM将详细介绍163邮箱SMTP端口…

http和https的区别是什么?

–前言 传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同 一、传输信息安全性不同 1、http协议&#xff1a;是超文本传输协议&#xff0c;信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息。 2、h…