JAVA进阶版:集合篇(Collection、Map)

集合泛型

1. Collection集合

Java集合类分为Collection和Map(键值对)两大类。

Collection接口:
在这里插入图片描述


1.1 Collection集合的通用方法

(1)几种常用方法

package javase.jingjie.Collection;
/**
 * boolean add(Object elements); 向集合中添加元素
 * int size();  获取集合中元素的个数
 * void clear();  清空集合
 * boolean isEmpty();  判断集合中是否有元素
 * Object[] toArray();  将集合转换成数组
 * 
 **上面的几个调用结果:4
false
1
100
java.lang.Object@8efb846
Customer [name=jack,age=20]
0
true
 * 
 * Iterator iterator();  获取集合所依赖的迭代器对象
 * 
 * boolean contains (Object o);  判断集合中是否包含某个元素
 * boolean remove (Object o);    删除集合中某个元素 
 * */
import java.util.*;
public class CollectionTest01 {

	public static void main(String[] args) {
		//1. 创建集合
		Collection c=new ArrayList();//多态,父类创建子类对象
		
		//2.添加元素
		c.add(1);//自动装箱,1变成Integer引用类型
		c.add(new Integer(100));//Integer是引用数据类型
		
		Object o=new Object();
		c.add(o);//Collection集合只能单个存储元素,且只能存储引用数据类型
		Customer cus=new Customer("jack",20);
		c.add(cus);
		
		//3.获取元素个数
		System.out.println(c.size());//4
		System.out.println(c.isEmpty());//false
		
		//4.将集合转换成Object类型的数组
		Object[] objs=c.toArray();
		for(int i=0;i<objs.length;i++) {
			System.out.println(objs[i]);//1,100,java.lang.Object@8efb846,Customer [name=jack,age=20]
		}
		
		//5.清空
		c.clear();
		System.out.println(c.size());//0           清零元素为0
		System.out.println(c.isEmpty());//true, 上面清零,所以为空,正确
	}

}
class Customer{
	String name;
	int age;
	Customer(){}
	Customer(String name, int age){
		this.name=name;
		this.age=age;
	}
	//重写Object中的toString方法
	public String toString(){
		return "Customer [name="+name+",age="+age+"]";
	}
}

(2) 迭代器Iterator it =c.iterator() 遍历

package javase.jingjie.Collection;

import java.util.*;

/**
 * Iterator iterator();  获取集合所依赖的迭代器对象
 * 通过迭代器中的方法完成集合的迭代(遍历)
 * */
public class CollectionTest02 {

	public static void main(String[] args) {
		// 创建集合对象
		Collection c=new LinkedList();
		Collection t=new ArrayList();
		
		//添加元素
		c.add(100);//自动装箱
		c.add(3.14);//自动装箱
		c.add(false);//自动装箱
		
		//迭代,遍历
		//1.获取迭代器对象,所有集合依赖的迭代器都实现了java.util.Iterator接口
		//多态,父类型Iterator指向子类型对象iterator
		Iterator it =c.iterator();//获取迭代器,迭代器是面向接口编程,it是引用,保存了内存地址,指向堆中的“迭代器对象”.
		Iterator is=t.iterator();
		
		//java.util.LinkedList$ListItr 类是LinkeList集合所依赖的迭代器
		//java.util.AbstractList$Itr  类是ArrayList集合所依赖的迭代器。
		System.out.println(it);  //java.util.LinkedList$ListItr@de6ced
		System.out.println(is);  //java.util.ArrayList$Itr@2a84aee7

		//2.开始调用方法,完成遍历,迭代,while循环
		//it是Iterator接口的一个引用,Iterator中有hasNext()和next()方法,去调用它遍历
		/*
		while(it.hasNext()) {
			Object element=it.next();
			System.out.println(element);//100 3.14 false
			
			原则:调用it.next()方法之前必须要调用it.hasNext()方法;
			
			boolean b=it.hasNext();//判断是否有更多的元素,如果有返回true
			Object o=it.next();//将迭代器向下移动一位,并且取出指向的元素
		}
		*/
		
		//for循环
		for(Iterator ia=c.iterator();ia.hasNext();) {//Iterator ia=c.iterator();获取迭代器
			Object o=ia.next();
			System.out.println(o);//100 3.14 false
		}
	}

}

(3) contains、remove方法

package javase.jingjie.Collection;
/**
 * boolean contains (Object o);  判断集合中是否包含某个元素
 * boolean remove (Object o);    删除集合中某个元素 
 * 
 * 存储在集合中的元素应该去重写equals方法
 * */
import java.util.*;

public class CollectionTest03 {
	
	public static void main(String[] args) {
		//创建集合
		Collection c=new ArrayList();
		
		//创建Integer类型的对象
		Integer i1=new Integer(10);
		//添加元素
		c.add(i1);
		
		//判断集合中是否包含i1
		System.out.println(c.contains(i1));//true, 因为Collection集合中c.add(i1);添加了i1,所以包含
		
		//创建Integer类型的对象
		Integer i2=new Integer(10);	
		
		//判断集合中是否包含i2,contains方法底层调用的是equals方法,如果equals 返回 true,就是包含
		System.out.println(c.contains(i2));//true,因为常量池的内存地址一样,所以底层自动重写equals方法,i1=i2;
		
		Manager m1=new Manager(100,"Jack");
		c.add(m1);
		System.out.println(c.contains(m1));//true, 因为添加了m1,所以集合中包含m1;
		
		Manager m2=new Manager(100,"Jack");
		
		//重写equals方法之前,
		//因为m1与m2都重新创建对象,内存地址不一样,所以底层equals方法不会自动重写,只能调用Object中的equals方法,所以不相等就不包含
		//System.out.println(c.contains(m2)); false
		
		System.out.println(c.contains(m2));//true
	}
}

class Manager{
	int no;
	String name;
	
	public Manager(int no,String name) {
		this.name=name;
		this.no=no;
	}
	
	//因为m1与m2内存地址不一样,所以必须手动重写equals方法,保证m1与m2的内容相等,否则会调用Object中的equals方法,出现false
	//需求规定:如果编号和姓名都是相同,则表示同一个Manager
	public boolean equals(Object o) {
		if(this==o) return true;
		//o为一个对象,instanceof表示一个类或者一个接口,当o为instanceof的对象,或者是其直接或者间接子类,或者是接口的实现类,结果result 都返回true,否则返回false。
		if(o instanceof Manager) {//instanceof 左边对象是否为instanceof 右边类的实例,返回一个boolean类型值
			Manager m=(Manager)o;//强制类型转换
			if(m.no==this.no && m.name.equals(this.name)) {
				return true;
			}
		}
		return false;
	}
}

remove方法和contains方法都需要集合的元素重写equals方法:

package javase.jingjie.Collection;

import java.util.ArrayList;

/**
 * boolean remove(Object o)
 * remove方法和contains方法都需要集合的元素重写equals方法,因为Object中的equals方法比较内存地址,在现实的业务逻辑中不能比较内存地址,该比较内容
 * */
import java.util.*;
public class CollectionTest04 {

	public static void main(String[] args) {
		//创建集合对象
		Collection c= new ArrayList();
		Integer i1=new Integer(10);
		//添加元素
		c.add(i1);
		//删除
		Integer i2 =new Integer(10);
		c.remove(i2);
		System.out.println(c.size());//0
		
		//Manager类已经在CollectionTest03中写过了,所以equals方法已经重写过了,这时m1与m2内容相同
		Manager m1=new Manager(100, "jh");
		c.add(m1);
		Manager m2=new Manager(100, "jh");
		c.remove(m2);
		System.out.println(c.size());//0
		 
	}

}

迭代器的remove方法,集合自身带的remove方法

package javase.jingjie.Collection;

import java.util.*;



/**
 * 深入remove方法:
 * 1.迭代器的remove方法
 * 2.集合自身带的remove方法
 * */
public class CollectionTest05 {

	public static void main(String[] args) {
		
		Collection c= new ArrayList();
		c.add(1);
		c.add(10);
		c.add(100);
	
		//遍历,创建迭代器
		Iterator it =c.iterator();
		
		//循环while 
		while(it.hasNext()) {
			it.next();
			//删除
			it.remove();//通过迭代器删除
			
		}
		System.out.println(c.size());//0
		
		/*集合自身带的方法第二次删除元素时会报错
		//使用集合自身所带的remove方法
		Object element= it.next();
		
		//删除
		c.remove(element);
		System.out.println(c.size());
		*/
	}

}

1.2 Collection–>List集合(ArrayList、Vector、LinkedList)

(1)有序可重复:存进去什么顺序,取出来还是什么顺序

package javase.jingjie.List;
/**
 * List集合存储元素特点:
 *  1.有序(List集合中存储有下标):存进去是这样的顺序,取出来还是按照这个顺序取出
 *  2.可重复
 *  
 *  结果:	100
			45
			56
			78
			100

 * */
import java.util.*;

public class ListTest01 {

	public static void main(String[] args) {
		//创建一个List集合
		List l= new ArrayList();
		
		//添加元素
		l.add(100);
		l.add(45);
		l.add(56);
		l.add(78);
		l.add(100);
		
		//迭代器遍历
		Iterator it= l.iterator();
		while(it.hasNext()) {
			/*
			Object o=it.next();
			System.out.println(o);
			*/
			//可省略Object o=it.next();它自动输出Object类型
			System.out.println(it.next());
		}
	}

}

(2)第二种遍历方式(list集合特有的遍历方式:for循环)

package javase.jingjie.List;
/***
 * 深入List集合:
 * 1.ArrayList集合底层是数组、数组是有下标的,所以ArrayList集合有很多自己的特性
 * 2.ArrayList集合底层默认初始化容量是10,扩大后容量是原容量的1.5倍
 * 3.Vector集合底层默认初始化容量也是10,扩大后的容量是原容量的2倍
 * 
 * 如何优化ArrayList和Vector?
 * 尽量减少扩容操作,因为扩容需要数组拷贝,数组拷贝很耗内存,
 * 一般推荐在创建集合的时候指定初始化容量
 * */
import java.util.*;
public class ListTest02 {

	public static void main(String[] args) {
		// 创建List集合,多态
		List l=new ArrayList();//默认容量10
		//也可以指定容量为50
		//List l=new ArrayList(50);或者链表形式List l=new LinkedList(50);
		
		//添加元素
		l.add(10);
		l.add(120);
		l.add(101);
		l.add(10);
		
		//在下标为1的位置上添加234
		l.add(1,234);
		//在下标为3的位置上添加24
		l.add(3,24);
		
		//取得第一个元素
		System.out.println(l.get(0));
		System.out.println("================");
		
		//遍历(list集合特有的遍历方式)
		for(int i=0;i<l.size();i++) {
			Object element=l.get(i);
			System.out.println(element);
		}
		System.out.println("-------------------");
		
		//通过迭代器的遍历方式
		Iterator it= l.iterator();
		while(it.hasNext()) {
			Object o=it.next();
			System.out.println(o);
		}
	}

}
/*
 * 结果:10
================
10
234
120
24
101
10
-------------------
10
234
120
24
101
10

 * */

1.3 Collection–>Set集合(HashSet、SortedSet、TreeSet)

(1)HashSet(无序不可重复)

package javase.jingjie.Set;
/**
 * Set集合:HashSet(无序不可重复)
 * 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构;
 * 2.哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个
 * 单项链表,每一个单向链表都有一个独一无二的hash值,代表数组的下标。
 * 在某一个单向链表中的每一个节点上的hash值是相等的。hash值实际上是key调用hashCode方法,
 * 在通过“hash function”转换成的值。
 * 
 * 3.如何向哈希表中添加元素:
 * 先调用被存储的key的hashCode方法,经过某一个算法得出hash值,如果在这个哈希表中不存在这个hash值,
 * 则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果
 *equals方法返回false,则将该元素添加,如果equals方法返回true,则放弃添加该元素。
 *
 * 4.HashSet其实就是HashMap中的key部分,HashSet有什么特点,HashMap中的key应该具有相同的特点。
 * */
import java.util.*;
public class SetTest01 {

	public static void main(String[] args) {
		//创建Set集合 
		Set s=new HashSet();
		//无序不可重复
		s.add(1);
		s.add(1);
		s.add(12);
		s.add(121);
		s.add(14);
		//遍历
		Iterator it=s.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
	/*结果:无序不可重复
	 * 1
	121
	12
	14

	 * */

}

存储在HashSet集合和HashMap集合key部分的元素,需要同时重写hashCode和equals方法

package javase.jingjie.Set;
/**
 * 关于往Set集合中存储的元素,该元素的hashCode和equals方法
 * HashMap中有一个put方法,put(key,value) key是无序不可重复的
 * 结论:
 * 1.存储在HashSet集合和HashMap集合key部分的元素,需要同时重写hashCode和equals方法
 * 2.HashSet是HashMap的key部分,HashMap是HashSet的底层
 * */
import java.util.*;

public class setTest02 {
	public static void main(String[] args) {
		//创建集合
		Set es= new HashSet();
		
		Employee e1=new Employee("1000","JACK");
		Employee e2=new Employee("1000","JACK");
		Employee e3=new Employee("2000","SOCTT");
		Employee e4=new Employee("2300","SUN");
		Employee e5=new Employee("1239","JIM");
		Employee e6=new Employee("2345","COOK");
		
		System.out.println(e1.hashCode());//1507423
		System.out.println(e2.hashCode());//1507423
		
		//添加元素
		es.add(e1);
		es.add(e2);
		es.add(e3);
		es.add(e4);
		es.add(e5);
		es.add(e6);
		
		//查看集合中的元素
		System.out.println(es.size());//5,说明调用hashCode和equals方法后,e1与e2相同,不满足Set集合(无序不可重复)
	}
}
//根据现实业务逻辑得知:该公司员工编号是:1000~9999
class Employee{
	//编号
	String no;
	//姓名
	String name;
	//构造器
	public Employee(String no,String name) {
		this.no=no;
		this.name=name;
	}
	//重写equals方法,false添加,否则不加
	//如果员工编号相同,名字相同,则是同一个对象
	public boolean equals(Object o) {
		if(this==o) {return true;
		}
		if(o instanceof Employee) {
			Employee e=(Employee)o;//Object是所有类的父类,o也是父类型引用,所以强制类型赋值给子类型
			if(e.no.equals(this.no)&&e.name.equals(this.name)) {
				return true;
			}
		}
		return false;
	}
	
	//重写HashCode方法,调用后不相同,则直接添加;相同再继续调用equals方法
	public int hashCode() {
		//以员工编号分组
		return no.hashCode();
	}
}

(2) SortedSet 无序不可重复,但是存进去的元素可以按照元素大小、先后顺序自动排列

package javase.jingjie.SortedSet;
/**
 * java.util.Set;(父)
 * --java.util.SortedSet;无序不可重复,但是存进去的元素可以按照元素大小、先后顺序自动排列
 * ----java.util.TreeSet;
 * */
import java.util.*;
import java.text.*;
public class Test01 {

	public static void main(String[] args) throws Exception {
		//创建集合
		SortedSet ss= new TreeSet();
		//添加元素,集合里只能放引用类型
		ss.add(10);//10其实Integer引用类型,自动装箱
		ss.add(12);
		ss.add(3);
		ss.add(120);
		ss.add(15);
		ss.add(5);
		
		//迭代器遍历
		Iterator it= ss.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());//按大小顺序排列
		}
		
		//String类型
		SortedSet strs=new TreeSet();
		
		strs.add("JACK");
		strs.add("SUN");
		strs.add("COOK");
		strs.add("KING");
		
		//遍历
		 it=strs.iterator();
		 while(it.hasNext()) {
			 Object element=it.next();
			 System.out.println(element);//按字母对应位顺序大小排列
		 }
		 
		 //日期类型
		 String t1="2008-08-08";
		 String t2="2012-08-08";
		 String t3="2010-09-08";
		 String t4="2008-08-09";
		 String t5="2009-08-08";
		 
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		
		Date st1=sdf.parse(t1);
		Date st2=sdf.parse(t2);
		Date st3=sdf.parse(t3);
		Date st4=sdf.parse(t4);
		Date st5=sdf.parse(t5);
		
		//添加
		SortedSet times=new TreeSet();
		times.add(st1);
		times.add(st2);
		times.add(st3);
		times.add(st4);
		times.add(st5);
		
		//遍历
		it=times.iterator();
		while(it.hasNext()) {
			Object element=it.next();
			if(element instanceof Date) {//判断element是否是Date类
				Date d=(Date)element;
				//format方法是 日期-->字符串
				System.out.println(sdf.format(d));//按时间对应位大小先后顺序排列
			}
		}
	}

}
/**
 *结果:
3
5
10
12
15
120
COOK
JACK
KING
SUN
2008-08-08
2008-08-09
2009-08-08
2010-09-08
2012-08-08

 * **/

SortedSet集合中的元素是自己写的,需重写Comparable–compareTo、Comparator–compare方法

package javase.jingjie.SortedSet;

import java.util.*;

/**
 * 当SortedSet集合中的元素是自己写的,不是SUN公司写的,还能自动排序吗
 * --不能自动调用Comparable--compareTo、Comparator--compare方法,需要
 * 自己手动重写,保证SortedSet(无序不可重复)集合中的元素是按照从小到大的顺序排列
  **/
public class Test02 {
	public static void main(String[] args) {
		SortedSet users=new TreeSet();
		
		User u1=new User(15);
		User u2=new User(16);
		User u3=new User(12);
		User u4=new User(23);
		User u5=new User(4);
		
		//添加元素
		users.add(u1);
		users.add(u2);
		users.add(u3);
		users.add(u4);
		users.add(u5);
		
		//遍历
		Iterator it= users.iterator();
		while(it.hasNext()) {
			Object elements=it.next();
			System.out.println(elements);
		}
	}
}
//第一种方法Comparable--compareTo
class User implements Comparable{
	//String name;
	int age;
	User(int age){
		this.age=age;
	}
	public String toString() {
		return "User[age="+age+"]";
	}
	
	//实现java.lang.Comparable;接口中的compareTo方法
	//该方法程序员负责实现,SUN提供的程序已经调用了该方法
	
	public int compareTo(Object o) {
		int age1=this.age;
		int age2=((User)o).age;
		return age2-age1;
	}
}
/**
 * 结果:User[age=23]
User[age=16]
User[age=15]
User[age=12]
User[age=4]

 * */

第二种Comparator–compare

package javase.jingjie.SortedSet;
/**
* 单独编写一个比较器Comparator ,排序
* 第二种Comparator--compare
* 
* 第一种方法Comparable--compareTo
* */
import java.util.*;
public class Test03 {

   public static void main(String[] args) {
   	//创建TreeSet集合的时候提供一个比较器
   	SortedSet products= new TreeSet(new ProductComparator());
   	
   	Product p1= new Product(3.4);
   	Product p2= new Product(4.0);
   	Product p3= new Product(3.0);
   	Product p4= new Product(2.4);
   	Product p5= new Product(5.4);
   	
   	//添加元素
   	products.add(p1);
   	products.add(p2);
   	products.add(p3);
   	products.add(p4);
   	products.add(p5);
   	
   	//遍历
   	Iterator it=products.iterator();
   	while(it.hasNext()) {
   		System.out.println(it.next());
   	}
   }
}
//第二种方法
class Product{
   double price;
   Product(double price){
   	this.price=price;
   }
   public String toString() {
   	return price+"";
   }
}
//单独编写一个比较器
class ProductComparator implements Comparator{
   
   public int compare(Object o1,Object o2) {
   	double price1=((Product)o1).price;
   	double price2=((Product)o2).price;
   	
   	if(price1==price2) {
   		return 0;
   	}else if(price1>price2) {
   		return 1;
   	}else {
   		return -2;
   	}
   }
}
/**
* 
* 结果:2.4
3.0
3.4
4.0
5.4
*/


2. Map集合

Map接口:
在这里插入图片描述


2.1 Map集合---->HashMap

(1) Map集合中常用的方法

package javase.jingjie.Map;
/**
* 关于Map集合中常用的方法:
* void clear();  清空Map
* boolean isEmpty(); 判断该集合是否为空
* int size();获取Map集合中键值对的个数
* 
* Object put(Object key,Object value);向集合中添加键值对,与Set集合add添加元素方式不一样
* Object get(Object key);通过key获取value
* 
* boolean containsKey(Object key);判断Map集合中是否包含这样的key
* boolean containsValue(Object value);判断Map集合中是否包含这样的value
*
*Object remove(Object key);通过key删除键值对
*
*Colection values();获取Map集合中所有的value
*
*Set keySet();获取Map中所有的key
*
*Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的Set视图。
*
*注意:存储在Map集合key部分的 元素需要同时重写hashCode+equals方法。
*
* */
import java.util.*;
public class MapTest01 {

   public static void main(String[] args) {
   	// 1.创建Map集合
   	Map person =new HashMap();//HashMap的默认容量值16,加载因子0.75
   	
   	//2.存储键值对(key,value)
   	
   	person.put("10000","JACK");
   	person.put("10005","JACK");
   	person.put("10001","SUN");
   	person.put("10003","COOK");
   	person.put("10002","TOM");
   	person.put("10000","LUCY");
   	
   	//3.判断键值对的个数,Map中的Key是无序不可重复的,和HashSet相同
   	System.out.println(person.size());//5
   	
   	//4.判断集合中是否包含这样的key
   	System.out.println(person.containsKey("10000"));//true
   	
   	//5.判断集合中是否包含这样的value
   	//注意:Map中如果key重复了,value采用的是覆盖,后面的key=10000覆盖前面的key=10000
   	System.out.println(person.containsValue("LUCY"));//true
   	
   	//6.通过key获取value
   	String k="10002";
   	Object v=person.get(k);
   	System.out.println(v);//TOM
   	
   	//7.通过key删除键值对
   	person.remove("10002");
   	System.out.println(person.size());//4
   	
   	//8.获取所有的value,按照 key的大小顺序排列,key重复,后面的覆盖前面key 
   	Collection values=person.values();
   	Iterator it=values.iterator();
   	while(it.hasNext()) {
   		System.out.println(it.next());//LUCY SUN COOK JACK
   	}
   	
   	//9.获取所有的key,以下程序演示如何遍历Map集合
   	Set keys=person.keySet();
   	Iterator it2=keys.iterator();
   	while(it2.hasNext()) {
   		Object id=it2.next();
   		Object name=person.get(id);
   		System.out.println(id+"-->"+name);//10000-->LUCY  10001-->SUN  10003-->COOK 10005-->JACK
   	}
   	
   	//10.Set entrySet(); 返回此映射中包含的映射关系的Set视图。
   	//将Map转换成Set集合
   	Set en=person.entrySet();
   	Iterator it3=en.iterator();
   	while(it3.hasNext()) {
   		Object o=it3.next();
   		System.out.println(o);//10000=LUCY 10001=SUN 10003=COOK 10005=JACK
   	} 
   	
   }

}

2.2 Map集合—>Hashtable底层Properties

package javase.jingjie.Map;
/**
 * Hashtable默认初始化容量11,加载因子0.75
 * Hashtable底层Properties
 * 
 * java.util.Properties;也是由key和value组成,但是key和value都是字符串类型
 * 结果:I'm a teacher
周杰伦
唐嫣
邓超

 * **/
import java.util.*;
public class MapTest02 {

	public static void main(String[] args) {
		// 1.创建属性对象
		Properties p=new Properties();

		//2.存
		p.setProperty("drive", "I'm a teacher");
		p.setProperty("username", "胡歌");
		//注意key不能重复,否则后面的value覆盖
		p.setProperty("username", "周杰伦");
		p.setProperty("Customer", "唐嫣");
		p.setProperty("star", "邓超");
		
		//3.取,通过key获取value
		String v1=p.getProperty("drive");
		String v2=p.getProperty("username");
		String v3=p.getProperty("Customer");
		String v4=p.getProperty("star");
		
		System.out.println(v1);//I'm a teacher
		System.out.println(v2);//周杰伦
		System.out.println(v3);//唐嫣
		System.out.println(v4);//邓超
		
	}

}

2.3 Map集合—>SortedMap、TreeMap

无序不可重复,但是存进去的元素可以按照大小顺序排列;
(非SUN公司)key部分元素需要手动重写,1.实现Comparable接口;2.单独写一个比较器

package javase.jingjie.Map;
/**
 * SortedMap中的key特点(与SortedSet一样):无序不可重复,但是存进去的元素可以按照大小顺序排列
 * 如果想自动排序(非SUN公司的):key部分的元素需要手动重写,1.实现Comparable接口;2.单独写一个比较器
 * SortedMap底层是TreeMap
 * 结果:Product[name=苹果,price=5.0]-->5.0kg
Product[name=香蕉,price=3.0]-->3.0kg
Product[name=火龙果,price=2.0]-->2.0kg
Product[name=西瓜,price=1.0]-->8.0kg

 **/
import java.util.*;
public class MapTest03 {
	public static void main(String[] args) {
		// Map,key存储Product,value存储重量
		SortedMap products=new TreeMap();//多态,SortedMap底层是TreeMap
		
		//准备对象
		Product p1= new Product("西瓜",1.0);
		Product p2= new Product("香蕉",3.0);
		Product p3= new Product("苹果",5.0);
		Product p4= new Product("火龙果",2.0);
		
		//添加
		products.put(p1,8.0);//自动装箱
		products.put(p2,3.0);
		products.put(p3,5.0);
		products.put(p4,2.0);
		
		//遍历
		Set keys=products.keySet();
		Iterator it=keys.iterator();
		while(it.hasNext()) {
			Object k=it.next();
			Object v=products.get(k);
			System.out.println(k+"-->"+v+"kg");
		}
	}
}
//第一种方法:实现Comparable接口
class Product implements Comparable{
	String name;
	double price;
	
	public Product(String name,double price) {
		this.name=name;
		this.price=price;
	}
	public String toString() {
		return "Product[name="+name+",price="+price+"]";
	}
	
	//实现compareTo方法,按照商品价格排序
	public int compareTo(Object o) {
		double price1=this.price;
		double price2=((Product)o).price;
		
		if(price1>price2){
			return -1;
		}else if(price1<price2) {
			return 1;
		}else {
			return 0;
		}
	}
}


3. Collections集合工具类

与不同 java.util.Collection;集合接口

package javase.jingjie.Collections;
/**
 * 关于集合工具类 java.util.Collections;类
 * 与不同 java.util.Collection;集合接口 
 * */
import java.util.*;
public class CollectionsTest01 {

	public static void main(String[] args) {
		// 使用Collections集合工具类完成排序
		List l= new ArrayList();
		
		//添加元素
		l.add(10);//Integer引用类型,自动装箱 Integer implement Comparable
		l.add(5);
		l.add(9);
		l.add(14);
		l.add(2);
		
		//遍历
		/*
		//1.
		for(int i=0;i<l.size();i++) {
			System.out.println(l.get(i));//get方法获得元素
		}
		//2.
		for(Iterator it=l.iterator();it.hasNext();) {
			System.out.println(it.next());
		}
		*/
		
		//3.
		Iterator it1=l.iterator();
		while(it1.hasNext()) {
			System.out.println(it1.next());
		}
		System.out.println("----------------");
		
		//排序,Collections集合类中的方法,按大小排列
		//sort方法只适合List集合接口
		Collections.sort(l);
		it1=l.iterator();//重新多态了一下
		while(it1.hasNext()) {
			System.out.println(it1.next());
		}
		
		//给定Set集合
		Set s= new HashSet();
		s.add(12);
		s.add(10);
		s.add(23);
		s.add(6);
		s.add(8);
		
		//对Set集合排序,会报错,因为s是Set集合,而sort只适用List集合
		//Collections.sort(s);
		//将Set集合转换成List集合,s是Set集合
		List lists=new ArrayList(s);
		Collections.sort(lists);
		Iterator it2=lists.iterator();
		System.out.println("==============");
		while(it2.hasNext()) {
			System.out.println(it2.next());
		}
		
		//创建List集合,List集合中存储Person类型,是否可以排序?
		//Collections工具类可以对List集合中元素排序,但是集合中的元素必须是“可比较的”,实现Comparable接口
		List ps= new ArrayList();
		
		ps.add(new Person(12));
		ps.add(new Person(7));
		ps.add(new Person(10));
		ps.add(new Person(8));
		
		Collections.sort(ps);
		
		System.out.println("++++++++++++++++");
		for(int i=0;i<ps.size();i++) {
			System.out.println(ps.get(i));//get方法获得元素
		}
		
		//将ArrayList集合转换成线程安全的
		List myList=new ArrayList();
		Collections.synchronizedList(myList);
	}
}
//自定义的类型,非SUN公司的(Integer,String,Date),需要重写Comparable接口
class Person implements Comparable{
	int shu;
	Person(int shu){
		this.shu=shu;
	}
	public String toString() {
		return shu+" ";
	}
	public int compareTo(Object o) {
		//引用.shu是传递的,
		int shu1=this.shu;
		int shu2=((Person)o).shu;
		return shu1-shu2;
	}
}
发布了42 篇原创文章 · 获赞 8 · 访问量 2450

猜你喜欢

转载自blog.csdn.net/JH39456194/article/details/102974426