Javase基础学习笔记之集合(3)

----------------------     Set                   ---------------------
Set集合:不允许重复元素,娶出方法只有一个迭代器。
----------------------     HashSet
哈希表原理:根据自己的元素自已创造一种能够具有索引顺序的方法来定位
保证唯一性,元素必须覆盖hashCode()和equals
覆盖hashCode()是根据自己全部属性确定特点
覆盖equals是为解决hashcollision


比如先存ab,再存cd,再存de,
根据如图所示方法,ab的asic值195%10得到5,放到5角标
cd,de同理
所以查找ab,直接根据方法得到5值到5角标来查找,不需要挨个位置判断

元素唯一:不允许存储重复元素,因为会发生查找的不确定性
但假如放ba,会发生哈希望表冲突(哈希望算法算出元素索引位置一样),然后通过equals判断内容

 
不保证存入和取出顺序一致:比如de得到角标1,明显顺序不一致了
自定义存储对象
HashSet.java
package cn.itcast.Set; 

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/* 
 * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 
 */ 
public class HashSetTest  { 
 
  public static void main(String[] args) { 
 
    Set hs = new HashSet(); 
    /* 
     * HashSet集合数据结构是哈希表,所以存储元素的时候, 
     * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。  
     *  
     */ 
    hs.add(new Person("lisi4",24)); 
    hs.add(new Person("lisi7",27)); 
    hs.add(new Person("lisi1",21)); 
    hs.add(new Person("lisi9",29)); 
    hs.add(new Person("lisi7",23)); 
    hs.add(new Person("lisi3",27)); 
    Iterator it = hs.iterator(); 
    
    while(it.hasNext()){ 
      Person p = (Person)it.next(); 
      System.out.println(p); 

    } 
  } 
 
} 

Person.java
package cn.itcast.Set;

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;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public boolean equals(Object obj){
		if(this==obj){
			return true;	
			
		}
		if(!(obj instanceof Person)){
			throw new ClassCastException("ooo");
		}
		Person p =(Person)obj;
		return this.name.equals(p.name)&&this.age==p.age;
	}
	public int hashCode(){
		final int NUMBER =37;
		return this.name.hashCode()+this.age*NUMBER;
	}
}
----------------------     TreeSet
dfsdfsfd
TreeSet:二叉树数据结构。可以对元素进行排序。不同步
保证元素唯一性:参考的就是比较方法的返回值是否是0,是0就是重复元素不存
排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口,覆盖CompareTo方法

 
TreeSetDemo.java
package cn.itcast.Set;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {
	/*
	 * 多个字符串分为重复和不可重复,按照长度排序
	 */
	public static void main(String[] args) {
		//sortString();
		sortArray();
	}
	
	public static void sortString(){
		Set set =new TreeSet(new ComparatorByLength());
		set.add("haha");
		set.add("abc");
		set.add("zz");
		set.add("nba");
		
		for(Object obj:set){
			System.out.println(obj);
		}
	}
	public static void sortArray(){
		String[] strs ={"haha","abdddfs","xixi","nba","cctv","nba","xixi"};
		Comparator comp =new ComparatorByLength();
		for(int x=0;x<strs.length-1;x++){
			for(int y=x+1;y<strs.length;y++){
			//	if((strs[x].compareTo(strs[y]))>0){按照字典顺序。
				//按照长度顺序
				if(comp.compare(strs[x], strs[y])>0){
					swap(strs,x,y);
				}
			}
		}
		
		for(String s:strs){
			System.out.println(s);
		}
	}

	public static void swap(String[] strs, int x, int y) {
		// TODO Auto-generated method stub
		String temp=strs[x];
		strs[x]=strs[y];
		strs[y]=temp;
	}
	
	
}
ComparatorByLength.java
package cn.itcast.Set;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		// TODO Auto-generated method stub
		String s1=(String)o1;
		String s2=(String)o2;
		int temp =s1.length()-s2.length();
		return temp==0?s1.compareTo(s2):temp;
		
	}

}



堆栈:后进先出
队列:先进先出
----------------------       增强for                   ---------------------

package cn.itcast.collection;

import java.util.ArrayList;
import java.util.Collection;

public class ForDemo {
	public static void main(String[] args) {
		/*
		 * 增强 for循环:遍历Collection集合或者数组
		 * for(元素类型    变量:Collection容器或者数组){
		 * }
		 */
		Collection coll =new ArrayList();
		coll.add("abc");
		coll.add("ab");
		coll.add("abe");
		for(Object obj:coll){
			System.out.println(obj);
		}
	}
}
<pre style="background-color: rgb(255, 255, 255); color: rgb(51, 51, 51); line-height: 26px; white-space: pre-wrap; word-wrap: break-word; font-size: 14px;"><span style="background-color: rgb(255, 204, 204);"><span style="font-size: 18px;">----------------------       Enumeration</span><span style="font-family: Arial, Helvetica, sans-serif;">                 ---------------------</span></span>

package cn.itcast.collection;

import java.util.Enumeration;
import java.util.Vector;

public class Enume {
	public static void main(String[] args) {
		/*
		 * Enumeration枚举
		 * 只有Vector
		 */
		Vector v =new Vector();
		v.add("abc1");
		v.add("abc2");
		v.add("abc3");
		v.add("abc4");
		Enumeration en =v.elements();
		while(en.hasMoreElements()){
			System.out.println("enu:"+en.nextElement());
		}
	}
}



 


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值