java之set接口
1.set集合不能存储重复的元素,
2.HashSet集合不能保证的迭代顺序与元素存储顺序相同。
3.HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
4.hashset集合的存储结构为哈希表(实质上为数组机制的链式存储),在存储对象时,会调用对象的hashcode(),判断hash值是否一致,若一致则调用equals(),判断内容是否一致,不一致则进行存储从而保证了数据的唯一性。【自定义对象必须重写hashcode()和equals()方法】。
如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。
5.基本数据的包装类、引用数据类型;
package com.oracle.demo01; import java.util.Iterator;
import java.util.LinkedHashSet; public class Demo04 {
public static void main(String[] args) {
//仍不能存储重复元素,但有序有堆栈数据存储结构的效果
LinkedHashSet<String> set=new LinkedHashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("a");
//获取迭代器对象
Iterator<String> i=set.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
}
6.存储自定义数据类型时,需要重写hashcode()和equals()
自定义对象:成员属性、成员方法、有参构造、无参构造、get-set方法、tostring()、hashcode()、equals().
package com.oracle.demo01; //自定义类型,存哈希
public class Person {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public Person() {
super();
} @Override // 输入hashcode alt+/
//source hashcode()
public int hashCode() {
// TODO Auto-generated method stub
//乘以31,避免重复
return name.hashCode() + age*31;//String类调用hashcode(); 31 65 33
} @Override
public boolean equals(Object obj) {//此时obj为集合中原有的元素
if(obj==this){
return true;
}
if(obj==null){
return false;
}
if(obj instanceof Person){
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
// TODO Auto-generated method stub
return false;
}
}
添加对象,遍历对象
linkedhashset:双向链表,保证存取有序,是链表和哈希表组成的一个数据存储结构。
package com.oracle.demo01; import java.util.Iterator;
import java.util.LinkedHashSet; public class Demo05 {
public static void main(String[] args) {
LinkedHashSet<Person> p=new LinkedHashSet<Person>();
p.add(new Person("阿布都",18));
p.add(new Person("易建联",28));
p.add(new Person("郭艾伦",38));
p.add(new Person("郭艾伦",48));
//迭代器迭代
/* public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}*/
//迭代器
Iterator<Person> pp=p.iterator();
while(pp.hasNext()){
System.out.println(pp.next());//重写的String toString()方法
}
//增强for循环
for(Person ppp:p){
System.out.println(ppp);
}
}
}
java之set接口的更多相关文章
- 【转】java通用URL接口地址调用方式GET和POST方式
java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- java中set接口的用法
java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特 ...
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- Java面向对象:接口
Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...
- JAVA ,Map接口 ,迭代器Iterator
1. Map 接口概述 java.util.Map 接口描述了映射结构, Map 接口允许以键集.值集合或键 - 值映射关系集的形式查看某个映射的内容. Java 自带了各种 Map 类. 这些 ...
- java抽象类和接口区别
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- java抽象类与接口的区别及用法
java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...
- 如何让Java和C++接口互相调用:JNI使用指南
如何让Java和C++接口互相调用:JNI使用指南 转自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos ...
- Java中的队列:java.util.Queue接口
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...
随机推荐
- 7-3三个模块 hashlib ,logging,configparser和序列化
一 hashlib 主要用于字符串加密 1 import hashlib md5obj=hashlib.md5() # 实例化一个md5摘要算法的对象 md5obj.update('alex3714' ...
- php parse_url linux 解析问题
耕毅 解析url函数parse_url() (PHP 4, PHP 5, PHP 7) parse_url — 解析 URL,返回其组成部分 mixed parse_url ( string $url ...
- saltStack_Pillar
Pillar是Salt非常重要的一个组件,它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用.这里可以看出Pillar的一个特点,Pillar数据是与特定minion ...
- Libev源码分析09:select突破处理描述符个数的限制
众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符.描述符集的大小就是它所能处理的最大描述符限制.通常情况下该值为1024,等同于每个进程所能打开的描述符个数. 增大描述符集 ...
- oracle使用日期
当使用日期是,需要注意如果有超过5位小数加到日期上, 这个日期会进到下一天! 例如: 1. SELECT TO_DATE(‘01-JAN-93’+.99999) FROM DUAL; Returns: ...
- Python--day21--复习
序列化模块总结: jison格式化输出: Serialize obj to a JSON formatted str.(字符串表示的json对象) Skipkeys:默认值是False,如果dict的 ...
- poj 3572 Hanoi Tower
Hanoi Towers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- 网易大数据平台的Spark技术实践
网易大数据平台的Spark技术实践 作者 王健宗 网易的实时计算需求 对于大多数的大数据而言,实时性是其所应具备的重要属性,信息的到达和获取应满足实时性的要求,而信息的价值需在其到达那刻展现才能利益最 ...
- 详解PhpStudy集成环境升级MySQL数据库版本
http://phpstudy.php.cn/jishu-php-2967.html phpstudy里没有地方可以设置mysql数据库,很多人都疑惑在phpstudy里怎么升级mysql数据库版本, ...
- python基础十二之生成器进阶
生成器表达式 (满足条件的元素或其相关的操作 for 元素 in 可迭代对象 if 条件) g = (i for i in range(10)) for i in g: print(i) egg_li ...