java: 详解java中的集合框架

2023-10-31

一、Java集合框架概述

(1)图解

 

集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下但支持多线程的集合类位于java.util.concurrent包下。

上图中淡绿色背景覆盖的是集合体系中常用的实现类,分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类。

(2)数组与集合的区别

1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。

2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象

(3)List, Set, Queue, Map四个接口大致描述

1)  Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。

2)  其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合Map代表的是存储key-value对的集合,可根据元素的key来访问value。

二、Java集合常见接口及实现类

(1)Collection接口常见方法(来源于Java API)

 (2)List集合

List集合代表一个有序、可重复集合,集合中每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素。

1)ArrayList

 ArrayList是一个动态数组(System.arraycopy(Object arr1, int x, Object arr2, int y, int length)方法来实现数组扩容的),也是我们最常用的集合,是List类的典型实现。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作(每次扩容的大小是容量的0.5倍)。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

      ArrayList擅长于随机访问。同时ArrayList是非同步的。

2)LinkedList

LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用

LinkedList的实现机制与ArrayList的实现机制完全不同ArrayLiat内部以数组的形式保存集合的元素,所以随机访问集合元素有较好的性能LinkedList内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在插入删除元素时有较好的性能。

3)Vector

与ArrayList相似,但是Vector是同步的。(且每次扩容是扩容1倍)所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。

4)Stack

Stack继承自Vector实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

5)Iterator接口和ListIterator接口

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下:

♦ boolean hasNext():判断集合里是否存在下一个元素。如果有,hasNext()方法返回 true。
♦ Object next():返回集合里下一个元素。
♦ void remove():删除集合里上一次next方法返回的元素。

ListIterator接口继承Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下几个方法:

♦ boolean hasPrevious():判断集合里是否存在上一个元素。如果有,该方法返回 true。
♦ Object previous():返回集合里上一个元素。
♦ void add(Object o):在指定位置插入一个元素。

以上两个接口相比较,不难发现,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素)。

(3)Set集合

Set集合与Collection的方法相同,由于Set集合不允许存储相同的元素,所以如果把两个相同元素添加到同一个Set集合,则添加操作失败,新元素不会被加入,add()方法返回false。为了帮助理解,请看下面代码示例:

1)HashSet类

HashSet是Set集合最常用实现类,是其经典实现。HashSet是按照hash算法来存储元素的,因此具有很好的存取和查找性能。

1. HashSet具有如下特点:

不能保证元素的顺序。

♦ HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。

集合元素值可以是null。

2. HashSet存储原理如下:

当向HashSet集合存储一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据hashCode值决定该对象的存储位置。HashSet集合判断两个元素相等的标准是

(1)两个对象通过equals()方法比较返回true;

(2)两个对象的hashCode()方法返回值相等。因此,如果(1)和(2)有一个不满足条件,则认为这两个对象不相等,可以添加成功。如果两个对象的hashCode()方法返回值相等,但是两个对象通过equals()方法比较返回false,HashSet会以链式结构将两个对象保存在同一位置,(jdk1.8之后, 对其进行了相应的优化, 当链表中的数据量超过了8之后, 就改用红黑树进行存储)这将导致性能下降,因此在编码时应避免出现这种情况

3. HashSet查找原理如下:

基于HashSet以上的存储原理,在查找元素时,HashSet先计算元素的HashCode值(也就是调用对象的hashCode方法的返回值),然后直接到hashCode值对应的位置去取出元素即可,这就是HashSet速度很快的原因。

重写hashCode()方法的基本原则如下:

♦ 在程序运行过程中,同一个对象的hashCode()方法返回值应相同。

♦ 当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法返回值应该相等。

♦ 对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值。

 2)LinkedHashSet类

LinkedHashSet是HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致由于LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet,但在迭代访问Set里的全部元素时由很好的性能。

 3)TreeSet类

TreeSet时SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序

♦ 自然排序

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素的大小关系,然后将元素按照升序排列,这就是自然排序。如果试图将一个对象添加到TreeSet集合中,则该对象必须实现Comparable接口,否则会抛出异常。当一个对象调用方法与另一个对象比较时,例如obj1.compareTo(obj2),如果该方法返回0,则两个对象相等;如果返回一个正数,则obj1大于obj2;如果返回一个负数,则obj1小于obj2。

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super();
        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 int compareTo(Student s) {
        //return -1; //-1表示放在红黑树的左边,即逆序输出
        //return 1;  //1表示放在红黑树的右边,即顺序输出
        //return o;  //表示元素相同,仅存放第一个元素
        //主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树
        int num=this.name.length()-s.name.length();
        //姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。
        //如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。
        //如果这两个字符串相等,则结果为 0
        int num1=num==0?this.name.compareTo(s.name):num;
        //姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄
        int num2=num1==0?this.age-s.age:num1;
        return num2;
    }
}

public class MyClass {
    public static void main(String[] args) {
        TreeSet<Student> ts=new TreeSet<Student>();
        //创建元素对象
        Student s1=new Student("zhangsan",20);
        Student s2=new Student("lis",22);
        Student s3=new Student("wangwu",24);
        Student s4=new Student("chenliu",26);
        Student s5=new Student("zhangsan",22);
        Student s6=new Student("qianqi",24);

        //将元素对象添加到集合对象中
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);

        //遍历
        for(Student s:ts){
            System.out.println(s.getName()+"-----------"+s.getAge());
        }
    }
}

运行结果

lis-----------22
qianqi-----------24
wangwu-----------24
chenliu-----------26
zhangsan-----------20
zhangsan-----------22

Java常用类中已经实现了Comparable接口的类有以下几个:

  ♦ BigDecimal、BigDecimal以及所有数值型对应的包装类:按照它们对应的数值大小进行比较。

  ♦ Charchter:按照字符的unicode值进行比较。

  ♦ Boolean:true对应的包装类实例大于false对应的包装类实例。

  ♦ String:按照字符串中的字符的unicode值进行比较。

  ♦ Date、Time:后面的时间、日期比前面的时间、日期大。

对于TreeSet集合而言,它判断两个对象是否相等的标准是:两个对象通过compareTo(Object obj)方法比较是否返回0,如果返回0则相等。

♦ 定制排序

想要实现定制排序,需要在创建TreeSet集合对象时,提供一个Comparator接口与该TreeSet集合关联,由Comparator接口负责集合元素的排序逻辑

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

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super();
        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;
    }

}

public class MyComparator implements Comparator<Student> {

    @Override
    public int compare(Student s1,Student s2) {
        // 姓名长度
        int num = s1.getName().length() - s2.getName().length();
        // 姓名内容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年龄
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
    }

}
public class MyClass {

    public static void main(String[] args) {
        //创建集合对象
        //TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
        TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());

        //创建元素对象
        Student s1=new Student("zhangsan",20);
        Student s2=new Student("lis",22);
        Student s3=new Student("wangwu",24);
        Student s4=new Student("chenliu",26);
        Student s5=new Student("zhangsan",22);
        Student s6=new Student("qianqi",24);

        //将元素对象添加到集合对象中
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);

        //遍历
        for(Student s:ts){
            System.out.println(s.getName()+"-----------"+s.getAge());
        }
    }
}

运行结果

lis-----------22
qianqi-----------24
wangwu-----------24
chenliu-----------26
zhangsan-----------20
zhangsan-----------22

4)EnumSet类

EnumSet是一个专为枚举类设计的集合类不允许添加null值EnumSet的集合元素也是有序的,它以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

5)各Set实现类的性能分析

1. HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet

2. LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快。

3. EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素。

4. 以上几个Set实现类都是线程不安全的,如果多线程访问,必须手动保证集合的同步性.

(4)Map集合 

Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、LinkedHashMap、TreeMap等。

 Map常见方法(来源于API)如下:

1)HashMap与Hashtable 

HashMap与Hashtable是Map接口的两个典型实现,它们之间的关系完全类似于ArrayList与Vertor。HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了,HashMap与Hashtable主要存在以下两个典型区别:

HashMap是线程不安全,HashTable是线程安全的。

HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把null放进HashTable中,将会发生空指针异常。

为了成功的在HashMap和Hashtable中存储和获取对象,用作key的对象必须实现hashCode()方法和equals()方法。

HashMap工作原理如下:

HashMap基于hashing原理,通过put()和get()方法存储和获取对象。当我们将键值对传递给put()方法时,它调用建对象的hashCode()方法来计算hashCode值,然后找到bucket位置来储存值对象。当获取对象时,通过建对象的equals()方法找到正确的键值对,然后返回对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会存储在链表的下一个节点中。

2)LinkedHashMap实现类

LinkedHashMap使用双向链表来维护key-value对的次序(其实只需要考虑key的次序即可),该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能。

3)Properties

  Properties类时Hashtable类的子类,它相当于一个key、value都是String类型的Map,主要用于读取配置文件。

4)TreeMap实现类

  TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。

注: 

TreeMap也有两种排序方式:

  ♦ 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException。

  ♦ 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。

5)各Map实现类的性能分析

♦ HashMap通常比Hashtable(古老的线程安全的集合)要快

♦ TreeMap通常比HashMap、Hashtable要慢,因为TreeMap底层采用红黑树来管理key-value。

♦ LinkedHashMap比HashMap慢一点,因为它需要维护链表来爆出key-value的插入顺序。 

参考文章: 

作者(冰湖一角) https://www.cnblogs.com/bingyimeiling/p/10255037.html

https://blog.csdn.net/zhangqunshuai/article/details/80660974

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

java: 详解java中的集合框架 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似

随机推荐

  • get方法和post方法的区别和联系

    1 功能不同 post是向服务器发送数据 get是向服务器获取数据 2 过程不同 get在浏览器回退时是无害的 但是post会再次提交请求 get请求会被浏览器主动缓存 但是post不会 除非手动设置 get请求只能进行URL编码 但是po
  • [C#] 使用Spire.XLS 将excel转DataTable

  • 企业微信 40001 invalid credential问题解决

    获取access token报错 errcode 40001 errmsg invalid credential hint XXXXX from ip XXX XXX XXX XXX more info at https open work
  • 《JAVA 基础: 第一个JAVA应用程序》

    一 Java语言运行机制及运行过程 1 再次强调JAVA语言的特点 特点一 面向对象 两个基本概念 类 对象 三大特性 封装 继承 多态 特点二 健壮性 吸收了C C 语言的优点 但去掉了其影响程序健壮性的部分 如指针 内存的申请与释放等
  • 运用成员函数模板接受所有兼容类型——条款45

    所谓智能指针是 行为像指针 的对象 并提供指针没有的机能 例如条款13曾经提及std auto ptr和tr1 shared ptr如何能够被用来在正确时机自动删除heap based资源 STL容器的迭代器几乎总是智能指针 无疑地你不会奢
  • 卷积神经网络的复杂度分析

    在进行CNN的设计中 我们不仅要考虑模型的准确率 还需要考虑模型的实用性 现阶段大量的paper纯堆精度 缺没有深入思考模型以及算法的实用性 最近有一点感触很深 很多我们在做研究时认为默认的东西 在进行实际应用项目中 才发现这些先验数据是无
  • NVIDIA 安装 CUDA

    名词解释 CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一 准备工作 如图我这个显卡需要安装 CUDA 11 7
  • Pci设备驱动1:pci设备驱动实例(realtek8168)

    Pci设备驱动1 pci设备驱动实例 realtek8168 2012 05 25 11 30 32 分类 LINUX Realtek8168网卡时pci接口的网卡 其驱动程序就是一个PCI设备的驱动程序实例 我们一起看看其流程 1 首先
  • JDK8到JDK17有哪些吸引人的新特性?

    作者 京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源 从此成立了OpenJDK组织进行JDK代码管理 任何人都可以获取该源码 并通过源码构建一个发行版发布到网络上 但是需要一个组织审核来确保构建的发行版是有效的 这个组
  • EfficientDet训练自己的训练集

    一 安装环境 install requirements pip install pycocotools numpy opencv python tqdm tensorboard tensorboardX pyyaml pip install
  • 五步教你如何注册一个公司网站

    在今天的数字化时代 每个公司都需要一个强大的线上存在感 注册一个公司网站是实现这一目标的第一步 但是 对于许多公司而言 这个过程可能有些困难 因此 在本文中 我将介绍一个五步计划 让您轻松注册一个成功的公司网站 步骤一 确定网站目标 在注册
  • oracle时间大小比较 格式

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 createtime gt to
  • android开源进度条,Android github开源进度条类框架SmoothProgressBar的使用

    前言 SmoothProgressBar是Github上的一个开源框架 牛人所著 只作翻译 Github项目主页 SmoothProgressBar https github com castorflex SmoothProgressBar
  • 80004005错误代码_关于访问共享时出现80004005错误

    访问网内某共享文件夹时出现的错误 报80004005错误代码 无法打开共享文件夹 但因为原先该共享访问并不存在障碍 因此应该不是权限的问题 到网上找了下 有以下一些说法与解决方法 1 开启windwos防火墙服务 2 设置宽带共享上网 打开
  • Docker部署ssh连接工具webssh2

    Docker部署ssh连接工具webssh2 一 检查系统版本 二 检查docker状态 三 下载webssh2镜像 四 创建webssh2容器 1 创建webssh2容器 2 查看webssh2状态 3 查看容器运行日志 五 访问webs
  • 简单易懂!详细讲解==与equals的区别(详讲equals源代码)

    与 equals 最本质的区别就在于 只是一个比较运算符 而equals却是一个方法 而只要是方法就可以重写 这就是 和equals最本质的区别 首先我们先来讲解 运算符 运算符可以对基本数据类型的值来进行判断 举例 int a 10 in
  • 关于保护继电器触点(灭弧)

    我用继电器驱动一个24V 60w电机 采用0 33uF 400V电容并联在触点上作为吸收和保护电容 用不了多久 就被击穿了 现在用的电容是0 1uF的X2电容 这种电容标称耐压是 275V 实际能承受2500V的冲击电压 后来的仿真和示波器
  • Prometheus-05 Prometheus的核心概念和架构

    Prometheus是一个开源的监控系统和时间序列数据库 被广泛应用于云原生环境中的监控和告警 本文将介绍Prometheus的核心概念和架构 帮助读者了解Prometheus的工作原理和基本组件 1 核心概念 Prometheus基于一些
  • python配置文件解析_【Python】configparser - 配置文件解析

    目录 一 介绍 ConfigParse 类实现一个基本配置文件解析器语言 提供了一个类似于Microsoft Windows INI 文件的结构 可以使用它来编写可由最终用户轻松定制的Python程序 注意 这个库不支持能够解析或写入在 W
  • java: 详解java中的集合框架

    一 Java集合框架概述 1 图解 集合可以看作是一种容器 用来存储对象信息 所有集合类都位于java util包下 但支持多线程的集合类位于java util concurrent包下 上图中淡绿色背景覆盖的是集合体系中常用的实现类 分别