• 关于

    插入对象

    的搜索结果

问题

mongodb的$addToSet如何定位插入数据的位置

现有如下数据:使用$addToSet插入一个新的对象:能不能把这个对象插入到上面的UserAction数组的第一个第一位而不是最后一位呢?就像使用$push的时候可以使用$position一样指定插入的位置。...
蛮大人123 2019-12-01 19:56:30 1110 浏览量 回答数 1

回答

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。 List的特征是其元素以线性方式存储,集合中可以存放重复对象。 ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。 LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。 Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。 LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 WeakHashMao :弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
游客bnlxddh3fwntw 2020-04-10 14:16:43 0 浏览量 回答数 0

回答

PriorityBlockingQueue是一个没有边界的队列,它的排序规则和 java.util.PriorityQueue一样。需要注意,PriorityBlockingQueue中允许插入null对象。 所有插入PriorityBlockingQueue的对象必须实现 java.lang.Comparable接口,队列优先级的排序规则就是按照我们对这个接口的实现来定义的。 另外,我们可以从PriorityBlockingQueue获得一个迭代器Iterator,但这个迭代器并不保证按照优先级顺序进行迭代。 下面我们举个例子来说明一下,首先我们定义一个对象类型,这个对象需要实现Comparable接口:
星尘linger 2020-04-12 22:13:09 0 浏览量 回答数 0

问题

如何用DMS创建触发器

前提条件 用户已获取权限登录到 DMS控制台。 操作步骤 选择用户要登录的数据库,单击登录到数据库按钮进行登录。触发器、函数、存储过程、事件在DMS中统称为可编程对象。单击左侧目录树的可编程对象Tab页࿰...
云栖大讲堂 2019-12-01 21:29:20 1811 浏览量 回答数 0

问题

MySQL 在hibernate中遇到的主键生成问题

最近使用Mysql连hibernate,生成策略为identity,在添加数据的时候遇到问题, 比如添加报销单表和报销明细表(报销单和报销明细是一对多的关系,报销单设置了cascade="all"),每次保存报销单对象数据的时候,会发现上一...
云栖技术 2019-12-01 19:40:29 1377 浏览量 回答数 1

问题

关于 hibernate 查询本地数据库,插入远程数据库 问题

现在有一个需求,两个数据库模型完全一样,但分别在不同的服务器上A和B,现在需要将A中的数据查出来,比如得到List,要将这个List插入到B库中,怎么插入呢,怎么利用hibernate本身保存对象的方式去直接插入,还是说只能写sql呢...
爵霸 2019-12-01 20:06:27 861 浏览量 回答数 1

回答

1、List(有序、可重复) List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。 2、Set(无序、不能重复) Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。 3、Map(键值对、键唯一、值不唯一) Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
游客lz7tjhznmiyda 2019-12-02 01:03:53 0 浏览量 回答数 0

回答

LIST和set继承自collection,Map是一个接口 List: 可以允许重复的对象 可以插入多个null元素 List是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序 常用的实现类有ArrayList,linkedList、vector,其中ArrayList最为流行,它提供了使用索引的随意访问,LinkedList则对于经常需要从list中添加删除的场合更为合适   Set: 不允许重复 只可以插入一个null元素 是一个无序容器,无法保证每个元素的存储顺序,Treeset通过Comparator或者Comparable维护了一个排序顺序 Set接口最流行的几个实现类是HashSet,linkedHashSet、TreeSet。最为流行的是基于HashMap实现的HashSet,TreeSet还实现了SortedSet接口,因此TreeSet是一个根据compare()和compareTo()的定义进行排序的有序容器     Map: Map不是collection的子接口或者实现类,Map是一个接口 Map的每个Entry都持有两个对象,也就是一个键一个值,Map可能会持有相同的值对象但键对象必须是唯一的 TreeMap也通过Comparator或者Comparable维护一个排序顺序 Map里你可以随意拥有多个null值但是只能有一个null键 Map流行的几个实现类HashMap、LinkedHashMap、HashTable和TreeMap
问问小秘 2020-01-03 13:31:13 0 浏览量 回答数 0

回答

Array.concat( ) 连接数组 Array.join( ) 将数组元素连接起来以构建一个字符串 Array.length 数组的大小 Array.pop( ) 删除并返回数组的最后一个元素 Array.push( ) 给数组添加元素 Array.reverse( ) 颠倒数组中元素的顺序 Array.shift( ) 将元素移出数组 Array.slice( ) 返回数组的一部分 Array.sort( ) 对数组元素进行排序 Array.splice( ) 插入、删除或替换数组的元素 Array.toLocaleString( ) 把数组转换成局部字符串 Array.toString( ) 将数组转换成一个字符串 Array.unshift( ) 在数组头部插入一个元素 Object.hasOwnProperty( ) 检查属性是否被继承 Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型 Object.propertyIsEnumerable( ) 是否可以通过 for/in 循环看到属性 Object.toLocaleString( ) 返回对象的本地字符串表示 Object.toString( ) 定义一个对象的字符串表示 Object.valueOf( ) 指定对象的原始值
茶什i 2019-12-02 03:21:00 0 浏览量 回答数 0

回答

HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object(); HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。  所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。    iterator:返回对此set中元素进行迭代的迭代器      size:返回此set中元素的数量(set的容量)      isEmpty:判断Hashset集合是否为空      contains:判断某个元素是否存在于HashSet中      add():如果此set中尚未包含指定元素,则添加指定元素
问问小秘 2020-01-03 13:45:14 0 浏览量 回答数 0

问题

sql的数据插入,为什么有语法错误

插入数据values 其中stu为数据库名,为什么说对象名无效...
吴孟桥 2019-12-01 19:52:56 1078 浏览量 回答数 1

问题

java数据库表关联程序控制的问题

有一个班级类Clazz,一个学生类Student,在Clazz中有一个属性List保存班级的所有学生,相对应,有一个班级表t_clazz和学生表t_student,学生表中维护所在班级的id。我使用普通的jdbc,在向学生表插入数据的时候,...
蛮大人123 2019-12-01 20:25:52 932 浏览量 回答数 1

问题

多线程情况下,不同service执行数据保存操作,如何保证首先是插入,后续的就是更新操作。

比如说POJO对象中barcode字段是唯一的。ThreadA和ThreadB可能在同一时间内同时保存barcode=111的对象!如图810783465561600884说明下,methodA 和 methodB 都加上了spring的事...
芍芍君 2019-12-01 20:00:44 1627 浏览量 回答数 3

问题

JS 中怎么把定义的对象的一个属性作为一个数组

function jsonObj(text, nodes){ this.text =text; this.nodes =nodes; }我想把nodes作为数组,这样可以插入...
小旋风柴进 2019-12-01 19:39:06 1231 浏览量 回答数 1

回答

我对 Virtual DOM 的理解是, 首先对我们将要插入到文档中的 DOM 树结构进行分析,使用 js 对象将其表示出来,比如一个元素对象,包含 TagName、props 和 Children 这些属性。然后我们将这个 js 对象树给保存下来,最后再将 DOM 片段插入到文档中。 当页面的状态发生改变,我们需要对页面的 DOM 的结构进行调整的时候,我们首先根据变更的状态,重新构建起一棵对象树,然后将这棵新的对象树和旧的对象树进行比较,记录下两棵树的的差异。 最后将记录的有差异的地方应用到真正的 DOM 树中去,这样视图就更新了。 我认为 Virtual DOM 这种方法对于我们需要有大量的 DOM 操作的时候,能够很好的提高我们的操作效率,通过在操作前确定需要做的最小修改,尽可能的减少 DOM 操作带来的重流和重绘的影响。其实 Virtual DOM 并不一定比我们真实的操作 DOM 要快,这种方法的目的是为了提高我们开发时的可维护性,在任意的情况下,都能保证一个尽量小的性能消耗去进行操作。
剑曼红尘 2020-04-06 15:52:41 0 浏览量 回答数 0

回答

使用cursor.lastrowid得到插入光标对象的最后一行ID,或者connection.insert_id()从该连接上最后插入获取的ID。来源:stack overflow
保持可爱mmm 2020-05-11 17:07:17 0 浏览量 回答数 0

回答

你写到了release/retain等方法, ARC 下你不能写这些方法,但ARC 会帮你在合适的地方插入这些方法。这将导致内存的延迟释放。autoreleasepool是为了 autorelease 这个方法,在对象的创建者没法销毁对象的时候,可以使用autorelease让autoreleasepool每隔一段时间检查该对象的引用计数,如果为0则释放对象。那么多个autoreleasepool的作用就是增加这种间隔,比原本autorelease释放的时间更早释放。
a123456678 2019-12-02 03:14:15 0 浏览量 回答数 0

问题

JavaScript中对象/数组的性能如何?(特别是对于Google V8)

与JavaScript(特别是Google V8)中的数组和对象相关的性能非常有趣。我在Internet上的任何地方都找不到有关此主题的详尽文章。 我了解某些对象使用类作为其基础数据结构。如果有很多属性...
保持可爱mmm 2020-02-08 11:01:21 2 浏览量 回答数 1

回答

连接点(Joinpoint): 表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点;在AOP中表示为“在哪里干”;        切入点(Pointcut): 选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法;在AOP中表示为“在哪里干的集合”;        通知(Advice): 在连接点上执行的行为,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知;在AOP中表示为“干什么”;        切面(Aspect):横切关注点的模块化,比如日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪干和干什么集合”;        引入(Introduction): 也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象);在AOP中表示为“干什么(引入什么)”;        目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为“被通知对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象;在AOP中表示为“对谁干”;        AOP代理(AOP Proxy): AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。        织入(Weaving): 织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
huanhuanming 2019-12-02 01:50:26 0 浏览量 回答数 0

回答

1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名。 <insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id"> insert into system(name) values(#{name}) </insert> 2.Mybatis执行完插入语句后,自动将自增长值赋值给对象systemBean的属性id。因此,可通过systemBean对应的getter方法获取! int count = systemService.insert(systemBean); int id = systemBean.getId(); //获取到的即为新插入记录的ID
小旋风柴进 2019-12-02 02:29:51 0 浏览量 回答数 0

问题

[@徐雷frank][¥20]在用fastjson将字符串转为JSONObject对象时,double类型被转为BigDecimal类型

在用fastjson将字符串转为JSONObject对象时,double类型被转为BigDecimal类型,再向es插入json对象时,报错:java.lang.IllegalArgumentException: cannot write ...
jiang0512 2019-12-01 20:28:39 3419 浏览量 回答数 2

问题

MySQL自动增量列跳了10-为什么??mysql

我有几个表,在其中我创建了一个对象ID为Int或Bigint,在两种情况下,它们似乎都会自动递增10(即,第一个插入是对象ID 1,第二个是对象ID 11&...
保持可爱mmm 2020-05-16 22:00:34 0 浏览量 回答数 1

回答

对于json和JavaScript对象你有点混淆了,上面的json本质上是一个对象,只是创建一个符合json格式的JavaScript对象,而对象没有push方法,push是数组方法,使用push方法会出错:TypeError: Object #<Object> has no method 'push' 对于函数调用也有使用错误,参数的分隔符只有",",而没有":"建议多看一下文档。 给对象插入值,直接赋值就行了。 var json = {"width":"10","height":"10"}; json['long']="10"; 建议:多看文档,调试时把调试窗口打开。
爵霸 2019-12-02 01:58:17 0 浏览量 回答数 0

回答

ArrayList是基于数组实现的,ArrayList线程不安全。 LinkedList是基于双链表实现的: 使用场景: (1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象; ( 2 ) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;
游客bnlxddh3fwntw 2020-04-10 13:42:02 0 浏览量 回答数 0

回答

MYSQL获取自增ID的四种方法select max(id) from tablename2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。 在多用户交替插入数据的情况下max(id)显然不能用。这时就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基 于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。select @@IDENTITY;@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。 比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。SHOW TABLE STATUS;得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID.
程序员诗人 2019-12-02 00:26:11 0 浏览量 回答数 0

回答

var price=$('<span style="font-size:14px; color:red"><strong>from 5000</strong></span>'); ======> var price = '<span style="font-size:14px; color:red"><strong>from 5000</strong></span>'; 你用$生成后就是对象了,DOM操作会将对象移动到当前插入的位置。变为字符串就不是dom对象了,会生成新的dom对象
吴孟桥 2019-12-02 02:27:49 0 浏览量 回答数 0

回答

Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:普通同步方法,锁是当前实例对象。静态同步方法,锁是当前类的class对象。同步方法块,锁是括号里面的对象。每个对象有一个监视器锁。对于同步代码块,monitorenter 指令插入到同步代码块的开始位置,monitorexit 指令插入到同步代码块的结束位置。对于 monitorenter,如果 monitor 的进入数为 0,则该线程进入 monitor,然后将进入数设置为 1,该线程即为 monitor 的所有者。如果线程已经占有该 monitor,只是重新进入,则进入 monitor 的进入数加 1。如果其他线程已经占用了 monitor,则该线程进入阻塞状态,直到 monitor 的进入数为 0,再重新尝试获取 monitor 的所有权。对于 monitorexit,指令执行时,monitor 的进入数减 1,如果减 1 后进入数为 0,那线程退出 monitor,不再是这个 monitor 的所有者。对于 synchronized 方法,会被翻译成普通的方法,JVM 根据 ACC_SYNCHRONIZED 标示符来实现方法的同步。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取 monitor,获取成功之后才能执行方法体,方法执行完后再释放 monitor。在方法执行期间,其他任何线程都无法再获得同一个 monitor 对象。
景凌凯 2020-04-22 17:08:13 0 浏览量 回答数 0

回答

你没说清楚json格式的数据 不会解析? 任何语言都有解析json的类包。 调用一下 生成对象 在挨个属性插入到数据库就行 没有捷径。 是要把json格式数据直接插入到数据库? 那json就当是字符串就好了 直接存。 如果是调用存储过程 json是参数 希望在存储过程中解析? 那SQL 原生方法是解析不了的 不过网上有例子
杨冬芳 2019-12-02 03:05:35 0 浏览量 回答数 0

问题

POI导PPT

PPT中如果包含插入的excel对象,其中里面的图表是根据excel对象内容自动生成,现在可以取到ppt中excel的数据并且可以修改,但是无法根据修改后的excel数据刷新显示的图表。 OLESh...
长安归故里. 2020-01-31 12:38:21 0 浏览量 回答数 1

回答

Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以插入数据慢,查找有下标,所以查询数据快,Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项前后项即可,插入数据较快。线性表,链表,哈希表是常用的数据结构,在进行java开发时,JDK已经为我们提供了一系列相应的类实现基本的数据结构,这些结构均在java.util包中,collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(elements),一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:    Iterator it = collection.iterator(); // 获得一个迭代子    while(it.hasNext()) {      Object obj = it.next(); // 得到下一个元素    }  由Collection接口派生的两个接口是List和Set。List接口  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。ArrayList类  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。Vector类  Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。Stack 类  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。Map接口  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。Hashtable类  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。  添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:    Hashtable numbers = new Hashtable();    numbers.put(“one”, new Integer(1));    numbers.put(“two”, new Integer(2));    numbers.put(“three”, new Integer(3));  要取出一个数,比如2,用相应的key:    Integer n = (Integer)numbers.get(“two”);    System.out.println(“two = ” + n);  由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。  如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。  Hashtable是同步的。HashMap类  HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。WeakHashMap类  WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。总结  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。同步性Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。数据增长从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
wangccsy 2019-12-02 01:48:37 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板