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 ...
随机推荐
- 洛谷P1653 猴子
#include<bits/stdc++.h> using namespace std; inline void read(int &tmp) { ;char c=getchar( ...
- Hbase架构与实现
- shell 并发执行任务
#!/bin/bash # ref: https://blog.csdn.net/spch2008/article/details/51433353 token(){ pid=$ # 判断是否有传入p ...
- Java变量以及内存分配
Java变量以及内存分配(非常重要) 堆栈 静态存储区域 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操 ...
- H3C 无线网络典型部署-热点覆盖
- H3C OSPF基本配置命令
- [转]【转】大型高性能ASP.NET系统架构设计
大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...
- HDU 1024 Max Sum Plus Plus (动态规划 最大M字段和)
Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...
- Linux内核 结构 struct urb
struct urb 结构中和 USB 设备驱动有关的成员是: struct usb_device *dev 指向这个 urb 要发送到的 struct usb_device 的指针. 这个变量必须被 ...
- dotnet 通过 WMI 获取系统补丁
本文告诉大家如何通过 WMI 获取补丁 通过 Win32_QuickFixEngineering 可以获取系统启动的服务 下面代码只是获取补丁的 kb 字符 const string query = ...