集合框架set小结

*set:元素是无序的(存入和取出顺序不一定一致),不可以重复的。
|-HashSet:底层数据结构是哈希表。线程是非同步的。保证元素唯一性的原

理:判断元素的hashCode值是否相同。如果相同还会继续判断元素的equals方法,是

否为true
|-TreeSet:可以对Set集合中的元素排序。底层数据结构是二叉树。保证数据

唯一性的是compareTo方法return 0。
*Tree排序的第一种方式:让元素自身具备比较性。元素需要实现comparable接口,覆

盖compareTo方法。也称为元素的自然顺序,或者默认顺序。
*Tree集合的第二种排序方式:当元素自身不具备比较性时或者具备的比较性不是所需要

的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
Set集合的功能和Collection是一致的。
*HashSet如何保证元素的唯一性:通过元素的两个方法,hashCode和equals来完成。

如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode的

值不同,不会调用equals。 定义一个对象的时候一般要复写hashcode和equals。
package com.sets;

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts=new TreeSet();

ts.add(new Student("zhangsan",22));
ts.add(new Student("zhangsan20",20));
ts.add(new Student("zhangsan09",19));
ts.add(new Student("zhangsan01",40));
ts.add(new Student("zhangsan08",19));
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+" "+s.getAge());
}

}

}
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student)obj;
System.out.println(this.name+"....comparable...."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);
}

return -1;
}

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;
}

}

*****

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo1 {

/**
* 当元素自身不具备比较性,或者具备的比较性不是所需要的
* 这是需要让容器自身具备比较性
* 定义了比较器,将比较器对象作为参数传递给TreeSet集合的比较函数
* 当两种方式都存在时,以比较器为主。
* 定义一个类,实现Comparator接口,覆盖compare方法。
*/
public static void main(String[] args) {
TreeSet ts=new TreeSet(new MyCompare());
ts.add(new Student("zhangsan",22));
ts.add(new Student("zhangsan20",20));
ts.add(new Student("zhangsan09",19));
ts.add(new Student("zhangsan01",40));
ts.add(new Student("zhangsan08",19));
ts.add(new Student("zhangsan08",29));
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+" "+s.getAge());
}
}
}
class MyCompare implements Comparator{
public int compare(Object o1,Object o2){
Student s1=(Student)o1;
Student s2=(Student)o2;
int num=s1.getName().compareTo(s2.getName());
if(num==0)
{
/*if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;*/
return new Integer(s1.getAge()).compareTo(new

Integer(s2.getAge()));
}
return num;
}
}

class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student)obj;
System.out.println(this.name+"....comparable...."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);
}

return -1;
}

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;
}
}

*******

package com.sets;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest {

/**
* 按照字符串长度排序
* 字符串本身具备比较性,但是他的比较方式不是所需要的
* 这时候只能使用比较器
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts=new TreeSet(new StringLengthComparator());

ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aba");
ts.add("z");
ts.add("hahaha");

Iterator it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}

}
class StringLengthComparator implements Comparator
{

@Override
public int compare(Object o1, Object o2) {
String s1=(String)o1;
String s2=(String)o2;

int num=new Integer(s1.length()).compareTo(new Integer

(s2.length()));
if(num==0){
return s1.compareTo(s2);
}

return num;
}

}

时间: 2024-10-05 05:07:30

集合框架set小结的相关文章

[转载] Java集合框架之小结

转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): 2.ArrayList初始化时不可指定容量,如果以new ArrayList()方式创建时,初始容量为10个:如果以new ArrayList(Collection c)初始化时,容量为c.size()*1.1,即增加10%的容量:当向ArrayList中添加一个元素时,先进行容器的容量调整,如果容

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次

java集合框架小结(进阶版)之HashSet篇

建议先看下:java集合框架小结(进阶版)之HashMap篇 基本概念: hashSet: 根据java集合框架小结(初级版)图示,HashSet是AbstractSet的一个子类,是基于Hash算法的Set接口的实现,顾名思义.允许添加null. --------------------------------------↑ 以上都是扯淡 ↑,↓ HashSet完全是在挂羊头卖狗肉 ↓------------------------------------------- 何谓挂羊头卖狗肉?大家

java集合框架小结(初级版)

今天大概的整理了一下java集合框架,在这里做一个小结,方便以后查阅,本博文主要参考资料为<java编程思想第四版>第11章——持有对象以及JAVA 1.6 API文档.并没有研究更深入的第17章<容器深入研究>.大概介绍了集合框架中几个比较常用的集合类. 以下为正文. 首先来看一张图,不太会用visio,画的可能不太好看 图中将接口.抽象类.实现类.淘汰类(圆角矩形)进行标注.有直线连接的类(或接口)表示是子类关系或者实现关系 由图示可以看出,集合类主要有两个集合接口: 1.Co

集合框架小结--盛夏光年2017

一.集合框架 1.最大的接口:Collection.Map.Iterator.Enumeration 2.Collection:存放单值    |- List:允许有重复内容,有序        |- ArrayList:异步处理,新的操作类,非线程安全.        |- Vector:底层是数组数据结构.线程同步安全.因为效率低被ArrayList替代了.支持Enumeration输出    |- Set:不允许有重复内容,无序,靠hashCoke()和equals()进行重复的严重   

java 集合框架小结

一:集合框架  集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.  任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:即表示集合的抽象数据类型.Collection顶层接口.   实现:也就是集合框架中接口的具体实现.常用ArrayList.HashMap 算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找.排序等. 二:java集合框架包含的内容   主要常用的  接口                         

集合框架小结-Collection

1.集合框架作为处理对象的容器存在,基本接口是Collection,相对于数组而言的话,集合框架只能存储对象,但是长度是可变的.集合框架的关系图如下: 主要的内容是list.set.map, List集合存储的元素是有序的,元素是可以重复的,并且有索引 Set集合存储的元素是无序的,并且不可以重复. Map是在set的基础之上发展出存储映射关系的一类集合. 2.讲解一下Collection的方法,即集合框架共用的方法 boolean add(E element) 作用:向集合中添加元素对象 返回

JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的文章,大多都是以罗列记忆点的形式书写的,没有谈论实现细节和逻辑原理.作为个人笔记无可厚非,但是并不利于他人学习.希望能通过这种比较“费劲”的讲解,帮助我自己.也帮助读者们更好地学习Java.掌握Java. 无论你跟我一样需要应聘,还是说在校学生学习Java基础,都对入门和进一步启发学习有所帮助.(关

Java基础---泛型、集合框架工具类:collections和Arrays

第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据. 3.泛型是提供给javac编译器使用的可以限定集合中的输入类型说明的集合时,会去掉“类型”信息,使程序运行效率不受影响,对参数化的泛型类型,getClass()方法的返回值和原始类型完全一样. 4.由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就