Java入门基础16:集合框架1(Collection集合体系、List、Set)

集合体系结构

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

collection集合体系

Collection的常用方法

package com.itchinajie.d1_collection;import java.util.ArrayList;
import java.util.HashSet;/*
* 目标:认识Collection体系的特点。
* */
public class CollectionTest1 {public static void main(String[] args) {//简单确认一下Collection集合的特点。ArrayList<String> list=new ArrayList<>();//有序 可重复 有索引list.add("java1");list.add("java2");list.add("java1");list.add("java2");System.out.println(list);HashSet<String>set = new HashSet<>();set.add("java1");set.add("java2");set.add("java1");set.add("java2");set.add("java3");System.out.println(set);}
}package com.itchinajie.d1_collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;public class CollectionTest2API {public static void main(String[] args) {Collection<String> c = new ArrayList<>();// 多态写法//1.public boolean add(Ee):添加元素,添加成功返回true。c.add("java1");c.add("java1");c.add("java2");c.add("java2");c.add("java3");System.out.println(c);//2.public void clear():清空集合的元素。//c.clear();//system.out.println(c);//3.public boolean isEmpty():判断集合是否为空是空返回true,反之。System.out.println(c.isEmpty()); // false//4.public int size():获取集合的大小。System.out.println(c.size());//5.public boolean contains(object obj):判断集合中是否包含某个元素。System.out.println(c.contains("java1")); // trueSystem.out.println(c.contains("Java1")); // false//6.public boolean remove(Ee):删除某个元素:如果有多个重复元素默认删除前面的第一个!System.out.println(c.remove( "java1"));System.out.println(c);//7.public Object [] toArray();把集合转换成数组Object[] arr = c.toArray();System.out.println(Arrays.toString(arr));String[] arr2 = c.toArray(new String[c.size()]);System.out.println(Arrays.toString(arr2));System.out.println("------------------------------------");//把一个集合的全部数据倒入到另一个集合中去。Collection<String>c1 = new ArrayList<>();c1.add("java1");c1.add("java2");Collection<String> c2 = new ArrayList<>();c2.add("java3");c2.add("java4");c1.addAll(c2);//就是把c2集合的全部数据倒入到c1集合中去。System.out.println(c1);System.out.println(c2);}
}

Collection的遍历方式

迭代器

迭代器是用来遍历集合的专用方式(数组没有迭代器),在到ava中迭代器的代表是Iterator

package com.itchinajie.d2_collection_traverse;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*
* 目标:Collection集合遍历方式一:使迭代器Iterator遍历
* */
public class CollectionDemo1 {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("赵敏");c.add("小昭");c.add("素素");c.add("灭绝");System.out.println(c);//c=[赵敏,小昭,素素,灭绝]//                                       it//使用迭代器遍历集合//1、从集合对象中获取迭代器对象。Iterator<String> it = c.iterator();
//        System.out.println(it.next());
//        System.out.println(it.next());
//        System.out.println(it.next());
//        System.out.println(it.next());//System.out.println(it.next());//出现异常的//2、我们应该使用循环结合迭代器遍历集合。while (it.hasNext()){
//            String ele = it.next();
//            System.out.println(ele);System.out.println(it.next());}}
}

增强for

增强for可以用来遍历集合或者数组。

增强for遍历集合,本质就是迭代器遍历集合的简化写法。

package com.itchinajie.d2_collection_traverse;import java.util.ArrayList;
import java.util.Collection;/** 目标:Collection集合遍历方式二:增强for* */
public class CollectionDemo2 {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("赵敏");c.add("小昭");c.add("素素");c.add("灭绝");System.out.println(c);//c=[赵敏,小昭,素素,灭绝]//                    ele//使用增强for遍历集合或者数组。for (String ele : c){System.out.println(ele);}String[] names = {"迪丽热巴","古力娜扎","稀奇哈哈"};for (String name : names){System.out.println(name);}}
}

Lambda表达式

得益于刊DK8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。

package com.itchinajie.d2_collection_traverse;import java.util.ArrayList;
import java.util.Collection;/*
* 目标:Collection集合的遍历方式三:JDK8开始新增的lambda表达式(forEach方法)
* */
public class CollectionDemo3 {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("赵敏");c.add("小昭");c.add("殷素素");c.add("周芷若");System.out.println(c);//[赵敏,小昭,般素素,周芷若]//        s//default void forEach(Consumer<?superT>action): 结合Lambda表达式遍历集合://        c.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
//        //简化
//        c.forEach((String s) -> {
//                System.out.println(s);
//        });//简化
//        c.forEach( s -> {
//            System.out.println(s);
//        });//简化
//        c.forEach( s -> System.out.println(s));c.forEach( System.out::println);}
}

List系列集合

List集合的特有方法 List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。

List集合的特有方法

package com.itchinajie.d3_collection_list;import java.util.ArrayList;
import java.util.List;/**目标:掌握List系列集合的特点,以及其提供的特有方法。*/
public class ListTest1 {public static void main(String[] args) {//1.创建一个ArrayList集合对象(有序、可重复、有索引)List<String> list = new ArrayList<>();// 一行经典代码list.add("蜘蛛精");list.add("至尊宝");list.add("至尊宝");list.add("牛夫人");System.out.println(list);//【蜘蛛精,至尊宝,至尊宝,牛夫人]//2.public void add(int index,E element):在某个索引位置插入元素。list.add( 2,"紫霞仙子");System.out.println(list);//3.public E remove(int index):根据索引删除元素,返回被删除元素System.out.println(list.remove(2));System.out.println(list);//4.public E get(int index):返回集合中指定位置的元素。System.out.println(list.get(3));//5.public E set(int index,E element):修改索引位置处的元素,修改成功后,会返回原来的数据System.out.println(list.set(3,"牛魔王"));System.out.println(list);}
}

遍历方式

List集合支持的遍历方式:

1、for循环(因为List集合有索引)

2、迭代器

3、增强for循环(foreach遍历)

4、Lambda表达式

package com.itchinajie.d3_collection_list;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*
* List集合支持的遍历方式:
1、for循环(因为List集合有索引)
2、迭代器
3、增强for循环
4、Lambda表达式
* */
public class ListTest2 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("糖宝宝");list.add("蜘蛛精");list.add("至尊宝");//(1)for循环for (int i=0;i<list.size();i++){//i=012String s = list.get(i);System.out.println(s);}//(2)迭代器Iterator<String> it = list.iterator();while (it.hasNext()){System.out.println(it.next());}//(3)增强for循环(foreach循环)for (String s : list) {System.out.println(s);}//(4)JDK1.8开始之后的Lambda表达式list.forEach(s -> {System.out.println(s);});}
}

ArrayList集合的底层原理

特点

1、基于数组实现的

2、查询速度快(注意:是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同。

3、删除效率低:可能需要把后面很多的数据进行前移。

4、添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

底层原理

1、利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组;

2、添加第一个元素时,底层会创建一个新的长度为10的数组;

3、存满时,会扩容1.5倍;

4、如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。

ArrayList集合的应用原理

1、ArrayList适合:根据索I查询数据 ,比如根据随机索引数据(高效)!或者数据量 不是很大时!

2、ArrayList不适合:数据量大的同时 ,又要频繁的进行增删操作!

LinkedList集合的底层原理

基于双链表实现的。

什么是链表?有啥特点?

单项链表:链表的特点1: 查询慢,无论查询哪个数据都要从头开始找;
                  链表的特点2: 链表增删相对快。

双向链表(基于双链表实现):基于双链表实现的。
特点:查询慢,增删相对较快,
但对首尾元素进行增删改查的速度是极快的。

新增首尾操作的特有方法

LinkedList集合的应用场景

1、用来设计队列

2、用来设计栈

package com.itchinajie.d3_collection_list;import java.util.LinkedList;/**目标:掌握List系列集合的特点,以及其提供的特有方法。*/
public class ListTest3 {public static void main(String[] args) {//1、创建一个队列。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.removeFirst());System.out.println(queue);System.out.println("------------------------------------");//2、创建一个栈对象。LinkedList<String> stack = new LinkedList<>();//压栈
//        stack.addFirst("第1颗子弹");
//        stack.addFirst("第2颗子弹");
//        stack.addFirst("第3颗子弹");
//        stack.addFirst("第4颗子弹");stack.push("第1颗子弹");stack.push("第2颗子弹");stack.push("第3颗子弹");stack.push("第4颗子弹");System.out.println(stack);//出栈
//        System.out.println(stack.removeFirst());
//        System.out.println(stack.removeFirst());System.out.println(stack.pop());System.out.println(stack.pop());System.out.println(stack);}
}

set系列集合

package com.itchinajie.d4_collection_set;import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;/*
* 目标:整体了解一下Set系列集合的特点
* */
public class SetTest1 {public static void main(String[] args) {//1、创建一个Set集合的对象//Set<Integer>set =new HashSet<>();//创建了一个HashSet的集合对象。 一行经典代码 HashSet:无序不重复无索引,// 不支持索引操作,一般只会无序一次// Set<Integer> set = new LinkedHashSet<>();//有序 不重复 无索引Set<Integer> set =new TreeSet<>();//可排序(升序) 不重复 无索引set.add(666);set.add(555);set.add(555);set.add(888);set.add(888);set.add(777);set.add(777);System.out.println(set);}
}

HashSet

哈希值

就是一个int类型的数值,Java中每个对象都有一个哈希值。
Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。

package com.itchinajie.d4_collection_set;
/***目标:了解一下哈希值。*Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。* public int hashcode():返回对象的哈希值。*同一个对象多次调用hashCode方法返回的哈希值是相同的。*不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。*/
public class SetTest2 {public static void main(String[] args) {Student s1 = new Student("蜘蛛精",25,169.5);Student s2 = new Student("紫霞",24,166.5);System.out.println(s1.hashCode());System.out.println(s1.hashCode());System.out.println(s2.hashCode());String str = new String("abc");String str2 = new String("acD");System.out.println(str.hashCode());System.out.println(str2.hashCode());}
}

对象哈希值的特点

同一个对象多次调用hashCode()方法返回的哈希值是相同的。
不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。

HashSet的底层原理

了解一下数据结构(树)

1、普通二叉树(无用)

2、二叉查找树(二叉排序树)

小的存左边, 大的存右边, 一样的不存。

3、平衡二叉树(java常用)

4、java用的红黑树

深入理解HashSet集合去重复的机制。

HashSet集合默认不能对内容一样的两个不同对象去重复!

比如内容一样的两个学生对象存入到HashSet集合中去,HashSet集合是不能去重复的!

如何让HashSet集合能够实现对内容一样的两个不同对象也能去重复???

如果希望Set集合认为2个内容一样的对象是重复的 必须重写对象的hashCode()和equals()方法。

package com.itchinajie.d4_collection_set;import java.util.Objects;public class Student implements Comparable<Student>{private String name;private int age;private double height;
//方式一:让自定义的类(如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。@Overridepublic int compareTo(Student o) {//约定1:  如果左边的对象 大于 右边对象 请您返回正整数//约定2:  如果左边的对象 小于 右边对象 请您返回负整数//约定3:  如果左边的对象 等于 右边对象 请您返回0//按照年龄升序排序
//        if (this.age > o.age) {
//            return 1;
//        }else if (this.age < o.age){
//            return -1;
//        }
//        return 0;//return this.age - o.age;//升序return o.age - this.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;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public Student() {}public Student(String name, int age, double height) {this.name = name;this.age = age;this.height = height;}//容一样就只要两个对象内返回true@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name);}//只要两个对象内容一样,返回的哈希值就是一样的。@Overridepublic int hashCode() {return Objects.hash(name, age, height);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}package com.itchinajie.d4_collection_set;import java.util.HashSet;
import java.util.Set;public class SetTest3 {public static void main(String[] args) {Set<Student> students = new HashSet<>();Student s1 = new Student("至尊宝", 28, 169.6);Student s2 = new Student("蜘蛛精", 23, 169.6);Student s3 = new Student("蜘蛛精", 23, 169.6);System.out.println(s2.hashCode());System.out.println(s3.hashCode());Student s4 = new Student("牛魔王", 48, 169.6);students.add(s1);students.add(s2);students.add(s3);students.add(s4);System.out.println(students);}
}

LinkedHashSet

特点:有序、不重复、无索引。

底层原理

TreeSet

特点:不重复、无索引、可排序(默认升序排序,按照元素的大小,由小到大排序。

底层是基于红黑树实现的排序。

package com.itchinajie.d4_collection_set;import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;/*
* 目标:掌握TreeSet集合的使用
* */
public class SetTest4 {public static void main(String[] args) {Set<Integer> set1 = new TreeSet<>();set1.add(6);set1.add(5);set1.add(5);set1.add(7);System.out.println(set1);//方式一:让自定义的类(如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。//方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对像(比较器对象,用于指定比较规则)。// new 一个TreeSet的比较器对象的有参构造器,生成一个比较器对象,然后重写对象的匿名内部类//day04_oop -> src -> com.itchinajie -> d5_arrays 中讲过自定义排序规则//TreeSet就近选择自己自带的比较器对象进行排序Set<Student> students = new TreeSet<>(( o1,  o2) -> Double.compare(o1.getHeight(), o2.getHeight()));students.add(new Student("蜘蛛精",23,169.7));students.add(new Student("紫霞",22,169.8));students.add(new Student("至尊宝",26,165.5));students.add(new Student("牛魔王",22,183.5));System.out.println(students);}
}

自定义排序规则

小结

注意:集合的并发修改异常

package com.itchinajie.d5_collection_exception;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class collection_exception {public static void main(String[] args) {//需求:找出集合中全部带“李”的名字,并从集合中删除。List<String>  list = new ArrayList<>();list.add("王麻子");list.add("小李子");list.add("李爱花");list.add("张全蛋");list.add("晓李");list.add("李玉刚");System.out.println(list);//[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]//System.out.println("--------------------------------------");//需求:找出集合中全部带“李"的名字,并从集合中删除。
//        Iterator<String>it = list.iterator();
//        while (it.hasNext()){
//            String name = it.next();
//            if(name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);//报错//System.out.println("--------------------------------------");//使用for循环遍历集合并删除集合中带李字的名字//[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]
//        for (int i=0;i<list.size();i++){
//            String name = list.get(i);
//            if(name.contains("李")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);//出bug,需要在他的基础上加个i--//System.out.println("--------------------------------------");//怎么解决呢?//使用for循环遍历集合并刷除集合中带李字的名字//[王麻子,小李子,李爱花,张全蛋,晓李,李玉刚]//i
//        for (int i = 0;i<list.size();i++){
//            String name = list.get(i);
//            if(name.contains("李")) {
//                list.remove(name);
//                i--;
//            }
//        }
//        System.out.println(list);//加个i--也可以//倒着删除也可以System.out.println("--------------------------------------");//用迭代器正常删除的方式需求:找出集合中全部带“李”的名字,并从集合中删除。Iterator<String> it = list.iterator();while (it.hasNext()) {String name = it.next();if (name.contains("李")) {//List.remove(name);//并发修改异常的错误。it.remove();//删除迭代器当前遍历到的数据,每删除一个数据后,相当于也在底层做了i--}}System.out.println(list);//System.out.println("--------------------------------------");//使用增强for循环遍历集合并删除数据,没有办法解决bug的//由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强fo循环遍历集合,又在同时删//除集合中的数据时,程序也会出现并发修改异常的错误
//        for (String name : list){
//            if(name.contains("")){
//                list.remove(name);
//            }
//        }
//        System.out.println(list);//System.out.println("--------------------------------------");//使用lambda表达式也不行
//        list.forEach(name ->{
//            if(name.contains("李")){
//            list.remove(name);
//            }
//        });
//        System.out.println(list);}
}

(本章图片均来自于黑马程序员视频)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

靶机:DC-4

一、信息收集 1、主机发现 nmap 192.168.236.0/24 2、端口扫描 nmap 192.168.236.175 -p- -A 3、目录扫描 dirb http://192.168.236.175 二、漏洞探测 访问80端口&#xff0c;发现登录页面 尝试爆破密码 hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.236…

修改docker的/var/lib/docker/overlay2储存路径

目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…

Vue 3+Vite+Eectron从入门到实战系列之(五)一后台管理登录页

前面已经讲了不少基础知识&#xff0c;这篇开始&#xff0c;我们进行实操&#xff0c;做个后台管理系统&#xff0c;打包成多端的,可安装的桌面app!!其中&#xff0c;登录&#xff0c;退出的提示信息用系统的提示&#xff0c;不使用elemengplus的弹窗提示&#xff01;&#xff…

基于料面视频图像分析的高炉异常状态智能感知与识别

源自&#xff1a;自动化学报 作者&#xff1a;朱霁霖 桂卫华 蒋朝辉 陈致蓬 方怡静 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强化学习 …

shuishusihui

互斥量 使用互斥量可以用于保护某些临界资源&#xff0c;同一时间只能有一个任务来使用它。 使用互斥量会引入其他问题&#xff0c;比如说优先级反转&#xff0c;于是提出了优先级继承等方法解决问题 任务通知 任务通知就是通知任务&#xff0c;前边都是多对多的关系&#xff0…

从零开始构建基于ChatGPT的嵌入式(Embedding)本地医疗客服问答机器人模型(看完就会,看到最后有惊喜)

1、前言 代码全部开源,GitHub地址为: github.com/aehyok/go-o… 前端完全也能搭建&#xff0c; 前端完全也能搭建&#xff0c; 前端完全也能搭建&#xff0c; 本文中我使用的是后端语言golang,来调用的所有外部接口&#xff0c;但它们均是restful api,所以如果你使用的是其他…

此处不允许使用 ‘空‘ 类型

说明&#xff1a;受最近看的书《设计模式之美》&#xff08;小争哥&#xff09;的影响&#xff0c;最近编码有意将一些业务逻辑写在对象里面&#xff0c;增强封装性。在此记录一次项目启动时的报错&#xff0c;如下&#xff1a; 原因&#xff1a;当你在实体类对象中&#xff0c…

提升医疗器械维修技术必经的几个阶段

01 懵懂入门阶段 初入医疗器械维修领域&#xff0c;就如同踏入了一个充满未知的神秘世界。此时&#xff0c;菜鸟们对各种医疗器械的了解仅限于书本知识和简单的操作培训。他们可能刚刚熟悉了一些基本工具的使用方法&#xff0c;对常见的医疗器械类型和品牌有了初步的认识&#…

java设计模式-桥接模式

一. 概述 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。桥接模式主要目的是解决当一个类存在多个继承等级时&#xff0c;由于继承带来的耦合问题&#xff0c;以及扩展性不…

计算机网络408考研 2015

计算机网络408考研2015年真题解析_哔哩哔哩_bilibili 1 1线路编码(NRZ,NRZI,8B/10B,Manchester)与加扰_nrz编码-CSDN博客 1 1 11

19c做好这件事,大幅提升Data Pump工作效率

老司机遇到的新问题 expdp是Oracle 10g引入的数据导出工具&#xff0c;能够提供并行、压缩及元数据导出等更多的功能&#xff0c;在后续的版本中逐渐替代了传统的数据导出工具exp&#xff0c;是数据库开发运维常用的工具之一。在我的印象中&#xff0c;这个工具除了诸如大量的…

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者&#xff1a;移动通信集团河北有限公司架构规划专家&#xff0c;房瑞 项目背景&#xff1a; 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召&#xff0c;以磐舟&磐基云原生为底座&#xff0c;结合国产浏览器、中间件、数据库、操作系统和服务器等&a…

Jupyter Notebook介绍、安装及使用教程

文章目录 一.什么是Jupyter Notebook&#xff1f;1.Jupyter Notebok简介2.组成部分3.Jupyter Notebook的主要特点 二.安装Jupyter Notebook0.先试用再决定1.安装①安装前提②使用Anaconda安装③使用pip命令安装 三.运行Jupyter Notebook0.帮助1.启动①默认端口启动②指定端口启…

零基础学会机器学习,到底要多久?

这两天啊&#xff0c;有不少朋友和我说&#xff0c;想学机器学习&#xff0c;但是之前没有基础&#xff0c;不知道能不能学得会。 首先说结论&#xff0c;只要坚持&#xff0c;就能学会&#xff0c;但是一定不能三天打鱼两天晒网&#xff0c;要持之以恒&#xff0c;至少每隔两…

自由职业四年,我整理了一些建议

我是勋荣&#xff0c;一个独立开发者。运营了自己的社群&#xff0c;有自己的软件产品。目前还在探索各种副业的路上~ 1我的独立开发之路 刚毕业就找不到Android岗位的我瑟瑟发抖。在广州&#xff0c;稀里糊涂做了Java后端开发。有一天加班 通宵&#xff0c;早上借住在同事家…

Python教程(十三):常用内置模块详解

目录 专栏列表1. os 模块2. sys 模块3. re 模块4. json 模块5. datetime 模块6. math 模块7. random 模块8. collections 模块9. itertools 模块10. threading 模块11. 加密 模块 总结 专栏列表 Python教程&#xff08;十&#xff09;&#xff1a;面向对象编程&#xff08;OOP…

【MySQL】什么是索引?了解索引的底层原理

索引的概念 索引是一种用于提高数据库查询效率的数据结构。它类似于书籍的目录&#xff0c;通过快速定位数据的方式&#xff0c;减少了数据检索的时间。索引在数据库表中可以被看作是一个指向数据的指针&#xff0c;它们存储了列的值及其对应行的位置&#xff0c;从而使得数据…

Java面试八股之消息队列有哪些协议?各种协议有哪些具体实现

消息队列有哪些协议&#xff1f;各种协议有哪些具体实现 消息队列协议是指在消息队列系统中&#xff0c;用于消息的发送、接收和管理的一套通信规则。不同的协议有着不同的特性和应用场景&#xff0c;以下是一些常见的消息队列协议及其具体实现&#xff1a; AMQP (Advanced M…

某通用系统0day审计过程

前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单)&#xff0c;禁止未经允许进行转载&#xff0c;发布到博客的用意主要是想跟师傅们能够交流下审计的思路&#xff0c;毕竟审计的思路也是有说法的&#xff0c;或者是相互源码共享也OK&…

mfc140.dll丢失如何修复,一步步教你如何解决mfc140.dll丢失,让电脑快速恢复正常状态!

mfc140.dll是 Microsoft Foundation Class (MFC) Library 的一部分&#xff0c;它是一个用于开发 Windows 应用程序的 C 库。当系统报告mfc140.dll丢失时&#xff0c;通常意味着某个应用程序需要这个 DLL 文件来运行&#xff0c;但系统中没有找到它。那么mfc140.dll丢失如何修复…