java 怎么给set赋值

java 怎么给set赋值,第1张

通过remove和add方法,set集合中的对象属性为private final

Set接口

集合里的多个对象没有明显顺序。Set集合和Collection基本一样,没有

提供额外方法,只是和Collection行为不同

Set集合不允许包含相同的元素,如果add的是两个相同元素会返回false

Set不实用==运算符,根据equals方法

HashSet类

HashSet类是Set接口的典型实现,大多数时候使用Set集合都是用这个类实现

HashSet按Hash算法来存储集合中的元素

HashSet特点:

1不能保证元素的排列顺序,顺序可能变化

2HashSet不是同步的,多个线程同时访问一个Set集合,必须用代码

保证同步

3集合元素值可以是null

当向HashSet集合中存入一个元素,HashSet会调用该对象的HashCode()

得到对象的hashCode,根据HashCode来决定对象在HashSet中的位置

如果两个元素equal方法比较返回true但是hashCode()方法返回值不同,

HashSet会把两个元素存储在不同位置

HashSet判断两个元素相同需要equal和hashCode都相同

因此重写类的equals方法和hashCode()方法要保证两个对象通过equals

返回true时hashCode也相等

Hash算法保证通过一个对象快速找到另一个对象。可以很快的执行,当需要

查找集合中的某个元素时,hash算法可以直接根据该元素的值找到该元素

从而让程序快速找到元素。

在数组中通过数组元素索引寻找元素,HashSet通过hashcode索引

重写hashCode()方法的基本步骤

当两个对象通过equals方法返回true时,两个对象的hashCode相等

对象中用作equals比较标准的属性,应该用来计算hashCode

向HashSet中添加可变对象时,如果修改HashSet集合中对象,有可能导致

该对象与集合中其他对象相等,从而导致HashSet无法正确访问对象

HashSet有一个子类 LinkedHashSet,LinkedHashSet集合也是根据HashCode来决定

元素的存储位置,同时使用链表维护元素次序,这样是的元素看起来是以

插入顺序保存,便利集合时会按插入顺序来访问。

Linked需要维护元素的插入顺序,性能略低于HashSet,但在迭代时性能更好

TreeSet是SortedSet接口的唯一实现

TreeSet可以确保元素处于排序状态。提供了几个额外方法:

1Comparator

comparator():返回当前Set使用的Comparator,或者null,表示

自然的方式排序

2Object first():返回集合中的第一个元素

3Object last():返回集合中最后一个元素

4Object lower(Object

e):返回集合中位于指定元素之前的元素

5Object higher(Object

e):返回集合中位于制定元素之后的元素

6SortedSet

subSet(fromElement,toElement):返回set的子集,范围从from到to

7SortedSet headSet(toElement)返回set子集,小于toElement

8SortedSet

tailSet(fromElement)返回set子集,由大于等于fromElement元素组成

TreeSet是根据元素值来进行排序而不是根据插入顺序

TreeSet采用红黑树的数据结构对元素排序 :支持自然排序(默认)和定制排序

自然排序:

TreeSet会调用集合元素的compareTo方法来比较元素之间的大小关系,

然后将集合元素按升序排列。

Java提供了一个Comparable接口,该接口定义了一个compareTo(Object obj)方法

该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象

可以比较大小。obj1compareTo(obj2),如果方法返回0,表明两个对象相等。如果

返回正整数,表明obj1大于obj2;如果返回负整数,表明obj1小于obj2

如果要将对象添加如TreeSet该对象必须实现Comparable接口

当想TreeSet中添加对象时,会先将要添加的对象与TreeSet中的对象用compareTo比较

如果找不到compareTo则引发ClassCastException异常

因为只有同一个类型才能比较大小 所以TreeSet中添加的应该是同一个类型的对象

TreeSet和HashSet集合中的对象如果是可变对象,对象属性改变时,会导致集合处理

对象复杂化,易出错。所以应该尽量在集合中添加不可变对象

不可变对象是

1属性为private final

2含有带参数构造器,为对象初始化

3属性有get方法没有set方法

定制排序:

TreeSet的自然排序是根据集合元素大小,TreeSet将它们以升序排列。使用定制

排序,如降序,使用Comparator接口的帮助。接口中包含一个int compare(T o1,T o2)

用于比较o1和o2的大小:重写该方法可以改变排序规则

HashSet插入元素的顺序和元素输出的或者说是元素在HashSet中的位置不一致。

HashSet可以插入null值

保存存储在HashSet中的元素都是唯一的。

那么HashSet是如何保证集合中的元素是不重复的呢。

当有对象插入HashSet中的时候,首先需要判断该对象的HashCode的值在HashSet中是否有相同的,如果没有,那么就插入,如果有相同的HashCode值的对象,这时会调用对象的equals方法来检查对象是否真的相同,如果真的相同,那么就不能插入。

HashSet加入的源码

mapput(e,PRESENT)==null它又是HashMap的源码

putval源码为

从上述源码可以看出,当将一个键值放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果有两个key的hash值相同,那么就让这两个key进行equals比较,如果两者相等,那么就不允许插入。

package comxjjutil;

import javautilHashSet;

import javautilList;

import javautilMap;

import javautilRandom;

import javautilSet;

/

随机数工具,单例模式

@author XuJijun

/

public class RandomUtils {

private static Random random;

//双重校验锁获取一个Random单例

public static Random getRandom() {

if(random==null){

synchronized (RandomUtilsclass) {

if(random==null){

random =new Random();

}

}

}

return random;

}

/

获得一个[0,max)之间的整数。

@param max

@return

/

public static int getRandomInt(int max) {

return Mathabs(getRandom()nextInt())%max;

}

/

获得一个[0,max)之间的整数。

@param max

@return

/

public static long getRandomLong(long max) {

return Mathabs(getRandom()nextInt())%max;

}

/

从list中随机取得一个元素

@param list

@return

/

public static <e> E getRandomElement(List<e> list){

return listget(getRandomInt(listsize()));

}

/

从set中随机取得一个元素

@param set

@return

/

public static <e> E getRandomElement(Set<e> set){

int rn = getRandomInt(setsize());

int i = 0;

for (E e : set) {

if(i==rn){

return e;

}

i++;

}

return null;

}

/

从map中随机取得一个key

@param map

@return

/

public static <k, v=""> K getRandomKeyFromMap(Map<k, v=""> map) {

int rn = getRandomInt(mapsize());

int i = 0;

for (K key : mapkeySet()) {

if(i==rn){

return key;

}

i++;

}

return null;

}

/

从map中随机取得一个value

@param map

@return

/

public static <k, v=""> V getRandomValueFromMap(Map<k, v=""> map) {

int rn = getRandomInt(mapsize());

int i = 0;

for (V value : mapvalues()) {

if(i==rn){

return value;

}

i++;

}

return null;

}

public static void main(String[] args) {

Set<string> set = new HashSet<>();

for (int i = 0; i < 12; i++) {

setadd(I am: + i);

}

for (int i = 0; i < 10; i++) {

Systemoutprintln(getRandomElement(set));

}

}

}

</string></k,></k,></k,></k,></e></e></e></e>

如果前端集合的对象是通过AJAX请求发送到后端的,那么在后端可以通过接收请求参数的方式获取对象的值。

如果前端集合的对象是通过AJAX请求发送到后端的,那么在后端可以通过接收请求参数的方式获取对象的值。

例如,如果前端通过AJAX请求发送了如下数据:

{

"name": "John",

"age": 30,

"hobbies": ["music", "sports"]

}

那么在后端可以通过如下代码获取对象的值:

// 获取请求参数

const data = requestgetParameterMap()

// 获取对象的值

const name = dataget('name')

const age = dataget('age')

const hobbies = dataget('hobbies')

// 输出对象的值

consolelog(name) // John

consolelog(age) // 30

consolelog(hobbies) // ["music", "sports"]

上面的代码通过requestgetParameterMap方法获取请求参数,然后通过get方法获取对象的属性值。

ArrayList与HashSet都是Collections类的子类,Collection类提供了许多常用的方法,例如contains()就是其中一个!我没有看过这两个类的contains()具体是如何实现的,但是通过数据结构我觉得应该是这个样子,ArrayList也就是一个数组,遍历整个数组,如果数组中存在这样一个元素equals(Object obj);那么就是true否则返回false而HashSet的话,只需要比较key就能确定是否含有该元素了!

eaquals()为true的话,一定有相同的HashCode的!

hashset和hashmap的区别为:存储不同、放入方法不同、hashcode值不同。hashset和hashmap都是存在于javautil包中的类,用于存储数据,且都不允许集合中出现重复的元素。

一、存储不同

1、hashset:HashSet仅仅存储对象。

2、hashmap:HashMap储存键值对。

二、放入方法不同

1、hashset:hashset使用add()方法将元素放入set中。

2、hashmap:HashMap使用put()方法将元素放入map中。

三、hashcode值不同

1、hashset:HashSet使用成员对象来计算hashcode值。

2、hashmap:HashMap中使用键对象来计算hashcode值。

一般是通过迭代期获取数据,因为set集合无序,所以输出不是顺序输出

import javautilHashSet;

import javautilIterator;

import javautilSet;

public class Test{

    public static void main(String[] args) {

        // 初始化set集合

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

        setadd("1");

        setadd("2");

        setadd("3");

        // 获取set集合数据

        for (Iterator iterator = setiterator(); iteratorhasNext();) {

            String string = (String) iteratornext();

            Systemoutprintln(string);

        }

        

    }

}

以上就是关于java 怎么给set赋值全部的内容,包括:java 怎么给set赋值、HashSet的去重原理、easyui控件,如何在页面中获取map类型的list集合的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/web/9559310.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存