java中为什么从集合中取出来的元素都是Object类型的

java中为什么从集合中取出来的元素都是Object类型的,第1张

java的容器中可以放基本的数据类型,但是是以包装类的形式,如int 在 容器中是先包装成Integer,再转变成Object存放。

集合中也可以放类的实例化对象。任何一种数据类型或者对象放进容器中后都会失去原有的类型,变成 Object,用的时候从容器中取出后进行转型成所需的类型就可以了,

《Think in java》 中是这样解释的: 由于当初编写集合时,那个集合的程序员根本不知道用户到底想把什么类型置入集合。若指示某个集合只允许特定的类型,会妨碍它成为一个“常规用途”的工具,为用户带来麻烦。为解决这个问题,集合实际容纳的是类型为Object的一些对象的句柄。

两种向Set中添加元素的方法,第一种是使用add()方法,每次添加一个元素到set中,当集合中不存在相同元素时将添加到集合中,并返回true,当集合中存在元素时,返回false。代码如下:

Set<String> sets = new HashSet<>();

setsadd("String");

Systemoutprintln(setsadd("Tree"));

Systemoutprintln(setsadd("String"));

List<String> lists = new LinkedList<>();

listsadd("test");

listsadd("test");

listsadd("one");

Systemoutprintln(setsaddAll(lists));

还有一个是向集合中批量添加元素的方法addAll(),这个方法的入参是Colletion。上述代码执行结果如下:

扩展知识

Set集合可以知道某物是否已近存在于集合中,不会存储重复的元素,注重独一无二的性质,用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。可以很好地作为排重时使用的数据结构,但要注意集合内部数据一般情况没有顺序。常用的set有HashSet和TreeSet。

TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,javaioSerializable接口。一种基于TreeMap的NavigableSet实现,支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。

Redis有五种结构:

1、String

可以是字符串,整数或者

浮点数

,对整个字符串或者字符串中的一部分执行 *** 作,对整个整数或者浮点执行自增(increment)或者自减(decrement) *** 作。

字符串命令:

①get、获取存储在指定键中的值

②set、设置存储在指定键中的值

③del、删除存储在指定键中的值(这个命令可以用于所有的类型)

2、list

一个

链表

,链表上的每个节点都包含了一个字符串,虫链表的两端推入或者d出元素,根据

偏移量

对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。

列表命令:

①rpush、将给定值推入列表的右端

②lrange、获取列表在指定范围上的所有值

③lindex、获取列表在指定范围上的单个元素

④lpop、从列表的左端d出一个值,并返回被d出的值

3、set

包含字符串的无序收集器(unordered

collection)、并且被包含的每个字符串都是

独一无二的

。添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,

差集

,从集合里面随机获取元素。

集合命令:

①sadd、将给定元素添加到集合

②smembers、返回集合包含的所有元素

③sismember、检查指定元素是否存在于集合中

④srem、检查指定元素是否存在于集合中,那么移除这个元素

4、hash

包含键值对无序

散列

表,添加,获取,移除当键值对,获取所有键值对。

散列命令:

①hset、在散列里面关联起指定的键值对

②hget、获取指定散列键的值

③hgetall、获取散列包含的所有键值对

④hdel、如果给定键存在于散列里面,那么移除这个键

5、zset

字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。

有序集合

命令:

①zadd、将一个带有给定分值的成员添加到有序集合里面

②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素

③zrangebyscore、获取有序集合在给定分值范围内的所有元素

④zrem、如果指定成员存在于有序集合中,那么移除这个成员

获取元素集合的方法有很多,接下来为大家介绍喜爱使用js通过元素class名字获取元素集合的方法

代码如下:

function

getElementsByClassName(n)

{

var

classElements

=

[],allElements

=

documentgetElementsByTagName('');

for

(var

i=0;

i<

allElementslength;

i++

)

{

if

(allElements[i]className

==

n

)

{

classElements[classElementslength]

=

allElements[i];

}

}

return

classElements;

}

这个没有什么特别需要注意的,主要就是你所用的集合必须是线程安全的,同一时间之允许一个线程访问这个几个,API里有提供这种集合,像Vector这种,不然你负责add元素的线程还没有执行呢,负责get的线程就去取了,这是会出异常的

List,Set都是继承自Collection接口。List特点:元素有放入顺序,元素可重复 。Set特点:元素无放入顺序,元素不可重复。注意,元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的。

有序或无序是指是否按照其添加的顺序来存储对象。List 是按照元素的添加顺序来存储的。而 Set 的实现类都有一套自己的排序算法,每添加一个元素,都会按照其内部算法将元素添加到合适的位置,所以Set集合不能有重复的元素,也不能保证内部存储是按元素添加的顺序而存储的。

List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet。

扩展资料:

HashSet输入顺序:

1、当输入的值大小和底层数组大小差不多的时候,HashSet的输入顺序是无序的,但输出是有序的,因为这些数的哈希值,在底层是顺序拍的,故输出也是有序的。

2、而当输入的值大小和底层数组相差很大时,大的数的哈希值有可能是小于比他小的数的,这时候输出的结果就是无序的。

HashSet 比较两个对象是否相同的机制是 1hash 2 == 3equals()

第一步就是比较两个对象的hash值是否相同(注意这里的hash值是经过处理的,为了使散列更均匀)

hash值相同的就会散列到一组 不相同就会散列到不同的组(此时就不会再继续比较了,因为在不同组hashset认为他们就是不同的对象)

第二步 如果hash值相同 则进行连等判断 即比较内存地址是否相同 如果不相同那么hashset就认为他们肯定不是相同的对象 如果内存地址相等(这一步最主要的目的其实就是删除元素的时候判断)那么进行第三步

第三步 如果equals返回相同 那么他们就是彻彻底底的相同的对象 不能添加到set里,如果返回不同那么他们就不是彻底的不相同 就可以添加到一个set里

楼主明白了吧,纯手打,希望对你有帮助

原生JS有3种方式来获取元素:

getElementById('id') getElementsByName('name') getElementsByTagName('tag') getElementById是获取元素最快的方式,但我们不能给每个HTML元素都加以ID吧,所以我们需要一个很方便的通过className来获取元素 function getElementsByClassName(className,tagName){ var ele=[],all=documentgetElementsByTagName(tagName||""); for(var i=0;i<alllength;i++){ if(all[i]className==className){ ele[elelength]=all[i]; } } return ele; } consolelog(getElementsByClassName("entry")); consolelog(getElementsByClassName("entry","div"));

实现原理很简单,通过getElementsByTagName获取到一个元素集合,如果传入了tagname这个参数就根据传入的

tagname来获取,否则获取所有的元素,然后再一个一个元素来匹配classname是否相等

上面这个方法很粗糙,能实现我们的基本需求,如果我们要获取的元素有多个 classname怎么办

明显通过className==是不行了

所以我们只要把上面两篇文章的hasclass函数搬过来就OK了,我们再次来改造下我们的getElementsByClassName函数

function getElementsByClassName(className,tagName){ var ele=[],all=documentgetElementsByTagName(tagName||""); for(var i=0;i<alllength;i++){ if(all[i]classNameclassNamematch(new RegExp('(\\s|^)'+cls+'(\\s|$)'))){ ele[elelength]=all[i]; } } return ele; }

这样就能处理一个元素含有多个classname的情况了

以上就是关于java中为什么从集合中取出来的元素都是Object类型的全部的内容,包括:java中为什么从集合中取出来的元素都是Object类型的、java中怎么往集合类set里添加数据、Redis有哪些数据结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9313964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存