本文目录一览:
- 1、怎样从java集合类set中取出数据?
- 2、java中 List 与Set 有什么区别?
- 3、java set 顺序
- 4、java集合set有哪些方法
- 5、java中set的用法
- 6、java 怎么给set赋值
怎样从java集合类set中取出数据?
创建set的iterator方法:
SetObject set = new HashSetObject();
IteratorObject it = set.iterator();
while(it.hasNext())//判断是否有下一个
it.next()取出元素。
以上方法便是从Set集合中取出数据。
扩展资料:
Java中使用Set接口描述一个集合(集合不允许有“重复值”,注意重复的概念),集合Set是Collection的子接口,Set不允许其数据元素重复出现,也就是说在Set中每一个数据元素都是唯一的。Set接口定义的常用方法如下:
1、size() 获取Set尺寸(即Set包含数据元素的总数)。
2、 add(Object obj) 向Set中添加数据元素obj。
3、remove(Object obj) 从Set中移除数据元素obj。
4 、contains(Object obj) 判断当前Set中是否包含数据元素obj,如果包含返回true,否则返回false。
5、 iterator() 将Set装入迭代器。
参考资料:java集合类_百度百科
java中 List 与Set 有什么区别?
Java的集合类都位于java.util包中,Java集合中存放的是对象的引用,而非对象本身。
Java集合主要分为三种类型:
a.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。
b.List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。
c.Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能对集合中的键对象进行排序。
Set、List和Map统称为Java集合。
1.Set(集)
Set集合中的对象不按特定方式排序,并且没有重复对象。Set接口主要有两个实现类HashSet和TreeSet。HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构。TreeSet类实现了SortedSet接口,具有排序功能。
Set的add()方法判断对象是否已经存在于集合中的判断流程:
boolean isExists = false;
Iterator it = set.iterator();
while(it.hasNext()){
Object object = it.next();
if(newObject.equals(oldObject)){
isExists = true;
break;
}
}
2.HashSet类
当HashSet向集合中加入一个对象时,会调用对象的hashCode()方法获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。
当Object1变量和object2变量实际上引用了同一个对象,那么object1和object2的哈希码肯定相同。
为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为相等时,它们的哈希码也相等。即:
customer1.hashCode() == customer2.hashCode();
如:对应于Customer类的以下重写后的equals()方法:
public boolean equals(Object o){
if(this==o) return true;
if(!o instanceof Customer) return false;
final Customer other = (Customer)o;
if(this.name.equals(other.getName())this.age==other.getAge())
return true;
else
return false;
}
为了保证HashSet正常工作,如果Customer类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Customer对象的哈希码也一样。
public int hashCode(){
int result;
result = (name==null?0:name.hashCode());
result = 29*result+(age==null?0:age.hashCode());
return result;
}
3.TreeSet类
TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。TreeSet支持两种排序方式:自然排序和客户化排序,在默认情况下TreeSet采用自然排序方式。
a.自然排序
在JDK中,有一部分类实现了Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果返回值小于0,表示x小于y。
TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排列,这种排序方式称为自然排序。
以下列出了JDK中实现了Comparable接口的一些类的排序方式
类 排序
BigDecimal\BigInteger\Byte\Double\Float\Integer\Long\Short 按数字大小排序
Character 按字符的Unicode值的数字大小排序
String 按字符串中字符的Unicode值排序
使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些对象的类必须实现了Comparable接口,否则会在第二次调用TreeSet的add()方法时,会抛出ClassCastException异常。
例如:
以下是Customer类的compareTo()方法的一种实现方式:
public int compareTo(Object o){
Customer other = (Customer)o;
//先按照name属性排序
if(this.name.compareTo(other.getName())0) return 1;
if(this.name.compareTo(other.getName())0) return -1;
//再按照age属性排序
if(this.ageother.getAge()) return 1;
if(this.ageother.getAge()) return -1;
return 0;
}
为了保证TreeSet能正确地排序,要求Customer类的compareTo()方法与equals()方法按相同的规则比较两个Customer对象是否相等。
因此在Customer类的equals()方法中应该采用相同的比较规则:
public boolean equals(Object o){
if(this==o) return true;
if(!(o instanceof Customer)) return false;
final Customer other = (Customer)o;
if(this.name.equals(other.getName())this.age==other.getAge()){
return true;
}else{
return false;
}
}
值得注意的是,对于TreeSet中已经存在的Customer对象,如果修改了它们的属性,TreeSet不会对集合进行重新排序。在实际域模型中,实体类的属性可以被更新,因此不适合通过TreeSet来排序。最适合于排序的是不可变类。
b.客户化排序
除了自然排序,TreeSet还支持客户化排序。java.util.Comparator接口用于指定具体的排序方式,它有个compare(Object object1,Object object2)方法,用于比较两个对象的大小。当表达式compare(x,y)的值大于0,表示x大于y;当compare(x,y)的值小于0,表示x小于y;当compare(x,y)的值等于0,表示x等于y。
例如:如果希望TreeSet仅按照Customer对象的name属性进行降序排列,可以创建一个实现Comparator接口的类CustomerComparator:
public class CustomerComparator implements Comparator{
public int compare(Object o1,Object o2){
Customer c1= (Customer)o1;
Customer c2 = (Customer)o2;
if(c1.getName().compareTo(c2.getName())0) return -1;
if(c2.getName().compareTo(c2.getName())0) return 1;
return 0;
}
}
接下来在构造TreeSet的实例时,调用它的TreeSet(Comparator comparator)构造方法:
Set set = new TreeSet(new CustomerComparator());
4.向Set中加入持久化类的对象
例如两个Session实例从数据库加载相同的Order对象,然后往HashSet集合里存放,在默认情况下,Order类的equals()方法比较两个Orer对象的内存地址是否相同,因此order1.equals(order2)==false,所以order1和order2游离对象都加入到HashSet集合中,但实际上order1和order2对应的是ORDERS表中的同一条记录。对于这一问题,有两种解决方案:
(1)在应用程序中,谨慎地把来自于不同Session缓存的游离对象加入到Set集合中,如:
Set orders = new HashSet();
orders.add(order1);
if(!order2.getOrderNumber().equals(order1.getOrderNumber()))
order.add(order2);
(2)在Order类中重新实现equals()和hashCode()方法,按照业务主键比较两个Order对象是否相等。
提示:为了保证HashSet正常工作,要求当一个对象加入到HashSet集合中后,它的哈希码不会发生变化。
5.List(列表)
List的主要特征是其对象以线性方式存储,集合中允许存放重复对象。List接口主要的实现类有LinkedList和ArrayList。LinkedList采用链表数据结构,而ArrayList代表大小可变的数组。List接口还有一个实现类Vector,它的功能和ArrayList比较相似,两者的区别在于Vector类的实现采用了同步机制,而ArrayList没有使用同步机制。
List只能对集合中的对象按索引位置排序,如果希望对List中的对象按其他特定方式排序,可以借助Comparator和Collections类。Collections类是集合API中的辅助类,它提供了操纵集合的各种静态方法,其中sort()方法用于对List中的对象进行排序:
a.sort(List list):对List中的对象进行自然排序。
b.sort(List list,Comparator comparator):对List中的对象进行客户化排序,comparator参数指定排序方式。
如Collections.sort(list);
6.Map(映射)
Map(映射)是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象,而值对象仍可以是Map类型,依次类推,这样就形成了多级映射。
Map有两种比较常用的实现:HashMap和TreeMap。HashMap按照哈希算法来存取键对象,有很好的存取性能,为了保证HashMap能正常工作,和HashSet一样,要求当两个键对象通过equals()方法比较为true时,这两个对象的hashCode()方法返回的哈希码也一样。
TreeMap实现了SortedMap接口,能对键对象进行排序。和TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式。
例:创建一个缓存类EntityCache,它能粗略地模仿Session的缓存功能,保证缓存中不会出现两个OID相同的Customer对象或两个OID相同的Order对象,这种惟一性是由键对象的惟一性来保证的。
Key.java:
package mypack;
public class Key{
private Class classType;
private Long id;
public Key(Class classType,Long id){
this.classType = classType;
this.id = id;
}
public Class getClassType(){
return this.classType;
}
public Long getId(){
return this.id;
}
public boolean equals(Object o){
if(this==o) return true;
if(!(o instanceof Key)) return false;
final Key other = (Key)o;
if(classType.equals(other.getClassType())id.equals(other.getId()))
return true;
return false;
}
public int hashCode(){
int result;
result = classType.hashCode();
result = 29 * result + id.hashCode();
return result;
}
}
EntityCache.java:
package mypack;
import java.util.*;
public class EntityCache {
private Map entitiesByKey;
public EntityCache() {
entitiesByKey=new HashMap();
}
public void put(BusinessObject entity){
Key key=new Key(entity.getClass(),entity.getId());
entitiesByKey.put(key,entity);
}
public Object get(Class classType,Long id){
Key key=new Key(classType,id);
return entitiesByKey.get(key);
}
public Collection getAllEntities(){
return entitiesByKey.values();
}
public boolean contains(Class classType,Long id){
Key key=new Key(classType,id);
return entitiesByKey.containsKey(key);
}
}
java set 顺序
在java语言中,提供多种不同的结构来组织对象,Set(集合)是其中的一种,本身是一个接口,其迭代时的顺序取决于其具体实现。典型的实现包括:
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;
LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。
扩展资料
SetString set = new TreeSetString();
set.add(“f”);
set.add(“a”);
set.add(“b”);
set.add(“c”);
set.add(“d”);
set.add(“e”);
System.out.println(set);
参考资料:百度百科 set (计算机学)
java集合set有哪些方法
set是一个接口,一般实现类用HashSet
方法摘要
boolean add(E e)
如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
boolean addAll(Collection? extends E c)
如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
void clear()
移除此 set 中的所有元素(可选操作)。
boolean contains(Object o)
如果 set 包含指定的元素,则返回 true。
boolean containsAll(Collection? c)
如果此 set 包含指定 collection 的所有元素,则返回 true。
boolean equals(Object o)
比较指定对象与此 set 的相等性。
int hashCode()
返回 set 的哈希码值。
boolean isEmpty()
如果 set 不包含元素,则返回 true。
IteratorE iterator()
返回在此 set 中的元素上进行迭代的迭代器。
boolean remove(Object o)
如果 set 中存在指定的元素,则将其移除(可选操作)。
boolean removeAll(Collection? c)
移除 set 中那些包含在指定 collection 中的元素(可选操作)。
boolean retainAll(Collection? c)
仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
int size()
返回 set 中的元素数(其容量)。
Object[] toArray()
返回一个包含 set 中所有元素的数组。
T
T[] toArray(T[] a)
返回一个包含此 set
中所有元素的数组;返回数组的运行时类型是指定数组的类型。
java中set的用法
class Test {
private String name ;
void setName(String name){ this.name = name ;}
String getName() { return name ;}
public static void main(String [] args)
{
Test test = new Test();
test.setName(“Tom”);
System.out.println (“get the name is :” + test.getName());
}
}
java 怎么给set赋值
通过remove和add方法,set集合中的对象属性为private final
Set接口
集合里的多个对象没有明显顺序。Set集合和Collection基本一样,没有
提供额外方法,只是和Collection行为不同
Set集合不允许包含相同的元素,如果add的是两个相同元素会返回false
Set不实用==运算符,根据equals方法
HashSet类
HashSet类是Set接口的典型实现,大多数时候使用Set集合都是用这个类实现
HashSet按Hash算法来存储集合中的元素
HashSet特点:
1.不能保证元素的排列顺序,顺序可能变化
2.HashSet不是同步的,多个线程同时访问一个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可以确保元素处于排序状态。提供了几个额外方法:
1.Comparator
comparator():返回当前Set使用的Comparator,或者null,表示
自然的方式排序
2.Object first():返回集合中的第一个元素
3.Object last():返回集合中最后一个元素
4.Object lower(Object
e):返回集合中位于指定元素之前的元素
5.Object higher(Object
e):返回集合中位于制定元素之后的元素
6.SortedSet
subSet(fromElement,toElement):返回set的子集,范围从from到to
7.SortedSet headSet(toElement)返回set子集,小于toElement
8.SortedSet
tailSet(fromElement)返回set子集,由大于等于fromElement元素组成
TreeSet是根据元素值来进行排序而不是根据插入顺序
TreeSet采用红黑树的数据结构对元素排序 :支持自然排序(默认)和定制排序
自然排序:
TreeSet会调用集合元素的compareTo方法来比较元素之间的大小关系,
然后将集合元素按升序排列。
Java提供了一个Comparable接口,该接口定义了一个compareTo(Object obj)方法
该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象
可以比较大小。obj1.compareTo(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的大小:重写该方法可以改变排序规则
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/189354.html
微信扫一扫
支付宝扫一扫