Java集合之单列集合

2023-11-20

分类

集合分为单列集合(Collection)和双列集合(Map)

单列集合的体系结构

List集合和Set集合的区别

  •  List系列集合:添加元素是有序的(添加的顺序,而非数据的大小顺序)、可重复、有索引
  • Set系列集合:添加的元素是无序的(添加的顺序,而非数据的大小顺序,并且是可能不是有序的)、不可重复、无索引

contains方法细节

  • 底层是依赖equals方法进行判断自定义对象是否存在的
  • 要想通过contains方法判断自定义对象是否存在集合中,就必须在自定义对象类中重写equals方法,因为如果自定义类中没有重写equals方法,它会默认使用Object类中的equals方法进行判断,而Object类中的equals方法是通过地址值进行判断的。
    @Override
    public 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 &&
                Objects.equals( name, student.name );
    }
public class Test01 {
    public static void main(String[] args) {
        Student stu = new Student( "来一沓Java", 18 );
        Collection<Student> coll = new ArrayList<Student>();
        coll.add( stu );
        Student stu1 = new Student( "来一沓Java", 18 );
        boolean b = coll.contains( stu1 );
        System.out.println(b);//true
    }
}

集合遍历方式

Collection的通用遍历方式有四三种,增强for循环遍历、迭代器遍历、Lambda表达式遍历

 迭代器遍历

迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式

Collection集合获取迭代器

Iterator<E> iterator():返回迭代器对象,默认指向当前集合的0索引

Iterator中常用的方法

Boolean hasNext():判断当前位置是否有元素,有返回true,没有返回false

E next():获取当前位置的元素,并将迭代器对象移向下一个位置

public class Test01 {
    public static void main(String[] args) {
        Collection<String> col = new ArrayList<>();
        col.add( "今" );
        col.add( "天" );
        col.add( "学" );
        col.add( "习" );
        col.add( "了" );
        col.add( "吗" );
        col.add( "?" );

        Iterator<String> iterator = col.iterator();//获取迭代器对象
        while (iterator.hasNext()){//判断当前位置是否有元素
            String s = iterator.next();//获取当前位置的元素
            System.out.print( s);
        }
    }
}

 细节注意

  • 如果迭代器已经指向最后的位置且没有元素,还要强行调用next方法获取元素,就会报NoSuchElementException
  • 迭代器遍历完毕后,指针是不会复位的
  • 循环中只能调用一次next方法
  • 迭代器遍历时,不能用集合的方法进行增加或删除元素

增强for遍历

  •  增强for的底层就是一个迭代器,为了简化迭代器的代码书写的
  • 它是JDK5之后出现的,内部原理就是一个Iterator迭代器
  • 所有的单列集合和数组才能用增强for进行遍历
public class Test02 {
    public static void main(String[] args) {
        Collection<String> col = new ArrayList<>();
        col.add( "今" );
        col.add( "天" );
        col.add( "学" );
        col.add( "习" );
        col.add( "了" );
        col.add( "吗" );
        col.add( "?" );
        for (String s : col) {
            System.out.print(s);
        }
    }
}

注意细节

修改增强for中的变量,是不会改变集合原来的数据 

Lambda表达式遍历

JDK8开始出现的,是一种简单直接的遍历集合的方式

public class Test03 {
    public static void main(String[] args) {
        Collection<String> col = new ArrayList<>();
        col.add( "今" );
        col.add( "天" );
        col.add( "学" );
        col.add( "习" );
        col.add( "了" );
        col.add( "吗" );
        col.add( "?" );
        //forEach方法底层原理:其实也会自己遍历,一次得到每一个元素,把得到的元素,传递给下面的accept方法
        //col.forEach( new Consumer<String>() {
            //@Override
            //public void accept(String s) {
                //System.out.print(s);
           // }
        //} );
        col.forEach( s -> System.out.print(s) );
    }
}

List系列集合

List集合特有的方法

  • void add(int index,E element):在集合的指定位置插入元素,原来索引处后面的元素一次往后移动
  • E remove(int index):删除指定位置的元素并返回
  • E set(int index,E element):修改指定位置的元素,返回被修改的元素
  • E get(int index):返回指定位置的元素

细节注意

  • 调用方式的时候,如果方法出现了重载现象,会优先调用形参和实参类型一致的那个方法

 List集合的遍历方式

List集合遍历方法有五种,迭代器遍历、增强for、普通for循环、Lambda表达式、列表迭代器

 迭代器遍历

public class Test01 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add( 1 );
        list.add( 2 );
        list.add( 3 );

        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            Integer next = it.next();
            System.out.print(next);
        }
    }
}

增强for遍历

public class Test02 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add( 1 );
        list.add( 2 );
        list.add( 3 );

        for (Integer integer : list) {
            System.out.print(integer);
        }
    }
}

普通for遍历

public class Test03 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add( 1 );
        list.add( 2 );
        list.add( 3 );
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get( i ));
        }
    }
}

Lambda表达式遍历

public class Test04 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add( 1 );
        list.add( 2 );
        list.add( 3 );
        list.forEach( integer -> System.out.print(integer) );
    }
}

列表迭代器遍历

public class Test05 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add( 1 );
        list.add( 2 );
        list.add( 3 );
        //获取一个列表迭代器对象,里面的指针默认指向0索引
        //列表迭代器中额外添加了一个方法,在遍历的时候,可以添加元素
        ListIterator<Integer> listIterator = list.listIterator();
        while (listIterator.hasNext()){
            Integer next = listIterator.next();
            System.out.print(next);
        }
    }
}

五种方式对比

  • 在遍历过程中需要删除元素,用迭代器
  • 在遍历过程中需要添加元素,用列表迭代器
  • 在遍历过程中不做任何操作,使用增强for或Lambda表达式
  • 遍历过程中需要用到索引,使用普通for遍历

数据结构(栈、队列、数组、链表)

  •  是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。
  • 数据结构的学习思路:每种数据结构长啥样子-->如何添加数据-->如何删除数据。

特点:先进后出,后进先出 

队列

特点:先进先出,后进后出 

数组【查询快,增删慢】

  •  查询速度快:通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中连续存储的)。
  • 删除效率低:要删除元素的同时,后面的元素一次往前挪。
  • 添加效率极低:添加位置后的每一个元素都要往后移,在添加元素。

单向链表【查询慢、增删快】

  • 每一个节点都有两个空间,第一个存储只是需要存储的值,第二个存储的是下一个节点的地址
  • 链表中的节点是独立的对象,在内存中是不连续的,每一个节点包含数值和下一个节点的地址

 双向链表

  • 每一个节点都有三个空间,第一个存储的是前一个节点的地址,第二个存储的是真实需要存储的值,第三个存储的是下一个节点的地址
  • 链表中的节点是独立的对象,在内存中是不连续的,每一个节点包含前一个节点的地址、需要存储的数值和下一个节点的地址

 ArrayList源码分析

 ArrayList集合底层原理

  • 利用空参创建的集合,在底层创建一个默认长度为0的数组
  • 添加第一个元素时,底层会创建一个新的长度为10的数组
  • 当存满时,会创建一个长度是原来数组的1.5倍,把元数组中的数据拷贝到新数组中,再将新数组赋值给原来的数组【存满时,会扩容1.5倍】
  • 如果一次添加多个元素,1.5倍不够放,新创建的数组的长度以实际长度为准

分析图

 LinkedList集合源码分析

底层数据结构是双向链表,查询慢,增删快,但是如果操作的是首尾相连元素,速度就很快了。

LinkedList集合特有方法

  • public void addFirst(E e):在该列表开头插入指定元素
  • public void addLast(E e):将指定的元素追加到列表的末尾
  • public E getFirst():返回列表中的第一个元素
  • public E getLast():返回列表中的最后一个元素
  • public E removeFirst():删除列表中的第一个元素并返回
  • public E removeLast():删除列表中的最后一个元素并返回

源码分析

public class Test01 {
    public static void main(String[] args) {
        LinkedList<String> lk = new LinkedList<>();
        lk.add( "aaa" );
        lk.add( "bbb" );
        lk.add( "ccc" );
    }
}
    public boolean add(E e) {//参数e表示现在要添加的元素
        linkLast(e);
        return true;
    }
    void linkLast(E e) {//参数e表示现在要添加的元素
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

下面代码表示链表中的一个节点 

private static class Node<E> {
    E item;//存储的数据
    Node<E> next;//前一个结点的地址
    Node<E> prev;//后一个节点的地址

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

        当第一次添加元素时,会调用第三段代码,会把 last(null)【一个节点当中存储下一个节点地址的值】 赋值给 l ,然后new Node<>(l,e,null)创建一个新节点,然后再把新节点赋值给 last 后,判断 l 是否为空,如果为空,就把新节点赋值给 first ,否则就把新节点的地址赋值给 l.next;

        当不是第一次添加元素时,会把同一个LinkedList集合最后一次添加的数据所在的节点赋值给 l ,后new Node<>(l,e,null)创建新节点,后再把新节点赋值给 last ,判断 l 是否为空,显然不为空,就将新节点的地址赋值给 l.next。

迭代器源码分析

public class Test01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add( "aaa" );
        list.add( "bbb" );
        list.add( "ccc" );
        list.add( "ddd" );

        //在底层就是创建一个内部类的对象,这个内部类表示是ArrayList的迭代器,所以多次调用这个方法时,相当于创建多个迭代器的对象
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
    }
}
    public Iterator<E> iterator() {
        return new Itr();
    }
private class Itr implements Iterator<E> {
        int cursor;       // 下一个要返回的元素的索引,相当于指针,指向要返回的数据索引
        int lastRet = -1; // 最后一次操作的索引
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }


        public E next() {
            checkForComodification();
            int i = cursor;//记录当前指针指向的索引位置
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
}

        当调用iterator()方法时,会创建一个Itr的内部类对象,进入循环以后,判断cursor是否等于集合的长度,如果不是,hasNext()方法返回true,循环继续,当调用next()方法时,将cursor的值赋值给 i ,判断 i 是否大于等于集合长度,如果大于等于,就抛出异常,如果不是,cursor等于 i + 1【将当前的指针向后移动一位】,然后将 i 的值赋值给lastRet,并返回数组elementData中lastRet索引处的元素。

         modCount:表示集合变化的次数,每add或remove一次,modCount都会自增,当创建迭代器的时候,就会把变化的次数告诉迭代器。而checkForComodification();就是校验传入迭代器的次数与当前变化次数是否相同,不同报并发修改异常。

Set系列集合

  • 无序:存取顺序不一致
  • 不重复:数据有唯一性,可以利用数据去重
  • 无索引:没有带索引的方法,所以不能通过索引来操作集合
  • Set系列集合的方法基本上和Collection的API一致

HashSet

  • 无序、不重复、无索引

底层

  •  HashSet集合底层是通过哈希表【一种对于数据增删查改性能比较好的结构,JDK8之前由数组和链表组成,JDK8开始由数组、链表和红黑树组成】存储数据
  • 开始会创建一个默认长度为16,默认加载因子为0.75【扩容时机,当数组中存了 数组长度 x 0.75 个元素时,就会扩容到原来的2倍;JDK8之后,当链表长度大于8且数组长度大于等于64,链表会自动转成红黑树】的数组table
  • 根据元素的哈希值跟数组的长度计算出应存入的位置
  • 判断当前位置是否有元素,没有元素直接存入
  • 如果有元素,会调用equals方法比较属性
  • 如果属性值一样就不存入,如果不一样,存入数组,形成链表【JDK8以前:新元素存入数组,老元素挂在新元素下面   JDK8后:新元素直接挂在老元素的下面】

对象哈希值的特点

  • 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
  • 如果重写hashCode方法,不同对象只要属性值相同,计算出的哈希值就是一样的
  • 部分情况下,不同属性值或不同地址值计算出来的哈希值可能是一样的【哈希碰撞】 

哈希值

  • 根据hashCode方法计算出的int类型的整数
  • 该方法定义在Object类中,所有对象都可调用,默认使用地址值进行计算
  • 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值 

LinkedHashSet

  • 有序、不重复、无索引

 LinkedHashSet底层原理

  • 底层数据结构依旧是哈希表,只是每个元素又额外多了一个双链表机制记录存储的顺序
  • 当添加第二个元素之后,第一个元素会记录第二元素地址值,第二个元素也会记录第一个元素的地址值,依次往后
  • 如果后面添加的元素哈希值相同的情况下,新元素会以双向链表的形式直接挂在老元素的下面,在该元素之后添加的一个数据,如果不产生哈希冲突,就存入数组,和该元素形成双向链表

TreeSet

  • 可排序、不重复、无索引
  • TreeSet底层基于红黑树的数据结构实现排序,增删查改性能较好

TreeSet集合默认排序规则

  • 数值类型:Integer、Double,默认从小到大排序
  • 字符、字符串:按照字符在ASCII码中数字升序进行排序

 TreeSet集合比较方式一

  • 默认排序/自然排序:javabean类中实现Comparable接口指定比较规则
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

    public Student(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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.getAge()-o.getAge();
    }
}
public class Test02 {
    public static void main(String[] args) {
        Student s1 = new Student( "wi", 18 );
        Student s2 = new Student( "xn", 19 );
        Student s3 = new Student( "xg", 17 );

        TreeSet<Student> set = new TreeSet<>();
        set.add( s1 );
        set.add( s2 );
        set.add( s3 );

        System.out.println( set );
    }
}

 TreeSet集合比较方式二

  • 比较器排序:创建TreeSet的时候,传递比较器Comparator指定规则,默认使用第一种,当第一种不满足时,就使用第二种比较方式
public class Test03 {
    //"c","ab","df","java",四个字符串按照长度比较,如果一样长的按照首字母顺序排序
    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<>( new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int i = o1.length() - o2.length();
                i = i == 0 ? o1.compareTo( o2 ) : i;
                return i;
            }
        } );
        set.add( "c" );
        set.add( "ab" );
        set.add( "df" );
        set.add( "java" );

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

Java集合之单列集合 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • R语言读取Excel的神器——openxlsx

    作为非程序猿的各位同志们 可能最擅长的数据整理软件或者统计软件就是 嗯 没有错 它就是集万千宠爱于一身的E X O 咳咳咳 好了 隆重推出我们的主角 Excel 事实上 Excel是个super强大的软件 基本上用它已经能完成大量的统计分析
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • 软件工程实验:银行储蓄系统

  • Eclipse 导入Maven项目,提示Project .. already exists Add a version or custom suffix using “Name template“

    今天从svn 上检出项目至本地的Eclipse workspace 工作空间 提示如下截图错误 Project already exists Add a version or custom suffix using Name templat
  • 解决方案不显示分类的

    解决方案无法显示头文件 源文件等分类 现象 正常显示 错误显示 原因 对应解决方案的filters文件里有不匹配的标签
  • 题目描述001

    题目描述001 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但你的手速不够快 用m代表手速 每次下手捞菜后至少要过m庙才能在捞 每次只能捞一个 那
  • 基于TensorFlow2实现的宠物识别系统(爬虫、模型训练和调优、模型部署)

    目录 开发环境 0 项目准备 1 数据集准备 2 数据预处理 3 构建模型 4 模型训练及验证 5 模型部署 6 项目地址 开发环境 作者 嘟粥yyds 时间 2023年8月25日 集成开发工具 PyCharm Professional 2
  • 关于vue.config.js中配置前端代理

    写在前边 注意开发环境的本地代理或者测试环境的代理 在部署到正式上时 一定要换成线上的IP地址 不然 数据拿不到哦 代理配置 esay mock新地址 模拟接口地址 就以第一个进行说明怎么配置和使用了 只说代理配置部分 其它不再说明 新建项
  • Response响应方法详解

    Response 响应 服务器把请求的处理结果告知客户端 在B S架构中 响应就是把结果带回浏览器 响应对象 在项目中用于发送响应的对象 常用状态码 状态码 说明 200 执行成功 302 它和307一样 都是用于重定向的状态码 只是307
  • M3U8文件简介及在线播放器

    m3u8文件格式 M3U8是Unicode版本的M3U 用UTF 8编码 M3U 和 M3U8 文件都是苹果公司使用的 HTTP Live Streaming HLS 协议格式的基础 这种协议格式可以在 iPhone 和 Macbook 等
  • QSpinBox修改样式 去掉上下键

    1 找到QSpinBox控件 右键 改变样式表 将以下代码粘贴进去 QSpinBox border 1px solid 242424 QSpinBox up button QSpinBox down button width 0px 修改前
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • 【Android -- 面试】Android 知识点(四大组件)

    目录 文章目录 目录 Activity Fragment Service Broadcast Receiver ContentProvider Activity 1 说下 Activity 的生命周期 参考回答 在 Activity 的生命
  • Syntax Error: Error: PostCSS received undefined instead of CSS string

    Syntax Error Error PostCSS received undefined instead of CSS string Module Error from node modules sass loader dist cjs
  • 异步Buck和同步Buck的特点

    1 介绍 随着时代的发展 工业 车载 通信 消费类等产品都提出了小型化 智能化的需求 相应的 对于这些系统中的电源模块提出了小型化的要求 目前 市场上依然存在很多异步Buck电源管理芯片使用的场景 针对这些应用 采用同步Buck电源管理芯片
  • 今日热榜前 5 的 GitHub 项目

    今日开源热榜 Top5 项目目录 1 纪念左耳朵耗子 2 你的第二大脑 3 大模型开发人员需要记住的数 4 短链接管理工具 5 StableStudio 01 纪念左耳朵耗子 MegaEase 创始人兼 CEO 陈皓 网名 左耳朵耗子 于上
  • VSCode搭建ARM(STM32开发环境)

    目录 需要用到的工具 软件安装 下载安装 Visual Studio Code 下载安装 STM32Cubemx 下载安装 ARM GCC交叉编译工具链 下载安装 Msys2 下载安装 OpenOCD 下载安装 Make 开发环境配置 ms
  • 虚拟机扩容,解决虚拟机磁盘根目录不足

    当你打开虚拟机时会提示 你的磁盘根目录不足 这表明你需要对自己的虚拟机进行扩容 详细步骤如下 第一步 你需要将自己的虚拟机关机 即关闭电源 第二步 右键你需要扩容的虚拟机 然后点击设置 第三步 点击硬盘 第四步 点击右边进行扩容 将磁盘容量
  • 小米手机无法调试应用解决Installation failed with message Failed to establish session.

    小米手机性价比高 有些问题也很尖锐 比如我的5S用了黑科技 试验品 超声波指纹解锁 识别率就很低 每次解锁都要哈口气 真后悔 而且最近又遇到新问题 我的小米5S无法通过android studio调试应用 卖批啊 但即使这样也比蓝绿工程的O
  • Java集合之单列集合

    分类 集合分为单列集合 Collection 和双列集合 Map 单列集合的体系结构 List集合和Set集合的区别 List系列集合 添加元素是有序的 添加的顺序 而非数据的大小顺序 可重复 有索引 Set系列集合 添加的元素是无序的 添