首页 > 集合(5)

集合(5)

容器选择

取的元素很多,频繁的增删元素:linkedlist

涉及到增删,不频繁:linkedlist,arraylist

涉及到了增删,同时涉及到了查询:建议使用arraylist【一般情况增删不多,查询多】

 

Set:没有顺序,元素不可以重复

Set集合的功能和collection的功能是一致的。

 

Set两大子类

Hashset:底层数据结构是哈西表【hashset 中的顺序是按照哈希值的顺序存放的,与存的顺序无关】

Treeset

 

哈希值在比较的时候;如果哈希值相同会再判断元素对象是否相同(equals)。

 

一般自定义的类通常要复写hashcode(),equals()【尤其是要加入到hashset里面的】

 

HashSet删除和判断的依据:

对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode() 的equals();

Arraylist判断元素是否存在以及删除,只依赖equals()【取决于数据结构】

 

Hashset练习:姓名年龄相同为同一人

class Person{String name;int age;Person(String name,int age){this.name=name;this.age=age;}public int hashCode(){return name.hashCode()+age;}public boolean equals(Object obj){Person p=(Person)obj;if(p.name==this.name&& p.age==this.age){return true;}else{return false;}}
}
public class test{public static void main(String[] args){HashSet hs = new HashSet();Person s1= new Person("zhangsan",12);Person s2= new Person("lisi",13);Person s3= new Person("zhangsan",12);hs.add(s1);hs.add(s2);Iterator it = hs.iterator();while(it.hasNext()){Person p=(Person) it.next();System.out.println(p.name+"***"+p.age);}}}

原理:hashTable在比较时先比较哈希码,如果哈希码相同就在调用equals方法,如果不相同就不会调用equals方法

 

hashCode()中返回的hash值:

name.hashCode()+age

易出现两值不相同,但和相同的情况

为了避免这种情况,通常age*39【乘的数任意】来保证哈希值的唯一性;

转载于:https://www.cnblogs.com/excellencesy/p/8511154.html

更多相关:

  • 不透明指针(opaque pointer)可以用来在C中实现封装。 什么是不透明指针(opaque pointer) 从字面意思来看,“不透明”意味着看不到内部,因此“不透明指针”即看不到内部定义的指针。这样说有些抽象,我们来看个例子: #include typedef void *opque_data;...

  • 文章目录前言封装C++实现C 实现继承C++ 实现C实现 前言 为了保证代码的可复用性、可扩展性、可维护性,我们提出了面向对象的思想。 面向对象的核心特性有以下几个 封装特性 信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。 封装用来提升代码的可扩展性、可维护性继承特...

  • 创建新对象有两种不同的方法: 定义并创建对象的实例使用函数来定义对象,然后创建新的对象实例1.定义并创建对象的实例 var person=new Object(); person.firstname="John"; person.lastname="Doe"; person.age=50; person.eyecolor="blue...

  • 1、引用命名空间: using System.Runtime.Serialization; 2、json的序列化和反序列化的方法: publicclass JsonHelper {///

    /// 序列化/////////
  • 栈stack:stack 后入先出(LIFO) q.top()获取栈顶元素(并不删除)q.pop()删除栈顶元素q.push(x)向栈中加入元素q.empty()判断栈是否为空 队列queue:先入先出(FIFO)   q.front()获取队首元素(并不删除)q.pop()删除队首元素q.push(x)向队列中加入元素q....

  • resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:正在建造的一辆公交车,车里面可以设置40个座椅(reserve(40);),这是它的容量,但并不是说它里面就有了40个座椅,只能说...

  • v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)%rowItemCount)}px`,top:`${itemHeight*(Math.ceil(index/rowItemCount)-1)}px`}" //total是显示总数量 //l...

  •   技巧一(推荐指数★★★★★) 采用top、right、bottom、left,可以不在乎父元素的宽度和高度,对GPU损耗低于技巧三,但是对浏览器内存的消耗高于技巧三 .子元素 {/*父元素需要position: relative|absolute;*/position: absolute;margin: auto;to...

  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack...