现在的位置: 首页 > 综合 > 正文

黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set

2018年04月30日 ⁄ 综合 ⁄ 共 24602字 ⁄ 字号 评论关闭
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员 java 基础 毕向东 面向对象 集合框架


1:集合Collection概述  and 共性方法 and 迭代器引述


集合存储地址

package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;
/*
 * 1:
1:add方法的参数类型是Object(泛型)
以便于接收任意类型对象。
2:集合中存储的都是对象的引用 (地址)

什么是迭代器呢?
集合取出元素的方式

*/
public class CollectionDemo {

	public static void main(String[] args) {
		
//		methon_2();
		methon_get();
	}

	static void sop(Object o){
		System.out.println(o);
	}

	static void methon_get(){
		ArrayList a1=new ArrayList();
		a1.add("java1");
		a1.add("java1");
		a1.add("java2");
		a1.add("java3");
		a1.add("java4");
		/*------------------------------------*/
		Iterator it=a1.iterator();
		/*
		 * 获取迭代器,用于获取集合 的元素
		 * 
		 * */
		while (it.hasNext()) {
			sop(it.next());		
		}
		sop("=================");		

		/*------------------------------------*/
		for (Object object : a1) {
			sop(object);
		}
		/*------------------------------------*/

		sop("=================");	
		//相比于while  for循环在运行结束后  迭代器对象被释放
		for (Iterator iterator = a1.iterator(); iterator.hasNext();) {
			sop(iterator.next());
		}
		/*------------------------------------*/
	}
	static void methon_2(){

		ArrayList a1=new ArrayList();
		a1.add("java1");
		a1.add("java1");
		a1.add("java2");
		a1.add("java3");
		a1.add("java4");
		
		ArrayList a2=new ArrayList();
		a2.add("java1");
		a2.add("java2");
//		a2.add("java3");
		a2.add("java4");

//		sop("a1"+a1);
//		sop("a2"+a2);
//		sop(a1.retainAll(a2));//取交集,保留a2中存在的元素
//		sop("a1"+a1);
//		sop("a2"+a2);
/*-----------------------------------*/
//		sop("a1"+a1);
//		sop("a2"+a2);
//		sop(a1.removeAll(a2));//取交集,保留a2中存在的元素
//		sop("a1"+a1);
//		sop("a2"+a2);
		
		/*-----------------------------------*/
		sop("a1"+a1);
		sop("a2"+a2);
		sop(a1.addAll(a2));//取交集,保留a2中存在的元素
		sop("a1"+a1);
		sop("a2"+a2);
		
	}
	static void methon_base(){
		//创建一个集合容器,使用Collection接口子类ArrayList
				ArrayList arrayList1=new ArrayList();
				// 1 添加元素
				arrayList1.add("java1");
				arrayList1.add("java1");
				arrayList1.add("java2");
				arrayList1.add("java3");
				arrayList1.add("java4");
				arrayList1.add(1);
				//打印集合
				sop(arrayList1);
				//2获取个数,集合长度
				sop("arrayList1.size():"+arrayList1.size());
				//3 删除 元素
				arrayList1.remove("java1");
				sop("delete:"+arrayList1);

//				arrayList1.clear();
//				sop("clear:"+arrayList1);
				//4 判断元素
				sop("java1是否存在"+arrayList1.contains("java1"));
				sop(arrayList1);
				arrayList1.clear();
				sop("集合是否为空"+arrayList1.isEmpty());

				sop(arrayList1);
				
	}

}

2 Collection---->List 类 特点 和 增删查改方法  and 特有迭代器ListIterator

package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;


public class ListDemo {
/*
 * Collection
 * 		|--List:特点:元素是有序,同时元素可以重复。因为该集合体系有索引
 * 			|--ArrayList :底层的数据结构使用数组结构:特点在于查询速度快,增、删、插入麻烦 。线程不同步
 * 			|--LinkedList:底层使用链表数据结构:特点:增删快,查询慢
 * 			|--Vector    :底层是数组数据结构。Vector是同步的。被ArrayList 替代
 * 		|--Set 特点:元素是无序,同时元素不可以重复。因为该集合体系没有索引
 *List 特有方法:凡是可以操作角标的方法都是该体系特有方法
 *增 add(inde.element)
 *	add(index,Collection)
 *删 remove(index)
 *改set(index,element)
 *查get(index)
 *	subList(from,to)
 *	listIterator();
 *
 *list 集合特有的迭代器
 *ListIterator 是Iterator的子接口
 *在迭代时不可以通过集合 对象的方法操作集合中的元素
 *因为会发生集合并发修改异常
 *所以需要在迭代时只能用迭代器的方法操作元素
 *可以Iterator的操作方法有限,只能进行判断取出删除的操作
 *如果要添加,修改等操作,就应该使用其子接口ListIterator
 *该接口只能通过List结合的listIterator()获取
 *实现在遍历过程中修改等
 * */
	public static void main(String[] args) {
		//演示列表迭代器
		ArrayList a1=new ArrayList();
		a1.add("java22");
		a1.add("java23");
		a1.add("java24");
		a1.add("java25");
		//在迭代过程中,准备往列表中添加或者删除元素
//		Iterator it=a1.iterator();
		/*
		while (it.hasNext()) {
			Object object = (Object) it.next();
			if (object.equals("java22")) {
				a1.add("java08");
				// java.util.ConcurrentModificationException 并发修改异常
			}
		}
		*/
		sop(a1);
//		while (it.hasNext()) {
//			Object object = (Object) it.next();
//			if (object.equals("java22")) {
//				//将java22的引用从集合中删除了
//				it.remove();
//			}
//		}
//		sop(a1);
		
		ListIterator li=a1.listIterator();
		while (li.hasNext()) {
			Object object=li.next();
			if (object.equals("java22")) {
//				li.add("java009");
				li.set("java009");
			}
		}
		while (li.hasPrevious()) {
			Object object = (Object) li.previous();
			sop(object);
			
		}
		sop("hasNext:"+li.hasNext());
		sop("hasPrevious:"+li.hasPrevious());
		sop("hasNext:"+li.hasNext());
		sop(a1);
	}
	static void method(){
		ArrayList a1=new ArrayList();
		//添加元素
		a1.add("java11");
		a1.add("java12");
		a1.add("java13");
		sop("原来集合"+a1);
		//在指定位置添加元素
		a1.add(2,"java2");
		sop("添加后集合"+a1);
		//删除指定位置的元素
		a1.remove(1);
		sop("删除后集合"+a1);
		//修改元素
		a1.set(2, "java111");
		sop("修改后集合"+a1);
		
		//通过角标获取
		a1.get(1);
		sop(a1.get(1));
		
		//获取所有元素
		for (int i = 0; i < a1.size(); i++) {
			sop("a1.get(i):--》"+a1.get(i));
		}
		for (Iterator iterator = a1.iterator(); iterator.hasNext();) {
			sop(iterator.next());
		}
		//通过indexOf 获取对象位置
		sop("a1.indexOf(java11)"+a1.indexOf("java11"));
		//通过subList 获取子List
		List l2=a1.subList(0,2);
		sop("a1.subList(1,2)"+a1.subList(0,2));
	}
	static void sop(Object o){
		System.out.println(o);
	}

}

3 Vector 中枚举

package day14Collection;

import java.util.Enumeration;
import java.util.Vector;
/*
 * 枚举 就是Vector的特有取出方式
 * 迭代器
 * 枚举
 * get
 * 发现枚举和迭代器很像
 * 其实两者是一样的 
 * 
 * 因为枚举的名称和方法名过长
 * 所以被迭代器取代了
 * 枚举郁郁而终*/
public class VectorDemo {

	public static void main(String[] args) {
		Vector vector=new Vector();
		vector.add("java1");
		vector.add("java2");
		vector.add("java3");
		
		sop(vector);
		Enumeration e=vector.elements();
		while (e.hasMoreElements()) {
			Object object = (Object) e.nextElement();
			sop(object);
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}

4 Collection-->List -->LinkedList 介绍 

package day14Collection;

import java.util.Iterator;
import java.util.LinkedList;
/*
 * LinkedList 特有方法
 * addFrist();
 * addLaot();
 * 
 * getFirst();
 * getLast();
 * 		获取元素。但不删除元素
 * 
 * removeFirst();
 * removeLast();
 * 		获取元素,并删除元素
 * 		如果集合中没有元素,抛出NoSuchElementException
 *   在jdk 1.6 之后出现了替代
 *   pollFirst()
 *   
 *   peekFirst();
 *   offerFirst
 * */
public class LinkedListDemo {
	public static void main(String[] args) {
		LinkedList l=new LinkedList();
		l.add(1);
		l.add(2);
		l.add(3);
		l.add(4);
		l.addFirst("add Frist");
		sop(l);
		sop("l.getFirst():"+l.getFirst());
		sop("l.get(2):"+l.get(2));
		sop(l.removeFirst());
		sop(l.size());
//		while (!l.isEmpty()) {
//			sop("l.removeFirst()"+l.removeFirst());
//		}
		sop("------");
		for (Iterator iterator = l.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
			sop("object:"+object);
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}

5 LinkedList 练习

package day14Collection;

import java.util.LinkedList;

public class LinkedListTest {
/*
 * 使用LinkedList
 * 模拟堆栈或者队列数据结构
 * 
 * 堆栈:先进后出  如同杯子
 * 队列:先进先出 如同管道*/
	public static void main(String[] args) {
		Duilie duilie=new Duilie();
		duilie.addFirst("java1");
		duilie.addFirst("java2");
		duilie.addFirst("java3");
		duilie.addFirst("java4");
		
		sop(duilie.getLast());
		while (!duilie.isEmpty()) {
			sop(duilie.getLast());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}
class Duilie{
	private LinkedList link;
	public Duilie() {
		link=new LinkedList();
	}
	public void addFirst(Object o) {
		link.addFirst(o);
	}
	public Object getLast() {
		return link.removeLast();
	}
	public boolean  isEmpty() {
		return link.isEmpty();
	}
}

6 ArrayList  练习 去掉重复元素if (!newAl.contains(object)) {newAl.add(object);}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">package day14Collection;</span>

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest {
/*
 * 去除ArrayList中的重复元素*/
	public static void main(String[] args) {

		ArrayList arrayList=new ArrayList();
		arrayList.add("java1");
		arrayList.add("java1");
		arrayList.add("java1");
		arrayList.add("java2");
		arrayList.add("java3");
		arrayList.add("java4");
		Iterator i=arrayList.iterator();
		while (i.hasNext()) {
			Object object = (Object) i.next();
			sop(i.next());
			//迭代时  循环中  只调用一次,就用hasNext 判断一次
		}
		/*
		 * */
		sop(arrayList);
		sop(singleElement(arrayList));
	}
	public static ArrayList singleElement(ArrayList al) {
		ArrayList newAl=new ArrayList();
		Iterator i=al.iterator();
		while (i.hasNext()) {
			Object object = (Object) i.next();
			sop(object);
			if (!newAl.contains(object)) {
				newAl.add(object);
			}
		}
		return newAl;
	}
	static void sop(Object o){
		System.out.println(o);
	}
}

7 ArrayList 练习 自定义要存储的对象 and 去除重复元素(核心:集合判断元素是否相同,依据就是元素的equals方法)

package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class ArrayListTest2 {
/*
 * 将 自定义对象作为元素
 * 存储到ArrayLIst集合中
 * 并去除重复元素
 * 比如  人对象,同姓名同年龄看做重复
 * 
 * 思路:
 * 1:对人描述,将数据封装
 * 2:定义容器,存入
 * 3:去除重复
 * List 集合判断元素是否相同,依据就是元素的equals方法
 * */
	public static void main(String[] args) {
		ArrayList al=new ArrayList();
		al.add(new Person2("lisi1", 31));
		al.add(new Person2("lisi1", 31));
		al.add(new Person2("lisi2", 32));
		al.add(new Person2("lisi3", 33));
		al.add(new Person2("lisi4", 34));
		al =singleElement(al);
		Iterator iterator=al.iterator();
		while (iterator.hasNext()) {
			Person2 person2 = (Person2) iterator.next();
			sop("person2.getName():"+person2.getName()+"person2.getAge():"+person2.getAge());
		}
		
		sop("al.remove new :"+al.remove(new Person2("lisi1", 31)));
	}
	static void sop(Object o){
		System.out.println(o);
	}
	public static ArrayList singleElement(ArrayList al) {
		ArrayList newAl=new ArrayList();
		Iterator i=al.iterator();
		while (i.hasNext()) {
			Person2 p = (Person2) i.next();
//			sop(p);
			System.out.println("------->contains");
			if (!newAl.contains(p)) {
				newAl.add(p);
			}
		}
		return newAl;
	}

}
class Person2{
	private String name;
	private int age;
	public Person2(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public int  getAge() {
		return age;
	}
	public boolean equals(Object object) {
		System.out.println("---->equals");
		if(!(object instanceof Person2)) {
			return false;
		}
		Person2 p=(Person2) object;
		return this.name.equals(p.getName())&&this.name==(p.getName());
	}
}

8 HashSet 简介(元素唯一,无序,底层数据结构为哈希表)

package day14Collection;

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

public class HashSetDemo {

	/**
	 * --Set 特点:元素是无序,同时元素不可以重复。因为该集合体系没有索引
	 * 		|--HashSet:底层数据结构式哈希表
	 * 		|--TreeSet:
	 * 元素无序 :也就是存入和取出元素的顺序不一定一致,元素不可以重复
	 *set 集合的功能和Collection 是一致的
	 *
	 */
	public static void main(String[] args) {
//		Demo d1=new Demo();
//		Demo d2=new Demo();
//		sop(d1);
//		sop(d2);
		HashSet hs=new HashSet();
		sop(hs.add("java01"));
		sop(hs.add("java01"));
		hs.add("java01");
		hs.add("java02");
		hs.add("java03");
		hs.add("java04");
		for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
			sop("hs:"+object);
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}
//class Demo{
//	public int hashCode() {
//		return 60;
//		
//	}
//}

9  Hashset  练习  存入自定义对象 年龄相同视为相同元素(核心:HashSet 实现元素唯一的原理依赖于 hashCode() 和 equals())

package day14Collection;

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


public class HashSetTest {

	/**
	 *向HashSet 存入自定义对象
	 *姓名年龄相同视为相同元素
	 *
	 *	HashSet 如何保证元素唯一性的呢???
	 *通过元素是两个方法看,hashCode 和equals方法
	 *如果hashCode相同,会判断equals是否为true
	 *如果hashCode不同,不会调用equals
	在java的集合中,判断两个对象是否相等的规则是: 
	1:判断两个对象的hashCode是否相等 
      	如果不相等,认为两个对象也不相等,完毕 
      	如果相等,转入2) 
	2:判断两个对象用equals运算是否相等 
      	如果不相等,认为两个对象也不相等 
      	如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
      
      注意:
      对于元素是否存在,已经删除操作。
      	 依赖的方法是:hashCode和equals方法
      	 ArrayList 依赖equals
                而Hashset   依赖 hashCode和equals 
	 */
	public static void main(String[] args) {
		HashSet hs=new HashSet();
		hs.add(new Person3("a1",11));
		hs.add(new Person3("a2",12));
		hs.add(new Person3("a3",13));

		sop("-->"+hs.contains(new Person3("a2",12)));
		sop("remove:--->"+hs.remove(new Person3("a2",12)));
		sop("remove:--->"+hs.remove(new Person3("a3",13)));
		sop("remove:--->"+hs.remove(new Person3("a1",11)));
		for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
			Person3 object = (Person3) iterator.next();
			sop("object.getName():"+object.getName()+"---object.getAge():"+object.getAge());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}

}
class Person3{
	private String name;
	private int age;
	public Person3(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public int  getAge() {
		return age;
	}
	public boolean equals(Object object) {
		System.out.println(this.name+"---->equals"+this.age);
		if(!(object instanceof Person3)) {
			return false;
		}
		Person3 p=(Person3) object;
		return this.name.equals(p.getName())&&this.age==p.getAge();
	}
//	public boolean equals(Object obj) {
//		System.out.println("equals:>>this:"+this+"---obj"+obj);
//        return (this == obj);
//    }
	public int hashCode() {
		System.out.println("hashCode:>>"+this.name+"--------"+this.age);
		return 60;
		
	}
}

10 TreeSet  有序 ,唯一,底层数据结构为二叉树/红黑树 ;存入的对象需要实现Comparable接口  或者  TreeSet(Compartor c)唯一依赖于compareTo 方法 return  0

</pre><pre code_snippet_id="471367" snippet_file_name="blog_20140919_12_4620803" name="code" class="java">package day14Collection;

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

public class TreeSetDemo {
/*
 * Set 无序 不可以重复
 *  |————Hashset :数据结构式哈希表,线程非同步
 *   				保证元素唯一性的原理是:
 *   				判断元素的hashCode是否相同
 *   				如果相同,判断equals方法
 *  |————TresSet:
 *  		可以对set集合中的元素进行排序
 *  		底层数据结构二叉树
 *  		保证元素唯一性的依据是:
 *  		compareTo 方法 return  0;
 *  		TreeSet 排序方式是
 *  		让元素自身具有比较性
 *  		元素需要实现Comparable接口
 *  		覆盖CompareTo 方法
 *  		这种方式也称为元素 是自然顺序或者默认顺序。
 *  
 *  		TreeSet第二种排序方式
 *  		当元素自身不具备比较性时,或者具备的不是不是需要的比较性时:
 *  		这是需要让集合本身具有比较性
 *  		在集合初始化时具有比较方式
 *  		让让排序参与构造函数
 *  
 *  需求:
 *  向TreeSet集合中存储自定义对象 学生
 *  想按照学生的年龄进行排序
 *  Treeset排序时:
 *  当主要条件相同时,一定判断一下次要条件
 *  
 *  怎么存 然后怎么取:
 *  将CompareTo(Object c){
 *  	return 1;
 *  }
 *  
 *   */
	public static void main(String[] args) {
		TreeSet ts=new TreeSet();
//		ts.add("cba");
//		ts.add("abcd");
//		ts.add("aaa");
//		ts.add("bca");
//		ts.add("2");
//		ts.add("1");
		sop(ts.add(new Student("lisi1",22)));
		sop(ts.add(new Student("lisi2",23)));
		sop(ts.add(new Student("lisi3",24)));
		sop(ts.add(new Student("lisi4",24)));
		sop(ts.add(new Student("lisi4",24)));
		/* java.lang.ClassCastException:
		 *  day14Collection.Student
 			cannot be cast to java.lang.Comparable*/
		for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
			Student object = (Student) iterator.next();
			
			sop("getAge:"+object.getAge()+"--getName:"+object.getName());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}

class Student implements Comparable{
	//Comparable 让实现它的类具有比较性
	private String name;
	private int age;
	public Student(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	@Override
	public int compareTo(Object o) {
		if(!(o instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student) o;

		System.out.println(this.name+":compara:"+s.name);
		if(this.age>s.getAge())
			return 1;
		else{
			if(this.age<s.getAge())
				return -1;
		}
		return this.name.compareTo(s.name);
	}
}

11 TreeSet  当元素自身不具备比较性  或者具备的不是需要的比较性,这是让容器自身具有比较性

package day14Collection;

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

public class TreeSetDemo2 {
/*
 * 当元素自身不具备比较性
 * 或者具备的不是需要的比较性
 * 
 * 这是让容器自身具有比较性
 * 
 * 这时定义比较器
 * 将比较器对象作为构造函数参数进行构造
 * 
 * 当两种方式同时存在时
 * 以比较器为主
 * 定义一个类
 * 实现Comparator接口, 实现compare方法
 * 
 * */
	public static void main(String[] args) {
		
		TreeSet ts=new TreeSet(new MyCompare());
		ts.add(new Student2("lisi02",22));
		ts.add(new Student2("lisi02",21));
		ts.add(new Student2("lisi007",20));
		ts.add(new Student2("lisi09",19));
		ts.add(new Student2("lisi06",18));
		ts.add(new Student2("lisi06",18));
		ts.add(new Student2("lisi007",29));
		for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
			Student2 object = (Student2) iterator.next();
			
			sop("getAge:"+object.getAge()+"--getName:"+object.getName());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}
class MyCompare implements Comparator{
	public int compare(Object o1, Object o2) {
		Student2 s1=(Student2) o1;
		Student2 s2=(Student2) o2;
		int m=s1.getName().compareTo(s2.getName());
		if(m==0)
			return Integer.valueOf(s1.getAge()).compareTo(Integer.valueOf(s2.getAge()));
		return  m;
	}
	
}
class Student2 implements Comparable{
	private String name;
	private int age;
	public Student2(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	@Override
	public int compareTo(Object o) {
		if(!(o instanceof Student2))
			throw new RuntimeException("不是学生对象");
		Student2 s=(Student2) o;

		System.out.println(this.name+":compara:"+s.name);
		if(this.age>s.getAge())
			return 1;
		else{
			if(this.age<s.getAge())
				return -1;
		}
		return this.name.compareTo(s.name);
	}
}

12 自定义对象具有比较性  存储器也具有比较性

package day14Collection;
import java.util.*;

/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare方法。


*/
class Student3 implements Comparable//该接口强制让学生具备比较性。
{
	private String name;
	private int age;

	Student3(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public int compareTo(Object obj)
	{

		//return 0;
		
		if(!(obj instanceof Student3))
			throw new RuntimeException("不是学生对象");
		Student3 s = (Student3)obj;

		//System.out.println(this.name+"....compareto....."+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 int getAge()
	{
		return age;
	}
}
public class TreeSetDemo22 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet(new MyCompare3());

		ts.add(new Student3("lisi02",22));
		ts.add(new Student3("lisi02",21));
		ts.add(new Student3("lisi007",20));
		ts.add(new Student3("lisi09",19));
		ts.add(new Student3("lisi06",18));
		ts.add(new Student3("lisi06",18));
		ts.add(new Student3("lisi007",29));
		//ts.add(new Student3("lisi007",20));
		//ts.add(new Student3("lisi01",40));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student3 stu = (Student3)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}

class MyCompare3 implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Student3 s1 = (Student3)o1;
		Student3 s2 = (Student3)o2;

		int num = s1.getName().compareTo(s2.getName());
//		if(num==0)
//		{
//
//			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
//			/*
//			if(s1.getAge()>s2.getAge())
//				return 1;
//			if(s1.getAge()==s2.getAge())
//				return 0;
//			return -1;
//			*/
//		}

		
		return num;

	}
}

13TreeSet 练习 按照字符长度进行排序

package day14Collection;

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

public class TreeSetTest {
/*
 * 练习  按照字符长度进行排序
 * 
 * 字符串本身具有比较性
 * 但是他的方式不是需要的*/
	public static void main(String[] args) {
		TreeSet ts=new TreeSet(new StringLengthComparator());
		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("a");
		ts.add("hahaha");
		for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
			String object = (String) iterator.next();
			sop(object);
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}
class StringLengthComparator implements Comparator{

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

14  泛型简介 类型安全机制 <> 定义
</pre></h1><div><pre code_snippet_id="471367" snippet_file_name="blog_20140919_17_3562837" name="code" class="java">package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericDemo {
/*
 * 泛型
 * JDK1.5版本以后出现新特性
 * 用于解决安全问题,是一个类型安全机制
 * 好处:
 * 1:将运行时问题转移到编译时期
 * 2:避免了强制转换
 * 类型安全机制
 * 
 * 泛型的格式:
 * 通过 <> 定义要操作 的数据类型
 * 
 * 在使用java对象时,何时使用泛型
 * 通常在集合框架中很常见
 * 
 * 只有见到 <> 就使用泛型
 * 
 * 其实 <>就是定义接受类型的
 * 
 * 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
 * */
	public static void main(String[] args) {
		ArrayList<String> al=new ArrayList<String>();
		al.add("abc01");
		al.add("abc01");
		al.add("abc01");
		al.add("abc0991");
		al.add("abc014");
		for (Iterator<String> iterator = al.iterator(); iterator.hasNext();) {
			String object =  iterator.next();
			sop("长度:"+object.length());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}

}

15 泛型Generic 示例

package day14Collection;

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

public class GenericDemo2 {
	public static void main(String[] args) {
		TreeSet<String> ts=new TreeSet<String>(new StringLengthComparator2());
		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("a");
		ts.add("hahaha");
		for (Iterator<String> iterator = ts.iterator(); iterator.hasNext();) {
			sop( iterator.next());
		}
	}
	static void sop(Object o){
		System.out.println(o);
	}
}
class StringLengthComparator2 implements Comparator<String>{
	@Override
	public int compare(String o1, String o2) {
		int num=new Integer(o1.length()).compareTo(new Integer(o2.length()));
		if(num==0)
			return o1.compareTo(o2);
		return num;
	}
	
}

15 使用泛型场景之一当 类中要操作的类类型不确定时(早期定义Object来完成扩展)

package day14Collection;

public class GenericDemo3 {
/*什么时候需要泛型
 * 
 * 当 类中要操作的类类型不确定时
 * 早期定义Object来完成扩展
 * 
 * 现在定义泛型类来完成扩展
 * */
	public static void main(String[] args) {
		Utils<Worker> t=new Utils<Worker>();
		t.setT(new Worker());
//		t.setT(new Student4());编译错误
		Worker w=t.getT();
	}

}
class Worker{
	
}
class Student4{
	
}

//泛型类

class Utils<T>{
	private  T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}
	
}
//class Tool{
//泛型之前的做法
//	private Object obj;
//
//	public Object getObj() {
//		return obj;
//	}
//
//	public void setObj(Object obj) {
//		this.obj = obj;
//	}
//}
//class Tool{
//	private Worker  w;
//
//	public Worker getW() {
//		return w;
//	}
//
//	public void setW(Worker w) {
//		this.w = w;
//	}
//}

16 泛型定义范围  类   or 方法

package day14Collection;

public class GenericDemo4 {
/*泛型类定义的泛型,在整个类中有效。如果被方法使用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定
那么可以将泛型定义在方法上。

 * */
	public static void main(String[] args) {
//		Demo<String> d=new Demo<String>();
//		d.show("haha");
//		d.print("hwhh");
		Demo<Integer> d=new Demo<Integer>();

//		Demo d=new Demo();
		d.show(new Integer(4));
		d.print(4);//自动装箱
//		d.show("haha");
		d.print("hwhh");
		Demo.method(d);
	}
}
//class Demo<T>{
//	public void show(T t){
//		System.out.println("show:"+t);
//	}
//	public void print(T t){
//		System.out.println("print:"+t);
//	}
//
//}
//class Demo{
//public <T> void show(T t){
//	System.out.println("show:"+t);
//}
//public <T> void print(T t){
//	System.out.println("print:"+t);
//}
//
//}
class Demo <T>{
public  void show(T t){
	System.out.println("show:"+t);
}
public <Q> void print(Q t){
	System.out.println("print:"+t);
}
public static <W> void method(W w){
	System.out.println("method:"+w);
//	Cannot make a static reference to the non-static type T
//静态方法不可以方法类上定义的泛型
//如果静态操作的应用数据类型不确定 ,可以定义在方法上
}
}

17  泛型定义在接口

package day14Collection;

public class GenericDemo5 {
/*
 * 泛型定义在接口上
 * */
	public static void main(String[] args) {
		InterImpl<String> i=new InterImpl<String>();
		i.show("haha");
	}

}
interface Inter<T>{
	void show(T t);
}
//class InterImpl implements Inter<String>{
//	public void show(String t) {
//		System.out.println("show:"+t);
//	}
//	
//}

class InterImpl<T> implements Inter<T> {
	public void show(T t) {
		System.out.println("show:" + t);
	}
}

18泛型限定  范围 。向上限定 ? extends  E 可以接受E 或者E类型的子类 and 向下限定 ? super    E 可以接受E 或者E类型的父类

package day14Collection;

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

public class GenericDemo6 {
/*
 * ? 通配符。占位符
 * 泛型限定
 * 
 * 向上限定 ? extends  E 可以接受E 或者E类型的子类
 * 向下限定 ? super    E 可以接受E 或者E类型的父类*/
	public static void main(String[] args) {
//		ArrayList<String> al=new ArrayList<String>();
//		al.add("abc1");
//		al.add("abc2");
//		al.add("abc3");
//		pingtColl(al);
//		
//		ArrayList<Integer> all=new ArrayList<Integer>();
//		all.add(3);
//		all.add(2);
//		all.add(1);
//		pingtColl(all);//编译错误

		ArrayList<Person> al=new ArrayList<Person>();
		al.add(new Person("abc1"));
		al.add(new Person("abc2"));
		al.add(new Person("abc3"));
		pingtColl(al);
		
		ArrayList<Student5> all=new ArrayList<Student5>();
		al.add(new Student5("abc1"));
		al.add(new Student5("abc2"));
		al.add(new Student5("abc3"));

		pingtColl(all);//编译失败
		
		
	}
	public static   void pingtColl(ArrayList<? extends Person> al) {
	for (Iterator<? extends Person> iterator = al.iterator(); iterator.hasNext();) {
		
		System.out.println("pingtColl:"+iterator.next().getName());
	}
}
//	public static void pingtColl(ArrayList<?> al) {
//		for (Iterator<?> iterator = al.iterator(); iterator.hasNext();) {
//			System.out.println("pingtColl:"+iterator.next());
////			System.out.println("pingtColl:"+iterator.next().lentgh());编译错误
//		}
//	}
//	public static <T> void pingtColl(ArrayList<T> al) {
//		for (Iterator<T> iterator = al.iterator(); iterator.hasNext();) {
//			
//			System.out.println("pingtColl:"+iterator.next());
//		}
//	}
}
class Person{
	private String name;
	public Person(String name){
		this.name=name;
		
	}
	public String getName() {
		return name;
	}

}
class Student5 extends Person{
	public Student5(String name){
		super(name);
	}
	
}
package day14Collection;

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

public class GenericDemo6 {
/*
 * ? 通配符。占位符
 * 泛型限定
 * 
 * 向上限定 ? extends  E 可以接受E 或者E类型的子类
 * 向下限定 ? super    E 可以接受E 或者E类型的父类*/
	public static void main(String[] args) {
//		ArrayList<String> al=new ArrayList<String>();
//		al.add("abc1");
//		al.add("abc2");
//		al.add("abc3");
//		pingtColl(al);
//		
//		ArrayList<Integer> all=new ArrayList<Integer>();
//		all.add(3);
//		all.add(2);
//		all.add(1);
//		pingtColl(all);//编译错误

		ArrayList<Person> al=new ArrayList<Person>();
		al.add(new Person("abc1"));
		al.add(new Person("abc2"));
		al.add(new Person("abc3"));
		pingtColl(al);
		
		ArrayList<Student5> all=new ArrayList<Student5>();
		al.add(new Student5("abc1"));
		al.add(new Student5("abc2"));
		al.add(new Student5("abc3"));

		pingtColl(all);//编译失败
		
		
	}
	public static   void pingtColl(ArrayList<? extends Person> al) {
	for (Iterator<? extends Person> iterator = al.iterator(); iterator.hasNext();) {
		
		System.out.println("pingtColl:"+iterator.next().getName());
	}
}
//	public static void pingtColl(ArrayList<?> al) {
//		for (Iterator<?> iterator = al.iterator(); iterator.hasNext();) {
//			System.out.println("pingtColl:"+iterator.next());
////			System.out.println("pingtColl:"+iterator.next().lentgh());编译错误
//		}
//	}
//	public static <T> void pingtColl(ArrayList<T> al) {
//		for (Iterator<T> iterator = al.iterator(); iterator.hasNext();) {
//			
//			System.out.println("pingtColl:"+iterator.next());
//		}
//	}
}
class Person{
	private String name;
	public Person(String name){
		this.name=name;
		
	}
	public String getName() {
		return name;
	}

}
class Student5 extends Person{
	public Student5(String name){
		super(name);
	}
	
}

19  泛型限定示例

package day14Collection;

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

public class GenericDemo7 {
/*
 * */
	public static void main(String[] args) {
		TreeSet<Student7> ts=new TreeSet<Student7>(new Comp());
		ts.add(new Student7("abc3"));
		ts.add(new Student7("abc2"));
		ts.add(new Student7("abc6"));
		ts.add(new Student7("abc1"));
		ts.add(new Student7("abc3"));
		for (Iterator<Student7> iterator = ts.iterator(); iterator.hasNext();) {
			Student7 student7 = (Student7) iterator.next();
			System.out.println(student7.getName());
		}
		
		TreeSet<Worker7> ts1=new TreeSet<Worker7>(new Comp());
		ts1.add(new Worker7("abc3"));
		ts1.add(new Worker7("abc2"));
		ts1.add(new Worker7("abc6"));
		ts1.add(new Worker7("abc1"));
		ts1.add(new Worker7("abc3"));
		for (Iterator<Worker7> iterator = ts1.iterator(); iterator.hasNext();) {
			Worker7 w = (Worker7) iterator.next();
			System.out.println(w.getName());
		}
	}

}
class Person7{
	private String name;
	public Person7(String name){
		this.name=name;
		
	}
	public String getName() {
		return name;
	}

}
class Student7 extends Person7{
	public Student7(String name){
		super(name);
	}
	
}
class Worker7 extends Person7{
	public Worker7(String name) {
		super(name);	
	}
}
class Comp implements Comparator< Person7>{
	public int compare(Person7 o1, Person7 o2) {
		return o1.getName().compareTo(o2.getName());
	}
}

《黑马程序员 java 基础 毕向东 面向对象 集合框架》
介绍了java中的集合框架,让我对集合框架组成有了初步了解,掌握了一下集合处理方法,而泛型也是其中非常重要的部分,对于程序安全有着重要的判定作用

抱歉!评论已关闭.