Java的集合框架最全详解(图)

2023-05-16

Java的集合框架最全详解(图)


前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法。

在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。

Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。


 

1. 先说Set和List:

1.1. Set子接口:无序,不允许重复。List子接口:有序,可以有重复元素。具体区别是

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。<对应类有 HashSet,TreeSet>

List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。<相应类有 ArrayList,LinkedList,Vector>

Set和List具体子类:

2.2. <实例比较>

HashSet:以哈希表的形式存放元素,插入删除速度很快。

ArrayList:动态数组,LinkedList:链表、队列、堆栈。

Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用

1.Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

Iteratorit=collection.iterator();//获得一个迭代子

while(it.hasNext()){

Objectobj=it.next();//得到下一个元素

}

由Collection接口派生的两个接口是List和Set。

2.List接口

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

和下面要提到的Set不同,List允许有相同的元素。

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

2.1.LinkedList

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

Listlist=Collections.synchronizedList(newLinkedList(...));

2.2.ArrayList

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率(自动增判断长度后增长也会浪费时间的呀!)。

和LinkedList一样,ArrayList也是非同步的(unsynchronized)。(扩展阅读:在java.util.concurrent包中定义的CopyOnWriteArrayList提供了线程安全的Arraylist,但是当进行add和set等变化操作时它是通过为底层数组创建新的副本实现的,所以比较耗费资源

(源码在此:publicboolean add(E e) {

finalReentrantLock lock =this.lock;

lock.lock();

try {

Object[] elements = getArray();

int len = elements.length;

Object[] newElements = Arrays.copyOf(elements,len + 1);

newElements[len] = e;

setArray(newElements);

return true;

finally {

lock.unlock();

}

}

但是如果存在频繁遍历,遍历操作比变化(写入和修改)操作多的时候这种遍历就相对于自己进行的同步遍历效果要好,而且它也允许存在null元素)

2.3.Vector

Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。通过使用capacity和ensurecapacity操作以及capacityIncrement域可以优化存储操作,这个前面讲过,(Vector的Iterator和listIterator方法翻译的迭代器支持fail-fast机制,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。官方对此的说明是 java.util 包中的集合类都返回 fail-fast迭代器,这意味着它们假设线程在集合内容中进行迭代时,集合不会更改它的内容。如果 fail-fast迭代器检测到在迭代过程中进行了更改操作,那么它会抛出 ConcurrentModificationException,这是不可控异常。

2.4.Stack

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

stack 有几个比较实用的方法

boolean

empty() 
测试堆栈是否为空。

E

peek() 
查看堆栈顶部的对象,但不从堆栈中移除它。

E

pop() 
移除堆栈顶部的对象,并作为此函数的值返回该对象。

E

push(Eitem)
把项压入堆栈顶部。

int

search(Objecto)
返回对象在堆栈中的位置,以 1 为基数。

 

 

 

3. set接口:

Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。(我变换黄色背景那里的名称得到如下特点)


HashSet : 它不允许出现重复元素;不保证和政集合中元素的顺序,可以自己做个例子可以看出加入的字段顺序跟遍历出的不一样,允许包含值为null的元素,但最多只能有一个null元素(不允许重复嘛!)。

 

TreeSet : 可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成按照“升序”排列。

a)(在对大量信息进行检索的时候,TreeSet比AraayList更有效率,能保证在log(n)的时间内完成)。

b)TreeSet是实用树形结构来存储信息的,每个节点都会保存一下指针对象,分别指向父节点,左分支,右分支,相比较而言,ArrayList就是一个含有元素的简单数组了,正因为如此,它占的内存也要比ArrayList多一些。

c)想TreeSet插入元素也比ArrayList要快一些,因为当元素插入到ArrayList的任意位置时,平均每次要移动一半的列表,需要O(n)的时间, 而TreeSet深度遍历查询花费的实施只需要O(log(n))(普遍的都是,set查询慢,插入快,list查询快,插入满, .TODO:这一点我会写一个算法测试文章具体分析一下


LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

 

 

PS:set有几个比较好的方法:

removeAll(Collection<?> c)

移除 set 中那些包含在指定 collection 中的元素(可选操作)。

boolean retainAll(Collection<?> c)

仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。

containsAll(Collection<?> c)

如果此 set 包含指定 collection 的所有元素,则返回 true。

4.Queue数据结构

这方面知识涉及到线程比较多,有线程基础的口语参考这篇文章

http://blog.csdn.NET/a512592151/article/details/38454745

5.Map的功能方法

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap

Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。

Hashmap 是一个 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力.

Hashtable 与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历 的时候会比HashMap慢。

TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

 

Java代码   收藏代码
  1. package com.hxw.T2;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Hashtable;  
  5. import java.util.Iterator;  
  6. import java.util.LinkedHashMap;  
  7. import java.util.Map;  
  8. import java.util.TreeMap;  
  9.   
  10.   
  11.   
  12. public class MapTester {  
  13.   
  14.     public static void init(Map map) {  
  15.         if (map != null) {  
  16.             String key = null;  
  17.             for (int i = 5; i > 0; i--) {  
  18.                 key = new Integer(i).toString() + ".0";  
  19.                 map.put(key, key.toString());  
  20.                 // Map中的键是不重复的,如果插入两个键值一样的记录,  
  21.                 // 那么后插入的记录会覆盖先插入的记录  
  22.                 map.put(key, key.toString() + "0");  
  23.             }  
  24.         }  
  25.     }  
  26.   
  27.     public static void output(Map map) {  
  28.         if (map != null) {  
  29.             Object key = null;  
  30.             Object value = null;  
  31.             // 使用迭代器遍历Map的键,根据键取值  
  32.             Iterator it = map.keySet().iterator();  
  33.             while (it.hasNext()) {  
  34.                 key = it.next();  
  35.                 value = map.get(key);  
  36.                 System.out.println("key: " + key + "; value: " + value);  
  37.             }  
  38.             // 或者使用迭代器遍历Map的记录Map.Entry  
  39.             Map.Entry entry = null;  
  40.             it = map.entrySet().iterator();  
  41.             while (it.hasNext()) {  
  42.                 // 一个Map.Entry代表一条记录  
  43.                 entry = (Map.Entry) it.next();  
  44.                 // 通过entry可以获得记录的键和值  
  45.                 // System.out.println("key: " + entry.getKey() + "; value: " +  
  46.                 // entry.getValue());  
  47.             }  
  48.         }  
  49.     }  
  50.   
  51.     public static boolean containsKey(Map map, Object key) {  
  52.         if (map != null) {  
  53.             return map.containsKey(key);  
  54.         }  
  55.         return false;  
  56.     }  
  57.   
  58.     public static boolean containsValue(Map map, Object value) {  
  59.         if (map != null) {  
  60.             return map.containsValue(value);  
  61.         }  
  62.         return false;  
  63.     }  
  64.   
  65.     public static void testHashMap() {  
  66.         Map myMap = new HashMap();  
  67.         init(myMap);  
  68.         // HashMap的键可以为null  
  69.         myMap.put(null"ddd");  
  70.         // HashMap的值可以为null  
  71.         myMap.put("aaa"null);  
  72.         output(myMap);  
  73.     }  
  74.   
  75.     public static void testHashtable() {  
  76.         Map myMap = new Hashtable();  
  77.         init(myMap);  
  78.         // Hashtable的键不能为null  
  79.         // myMap.put(null,"ddd");  
  80.         // Hashtable的值不能为null  
  81.         // myMap.put("aaa", null);  
  82.         output(myMap);  
  83.     }  
  84.   
  85.     public static void testLinkedHashMap() {  
  86.         Map myMap = new LinkedHashMap();  
  87.         init(myMap);  
  88.         // LinkedHashMap的键可以为null  
  89.         myMap.put(null"ddd");  
  90.         // LinkedHashMap的值可以为null  
  91.         myMap.put("aaa"null);  
  92.         output(myMap);  
  93.     }  
  94.   
  95.     public static void testTreeMap() {  
  96.         Map myMap = new TreeMap();  
  97.         init(myMap);  
  98.         // TreeMap的键不能为null  
  99.         // myMap.put(null,"ddd");  
  100.         // TreeMap的值不能为null  
  101.         // myMap.put("aaa", null);  
  102.         output(myMap);  
  103.     }  
  104.   
  105.     public static void main(String[] args) {  
  106.         System.out.println("采用HashMap");  
  107.         MapTester.testHashMap();  
  108.         System.out.println("采用Hashtable");  
  109.         MapTester.testHashtable();  
  110.         System.out.println("采用LinkedHashMap");  
  111.         MapTester.testLinkedHashMap();  
  112.         System.out.println("采用TreeMap");  
  113.         MapTester.testTreeMap();  
  114.   
  115.         Map myMap = new HashMap();  
  116.         MapTester.init(myMap);  
  117.         System.out.println("新初始化一个Map: myMap");  
  118.         MapTester.output(myMap);  
  119.         // 清空Map  
  120.         myMap.clear();  
  121.         System.out.println("将myMap clear后,myMap空了么?  " + myMap.isEmpty());  
  122.         MapTester.output(myMap);  
  123.         myMap.put("aaa""aaaa");  
  124.         myMap.put("bbb""bbbb");  
  125.         // 判断Map是否包含某键或者某值  
  126.         System.out.println("myMap包含键aaa?  "  
  127.                 + MapTester.containsKey(myMap, "aaa"));  
  128.         System.out.println("myMap包含值aaaa?  "  
  129.                 + MapTester.containsValue(myMap, "aaaa"));  
  130.         // 根据键删除Map中的记录  
  131.         myMap.remove("aaa");  
  132.         System.out.println("删除键aaa后,myMap包含键aaa?  "  
  133.                 + MapTester.containsKey(myMap, "aaa"));  
  134.         // 获取Map的记录数  
  135.         System.out.println("myMap包含的记录数:  " + myMap.size());  
  136.     }  
  137. }  


附:map 遍历的四种方法:

Java代码   收藏代码
  1. public static void main(String[] args) {  
  2.   
  3.   
  4.   Map<String, String> map = new HashMap<String, String>();  
  5.   map.put("1""value1");  
  6.   map.put("2""value2");  
  7.   map.put("3""value3");  
  8.     
  9.   //第一种:普遍使用,二次取值  
  10.   System.out.println("通过Map.keySet遍历key和value:");  
  11.   for (String key : map.keySet()) {  
  12.    System.out.println("key= "+ key + " and value= " + map.get(key));  
  13.   }  
  14.     
  15.   //第二种  
  16.   System.out.println("通过Map.entrySet使用iterator遍历key和value:");  
  17.   Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();  
  18.   while (it.hasNext()) {  
  19.    Map.Entry<String, String> entry = it.next();  
  20.    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
  21.   }  
  22.     
  23.   //第三种:推荐,尤其是容量大时  
  24.   System.out.println("通过Map.entrySet遍历key和value");  
  25.   for (Map.Entry<String, String> entry : map.entrySet()) {  
  26.    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
  27.   }  
  28.   
  29.   //第四种  
  30.   System.out.println("通过Map.values()遍历所有的value,但不能遍历key");  
  31.   for (String v : map.values()) {  
  32.    System.out.println("value= " + v);  
  33.   }  
  34.  }  

 

 

3、其他特征

*List,Set,Map将持有对象一律视为Object型别。

*Collection、List、Set、Map都是接口,不能实例化。

继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。

*vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。

 

三、Collections

Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。

相当于对Array进行类似操作的类——Arrays。

如,Collections.max(Collection coll); 取coll中最大的元素。

Collections.sort(List list); 对list中元素排序

四、如何选择?

1、容器类和Array的区别、择取

* 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。

* 一旦将对象置入容器内,便损失了该对象的型别信息。

2、

* 在各种Lists中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList();

Vector总是比ArrayList慢,所以要尽量避免使用。

* 在各种Sets中,HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。

TreeSet存在的唯一理由:能够维护其内元素的排序状态。

* 在各种Maps中

HashMap用于快速查找。

* 当元素个数固定,用Array,因为Array效率是最高的。

结论:最常用的是ArrayList,HashSet,HashMap,Array。而且,我们也会发现一个规律,用TreeXXX都是排序的。

 

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。

2、Set和Collection拥有一模一样的接口。

3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)

4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。

HashMap会利用对象的hashCode来快速找到key。

* hashing

哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。

我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。

 

发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。

6、Map中元素,可以将key序列、value序列单独抽取出来。

使用keySet()抽取key序列,将map中的所有keys生成一个Set。

使用values()抽取value序列,将map中的所有values生成一个Collection。

为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。


转自:

http://blog.csdn.net/ccecwg/article/details/38727221

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

Java的集合框架最全详解(图) 的相关文章

  • 为什么 Java 中需要 String[] args?

    我知道 String args 是作为参数传递到 main 的字符串数组 java Print Hello World class Print public static void main String args System out p
  • 在 Java 中重新抛出异常而不丢失堆栈跟踪

    在 C 中 我可以使用throw 语句重新抛出异常 同时保留堆栈跟踪 try catch Exception e if e is FooException throw Java中有没有类似的东西 不会丢失原始堆栈跟踪 catch Whate
  • Spring Kafka - 为任何主题的分区消耗最后 N 条消息

    我正在尝试读取请求的卡夫卡消息数 对于非事务性消息 我们将从 endoffset N 对于 M 个分区 开始轮询并收集当前偏移量小于每个分区的结束偏移量的消息 对于幂等 事务消息 我们必须考虑事务标记 重复消息 这意味着偏移量将不连续 在这
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • Appengine - 隐藏文件夹的部署

    为了验证 SSL 证书 我需要将包含一些文件的隐藏文件夹 well known 上传到我的应用程序 我正在使用 eclipse 部署 java 应用程序 但 appengine 上的应用程序未收到这些文件 我猜他们被过滤掉了 我尝试将隐藏文
  • 规范路径和绝对路径有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 getPath getAbsolutePath 和 getCanonicalPath 有什么区别 https stackoverflow com questions 1099300 w
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • JConsole主类

    我正在尝试使用其 Main 类从命令行启动 JConsole 我提取了 jconsole jar 的内容 在 MANIFEST MF 中我可以看到 Main Class sun tools jconsole JConsole 所以我尝试运行
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建
  • Java RCP/SWT - Eclipse RCP 中的“Android Toast like”对话框

    有谁知道是否存在某些弹出窗口的实现 例如 Android TOAST 通知是以下内容的一部分迈林公共区 https projects eclipse org projects mylyn commons 要集成它们 请添加Mylyn Com
  • 要导入什么才能使用@SuppressFBWarnings?

    要使用 SuppressFBWarnings 需要导入什么 我通过帮助 安装新软件安装了 findbugs 插件 当我输入 import edu 时 我无法按 ctrl space 来获取选项 Example try String t nu
  • 如何在 TestNG 报告中包含 Log4j2 消息

    我希望在所有测试用例的 TestNG 报告中提供 Log4j2 日志记录信息 TestNG 使用一个名为 Reporter java 的特殊记录器类来跟踪日志输出并将其保存在其结果 XML 中 在 log4j 中 可以简单地创建一个路由到
  • 错误:libXext.so.6:无法打开共享对象文件:没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 运行尝试打开 ods 文件的 java 文件时出现以下错误 线程 main 中出现异常 java lang UnsatisfiedLinkError opt software jdk1 6 0 45 jre li
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • ElasticSearch - 定义自定义字母顺序进行排序

    我正在使用 ElasticSearch 2 4 2 通过 Java 的 HibernateSearch 5 7 1 Final 我在字符串排序方面遇到问题 我的应用程序的语言有变音符号 它们有特定的字母顺序 订购 例如 直接在之后L 追随O
  • 使用相对于配置文件的路径引用 Spring 属性文件

    我正在将属性从 Spring 配置文件内部移动到单独的属性文件中 这包含在配置文件中
  • 术语“可序列化”是什么意思? [复制]

    这个问题在这里已经有答案了 不太确定我读过的定义可序列化实际上做了什么 import java io Serializable import java text StringCharacterIterator import java uti
  • 来自 Janino 和 Commons-Compiler 的 Spark java.lang.NoSuchMethodError

    我正在构建一个使用 Spark 进行基于随机森林分类的 应用程序 当尝试运行该程序时 我从该行收到异常 StringIndexerModel labelIndexer new StringIndexer setInputCol label
  • Java中精确的时间测量

    Java 提供了两种获取当前时间的方法 System nanoTime and System currentTimeMillis 第一个给出的结果以纳秒为单位 但实际精度比这要差得多 许多微秒 JVM 是否已经为每台特定机器提供了最佳的价值
  • 如何使用属性文件在log4j2中创建多个日志文件?

    我正在使用 property 文件在特定路径中创建日志文件 但我正在使用它创建单个文件 以下是我的属性文件代码 status error dest err name PropertiesConfig property filepath ap

随机推荐

  • React 列表 & Keys

    列表 amp Keys 列表 React 列表可以使用 JavaScript 的 map 方法来创建 如下 xff1a span class token operator lt span span class token operator
  • [转载]电机 螺旋桨 电池之间的关系(普及版)

    http blog sciencenet cn blog 39356 509001 html 电机KV值 xff1a 电机的转速 xff08 空载 xff09 61 KV值X电压 xff1b 例如KV1000的电机在10V电压下它的转速 x
  • stm32 FreeRTOS 某个任务一直不被运行

    在用FreeRTOS操作系统时 xff0c 发现某一个任务一直不被运行查找后发现问题出在四个点 xff1a xff08 1 xff09 任务资源调用冲突 xff0c 当时在用两个任务去操作同一个串口 xff0c 发现任务在刚刚开始的时候 x
  • FreeRTOS 任务不切换可能的问题

    1 时间片调度没有打开 FreeRTOS h 文件中宏定义 configUSE TIME SLICING 没有定义为1 解决方案 xff1a ifndef configUSE TIME SLICING define configUSE TI
  • 通俗易懂的IMU讲解,这一篇就够了

    IMU技术的出现弥补了GPS定位的不足 xff0c 两者相辅相成 xff0c 可以让自动驾驶汽车获得最准确的定位信息 IMU全称inertial measurement unit xff0c 即惯性测量单元 xff0c 它由三个单轴的加速度
  • ubuntu16.04查看硬盘分区使用情况

    方法一 xff1a xff08 推荐 xff09 1 左上角的dash菜单 xff0c 搜索 gnome system monitor 打开磁盘工具 2 在 文件系统 中可以列出已经挂载打开的分区的使用情况 方法二 xff1a 1 左上角的
  • 【ORB-SLAM2】(三):单目摄像头+ROS+ORB_SLAM2实时测试

    介绍 xff1a 首先启动一个单目摄像头 xff0c 其次发布节点话题 usb cam image raw xff0c 最后ORB SLAM2订阅摄像头数据进行处理 xff08 这里需要修改相应的源文件里的话题类型 xff0c 其默认值为
  • vscode如何更换主题

    1 打开Vscode xff0c 点击 文件 首选项 颜色主题 快捷键 xff1a 先按Ctrl 43 K 再按Ctrl 43 T 2 打开主题设置面板 xff0c 在深色主题中点击 深色 3 这样就可以把主题改为 深色 这样Vscode界
  • CSDN写博客更改代码颜色为白色代码样式

    一 背景 在平时发博客时 xff0c 代码块背景默认是黑色的 xff0c 而注释是黑色的 xff0c 总是看起来很不清楚 直接上图 xff1a 注释看起来很不清晰 xff0c 现在我们修改一下颜色为白色 直接上图 xff1a 下面是具体设置
  • win10安装Ubuntu16.04双系统

    下载Ubuntu16 04 xff1a 下载地址 xff1a 官网 xff1a Ubuntu 16 04 7 LTS Xenial Xerus 阿里云开源镜像站 ubuntu releases 16 04安装包下载 开源镜像站 阿里云 中科
  • SLAM后端--滤波方法和非线性优化方法

    SLAM的后端一般分为两种处理方法 xff0c 一种是以扩展卡尔曼滤波 xff08 EKF xff09 为代表的滤波方法 xff0c 一种是以图优化为代表的非线性优化方法 不过 xff0c 目前SLAM研究的主流热点几乎都是基于图优化的 滤
  • React 组件 API

    常用 React 组件 API xff1a 设置状态 xff1a setState替换状态 xff1a replaceState设置属性 xff1a setProps替换属性 xff1a replaceProps强制更新 xff1a for
  • 浅析SATA Physical Layer物理层OOB信号

    一 SATA物理层概述 说OOB之前 xff0c 首先得了解一下SATA结构以及物理层的含义 SATA主要包括 xff1a 应用层 Application Layer 传输层 Transport Layer xff0c 链路层 Link L
  • CodeBlocks 20.03下载及安装指南 使用自带MinGW进行环境配置

    原本用的好好的CodeBlocks 17 12 xff0c 今天手欠无聊去搜了一下官网发现两年都没更新的cb竟然在这两天更新了 对于一直喜欢用最新版的我 xff0c 一定要更新 xff0c 然后 我还把之前的各项配置都删掉了 好吧 xff0
  • 程序是从main主函数开始运行吗?

    很多人开始学计算机语言 xff0c 编写代码时都会有一个疑问 xff1a 程序真的是从main主函数开始的吗 xff1f 之前什么都不做吗 xff1f main结束后就不能执行其他函数了吗 xff1f 下面本篇文章就为此问题做一个简单的解释
  • C++内存越界(转)

    glibc detected free invalid pointer glibc detected malloc memory corruption glibc detected double free or corruption out
  • 总结几种结构体初始化的方法(转)

    总结几种结构体初始化的方法 转自 xff1a http www cnblogs com vongang archive 2011 07 30 2122076 html 结构体能自由组装数据 xff0c 是一种很常见的数据打包方法 当我们定义
  • C++各大有名库的介绍(转)

    C 43 43 各大有名库的介绍 C 43 43 各大有名库的介绍之C 43 43 标准库 标准库中提供了C 43 43 程序的基本设施 虽然C 43 43 标准库随着C 43 43 标准折腾了许多年 xff0c 直到标准的出台才正式定型
  • 内存分配——静态存储区 栈 堆 与static变量 (转)

    一 内存基本构成 可编程内存在基本上分为这样的几大部分 xff1a 静态存储区 堆区和栈区 他们的功能不同 xff0c 对他们使用方式也就不同 静态存储区 xff1a 内存在程序编译的时候就已经分配好 xff0c 这块内存在程序的整个运行期
  • Java的集合框架最全详解(图)

    Java的集合框架最全详解 xff08 图 xff09 前言 xff1a 数据结构对程序设计有着深远的影响 xff0c 在面向过程的C 语言中 xff0c 数据库结构用struct来描述 xff0c 而在面向对象的编程中 xff0c 数据结