javascript集合操作-数组和集合的区别

2023-09-05 0 6,367 百度已收录

数组和集合的定义

1. 数组

数组是Java语言的外部数据类型。 它是一个线性序列,所有其他元素都可以快速访问。 数组与其他语言不同。 当你创建一个字段时,它的容量是恒定的,并且在生命周期中不能改变,而JAVA字段会做边界检测。 如果发现有越界现象,就会报RuntimeException。 当然,检测边界会以牺牲效率为代价。

二、收藏

JAVA还提供了其他集合,例如列表、映射和集合。 当他们处理对象时,看起来对象没有自己的类型,而是直接植根于Object。 只需将其转换为您自己的类型即可。

3.数组和集合的区别

1. 数组声明了它所保存的元素的类型,而集合则没有。

其次,数组是静态的,字段实例的大小是固定的,一旦创建就很难改变容量。 集合可以动态扩展容量,并且可以根据需要动态改变大小。 集合提供了更多的会员方法,可以满足更多的需求。

3、数组存储的类型只能是一种类型(基本类型/引用类型),集合存储的类型可以不同(不添加类库时添加的类型是Object)。

第四,数组是java语言中的外部数据类型,线性排列,执行效率或者类型检测是最快的。

集合架构

收藏

├List(有序集合,允许元素相同且为null)

│├LinkedList(非同步,允许相同元素和null,遍历效率低javascript集合操作,插入删除效率高)

...

│└Vector(同步,允许相同元素和null,效率低)

│└Stack(继承自Vector,实现后进先出堆栈)

└Set(无序集合,不允许有相同元素,最多有一个空元素)

|-HashSet(无序集合,不允许有相同的元素,最多一个空元素)

Map(未实现集合接口,key不能重复,value可以重复,一个key映射一个value)

├Hashtable(实现Map接口,同步,不允许null作为key和value,如果使用自定义类作为key,必须重写hashCode和eques方法,)

├HashMap(实现Map接口,异步,允许null作为key和value,用得很多)

└WeakHashMap(实现Map接口)

采集接口

Collection是最基本的集合套接字,一个Collection代表一组Object,即Collection的元素(Elements)。 有些集合允许相同的元素,而其他集合则不允许。 有些是这样,有些则不是。 JavaSDK不提供直接从Collection继承的类。 JavaSDK提供的类都是继承自Collection的“子接口”,比如List、Set。

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

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

Iteratorit=collection.iterator();//获取迭代器

while(it.hasNext()){

Objectobj=it.next();//获取下一个元素

从 Collection 接口派生的两个套接字是 List 和 Set。

1. 列出套接字

List是一个有序的Collection,利用这个socket可以精确控制每个元素的插入位置。 用户可以使用索引(List中元素的位置,类似于链表的下标)来访问List中的元素,类似于Java的字段。

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

除了 Collection 接口必需的 iterator() 方法之外,List 还提供了返回 ListIterator 套接字的 listIterator() 方法。 与标准 Iterator 套接字相比,ListIterator 具有一些允许添加的方法,例如 add()。 删除、设置元素以及向前或向后遍历。

实现List套接字的常见类有LinkedList、ArrayList、Vector和Stack。

链表类

LinkedList 实现了 List 套接字,允许 null 元素。 LinkenList底层使用单向数组来存储数据,每个节点存储前一个节点和后一个节点的地址以及本节点的数据。 另外,LinkedList在LinkedList的头部或尾部提供了额外的get、remove和insert方法。 这些操作使得LinkedList可以用作堆栈(stack)、队列(queue)或单向队列(deque)。

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

列表列表=集合。 同步列表(newLinkedList(...));

数组列表类

ArrayList 实现可变大小字段。 它允许所有元素,包括 null。 ArrayList底层采用动态字段的存储形式,非常方便高效。 ArrayList 不是线程安全的。

size、isEmpty、get、set的运行时间是恒定的。 然而add方法的成本是一个摊余常数,添加n个元素需要O(n)时间。 其他模式以线性时间运行。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的链表的大小。 当添加新元素时,可以手动减少此容量,但未定义减少算法。 当需要插入大量元素时,可以在插入前调用ensureCapacity方法来减少ArrayList的容量,以提高插入效率。

ArrayList和LindedList的区别:

1.ArrayList是基于动态字段的数据结构,LinkedList是基于数组的数据结构。

2.对于随机访问get和set,ArrayList被认为比LinkedList更好,因为LinkedList需要用手进行通信。

3.对于增删操作add和remove,LinedList有优势javascript集合操作,因为ArrayList需要连接数据。

向量类

Vector与ArrayList非常相似,但Vector是同步的。 虽然Vector创建的Iterator与ArrayList创建的Iterator具有相同的socket,但由于Vector是同步的,当一个Iterator被创建并正在使用时,另一个线程会改变Vector的状态(例如,添加或删除一些元素),当调用Iterator方法时,会抛出ConcurrentModificationException异常,因此必须捕获该异常。

栈类

Stack继承自Vector,实现了后进先出的堆栈。 Stack 提供了 5 种附加方法来使 Vector 能够用作堆栈。 基本的push和pop方法,以及获取栈顶元素的peek方法,测试栈是否为空的empty方法,以及测量元素在栈中位置的search方法。 堆栈在创建后是一个空堆栈。

2. 设置插座

Set是一个无序且不包含重复元素的集合,即任意两个元素e1和e2都有e1.equals(e2)=false,并且Set最多有一个空元素。

显然,Set构造函数有一个约束,即传入的Collection参数不能包含重复的元素。

哈希集类

它是通过哈希表实现的。 HashSet中的数据是无序的,可以加载null,但只能加载一个null。 两者中的值都不能重复,因为HashSet的底层实现是HashMap,但是HashSet只是使用HashMap的key来访问数据,所以HashSet中存储的数据不能重复。

HashSet要求加载的对象必须实现HashCode()方法。 加载的对象带有哈希码标记,相同内容的String对象具有相同的哈希码,因此加载的内容不能重复。 但同一类的对象可以加载到不同的实例中。

3.地图界面

Map没有继承Collection接口,Map提供了key到value的映射。 一个Map不能包含相同的key,并且每个key只能映射到一个值。 Map 接口提供了三种类型的集合视图。 Map 的内容可以被视为一组键集、一组值集或一组键值映射。

哈希表类

Hashtable继承了Map接口,实现了键值映射的哈希表。 任何非空对象都可以用作键或值。

使用 put(key,value) 添加数据,使用 get(key) 删除数据。 这两个基本操作的时间消耗是恒定的。

使用 Hashtable 的一个简单示例如下。 将 1、2、3 放入 Hashtable 中,它们的键分别为“一”、“二”、“三”:

Hashtablenumbers = newHashtable();

数字。 put(“一个”, newInteger(1));

数字。 put(“二”, newInteger(2));

数字。 put(“三”, newInteger(3));

要检索数字,例如 2,请使用相应的键:

整数=(整数)数字。 得到(“二”);

System.out.println("two="+n);

由于作为键的对象将通过评估其哈希函数来确定相应值的位置,因此任何作为键的对象都必须实现 hashCode 和 equals 方法。 hashCode和equals方法继承自根类Object。 如果您使用自定义类作为键,请务必小心。 根据哈希函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,那么它们的hashCode一定相同,但是如果两个对象不同,它们的hashCode就不一定不同的。 如果两个不同对象的hashCode相同,这种现象称为冲突。 冲突会减少操作哈希表所花费的时间。 因此,尝试定义一个定义良好的 hashCode() 方法,可以促进哈希表操作。

如果同一个对象有不同的hashCode,对哈希表的操作将会出现意想不到的结果(预期的get方法返回null)。 为了防止这些问题,你只需要记住一件事:同时复制 equals 方法和 hashCode 方法,而不是只写其中之一。

哈希表是同步的。

HashMap类

HashMap 与 Hashtable 类似,不同的是 HashMap 是异步的,允许 null,即 nullvalue 和 nullkey,但是当 HashMap 被视为 Collection 时(values() 方法可以返回 Collection)。

WeakHashMap 类

WeakHashMap是一种改进的HashMap,它实现了对key的“弱引用”。 如果某个key不再被外部引用,那么该key就可以被GC回收。

总结

1、如果涉及到栈、队列等操作,应该考虑使用List。 为了快速插入和删除元素,您应该使用LinkedList。 如果你需要快速随机访问元素,你应该使用ArrayList。

2、如果程序是单线程环境,或者只在一个线程中进行访问,可以考虑异步类,效率更高。 如果多个线程可能同时操作一个类,则应该使用同步类。

3、高度关注哈希表的操作。 用作键的对象必须正确复制 equals 和 hashCode 方法。

4. 尽量返回socket而不是实际类型,比如返回List而不是ArrayList,这样以后如果需要用LinkedList替换ArrayList时,客户端代码不需要改动。 这是针对表征的编程。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript集合操作-数组和集合的区别 https://www.wkzy.net/game/194495.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务