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 ...
随机推荐
- 输出Excel文件
/** * * 功能描述: <br> * 〈功能详细描述〉输出excle * * @param titles 标题 * @param contents 内容 * @param fileNa ...
- hdu 4476 Cut the rope (2-pointer && simulation)
Problem - 4476 题意是,给出若干绳子,对同一根绳子只能切割一次,求出最多能获得多少长度相同的绳子. 代码中,s是最大切割长度,而当前切割长度为t/2. 代码如下: #include &l ...
- Codeforces Round #179 (Div. 1 + Div. 2)
A. Yaroslav and Permutations 值相同的个数不能超过\(\lfloor \frac{n + 1}{2} \rfloor\). B. Yaroslav and Two Stri ...
- 【codeforces 789A】Anastasia and pebbles
[题目链接]:http://codeforces.com/contest/789/problem/A [题意] 有n种物品,每种物品有wi个; 你有两个口袋,每个口袋最多装k个物品; 且口袋里面只能装 ...
- echarts 图表自适应外部盒子大小
项目中用到了echarts,由于页面是自适应的,还得兼容移动, 因此图表还需要根据盒子的大小来变化. 自适应窗口及盒子大小 页面中有一个[放大.缩小]功能,及全屏展示和预览图表 窗口自适应 let m ...
- Django入门4--admin
python3选择__str__(self),python2选择__unicode__(self):
- int64 DWORD 与cstring 互转
//int64 与cstring 互转 int64_t val = 1111111111111111111; CString str; str.Format(("%I64d"), ...
- H3C 配置静态及动态域名解析
- 【踩坑记录】vue单个组件内<style lang="stylus" type="text/stylus" scoped>部分渲染失效
vue组件化应用,近期写的单个组件里有一个的渲染部分样式渲染不上去 因为同结构的其他组件均没有问题,所以排除是.vue文件结构的问题,应该是<style>内部的问题 <style l ...
- 2019年7月20日针对iPhone7/7P有锁机的爆破限制
背景 2019年7月20号苹果更改了激活策略,致使卡贴机一夜回到解放前,目前只能使用tmsi或者tmsi+iccid模式激活手机,但是缺点是移动联通信号真的不稳定,漏接电话,无法开启热点等等毛病.尤其 ...