黑马程序员——Java基础--集合(四)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

第四讲 List 和 Set

一、概述
1、List: 元素是有序的,元素可以重复,有索引。
(1)ArrayList,集合底层是 可变数组 10个,线程是不安全的,运行速度快, 查询速度快,增删慢,增长率原长度的50%;
(2)Vector出现版本JDK1.0,集合框架出现的版本是JDK1.2, 从1.2开始,Vector改进为List接口。底层数据结构都是可变数组,默认10个, 增长率原长度的100%,线程安全的集合,运行速度慢。查询快,增删慢。从JDK1.2版本开始,ArrayList取代Vector,没有集合框架的时候,存储对象只能依靠Vector;
(3)LinkedList链表结构,记录对象地址,线程不安全,运行速度快, 查询慢,增删慢。LinkedList存取代码和ArrayList一致。

2、Set:无序集合,存储和去除顺序不一致,没有索引,迭代器,增强for,不允许重复元素。
(1)HashSet底层数据结构是哈希表,线程不安全集合,运行速度快,允许存储null;
(2)TreeSet底层其实是TreeMap,红黑树(自然平衡算法的二叉树)结构,线程不安全,运行速度快
,自定义类必须实现Compareable接口,要重写compareTo()方法;
(3)LinkedHashSetJDK1.4出现的继承HashSet,有序的Set集合,保证元素的迭代顺序,怎么存储怎么去除,线程不安全,运行速度快,基于链表的哈希结果。
二、List的应用举例
1、ArrayList应用举例
学生类
package cn.itcast.practice2;
//定义一个学生类
public class Student {
	//成员方法
	private String name;
	private int age;
	//构造方法
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	
}
测试类
package cn.itcast.practice2;

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

/*
 * ArrayList存储自定义对象,并迭代器
 * 分析:
 * 1、定义一个学生类
 * 2、创建集合对象
 * 3、创建学生对象
 * 4、添加元素
 * 5、迭代器遍历
 * 6、输出 
 */
public class ArrayListDemo {
	public static void main(String[] args) {
		//创建集合对象
		ArrayList array = new ArrayList();
		//创建学生对象
		Student s1 = new Student("z1",18);
		Student s2 = new Student("z2",25);
		Student s3 = new Student("z3",20);
		//添加元素
		array.add(s1);
		array.add(s2);
		array.add(s3);
		//调用方法
		method(array);
	}
	//迭代器遍历
	public static void method(ArrayList array){
		Iterator it = array.iterator();
		while(it.hasNext()){
			Student s = (Student)it.next();
			System.out.println(s.getName()+"------"+s.getAge());
		}
	}
}
结果:
z1------18
z2------25
z3------20
2、 Vector
package cn.itcast.vector;

import java.util.Iterator;
import java.util.Vector;
/*
 * Vecror 演示 
 */
public class VectorDemo {
	public static void main(String[] args) {
		Vector v = new Vector();//创建对象
		//添加元素
		v.add("hello");
		v.add("world");
		Iterator it = v.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}

结果:
hello
world
3、 LinkedList
package cn.itcast.practice3;

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

/*
 * 模拟数据结构
 * 桟:先进后出
 * 堆:先进先出
 */
public class ArrayListTest {
	public static void main(String[] args) {
		//创建集合对象
		LinkedList link = new LinkedList();
		//添加元素
		link.add("a");
		link.add("b");
		link.add("c");
		link.add("d");
		link.add("e");
		method(link);
		method1(link);
	}
	public static void method(LinkedList link){
		while (!link.isEmpty()) {//判断不为空
			System.out.println(link.removeLast());//进行反向输出
		}
	}
	public static void method1(LinkedList link){
		while (link.isEmpty()) {//判断不为空
			break;
		}
		System.out.println(link);//输出
	}
}

结果:
e
d
c
b
a
[]
三、Set的应用举例
1、 HashSet
学生类
package cn.itcats.hashset;

/*
 * 学生类
 */
public class Student {
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public int compareTo(Student s){
		int num = this.name.compareTo(s.name);
		/*if(num!=0){
			return num;
		}else{
			return this.age-s.age;
		}*/
		return num==0?this.age-s.age :num;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	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 String toString(){
		return "Student:" + name +"---"+ age;
	}
}
测试类
package cn.itcats.hashset;

import java.util.HashSet;

/*
 * 案例: HashSet存储自定义对象,迭代器
                     会重写hashCode和equals 
    分析:
    1、定义一个学生类
    2、创建集合对象来存放学生类的数据
    3、增强for进行迭代
 */
public class HashSetDemo {
	public static void main(String[] args) {
		//创建集合对象
		HashSet<Student> h = new HashSet<Student>();
		//添加元素到集合
		h.add(new Student("zhangsan", 18));
		h.add(new Student("lisi", 20));
		//增强for
		for (Student s : h) {
			System.out.println(s);
		}
	}
}
结果:
Student:zhangsan---18
Student:lisi---20
2、TreeSet
(1)自然排序,实现接口Comparable,重写抽象方法compareTo 自定义自然顺序;
学生类
package cn.itcats.treeset;
/*
 * 实现接口Comparable,这个Student具备了自然顺序
 * 重写抽象方法compareTo 自定义自然顺序
 * 8种基本数据类型保证类,String
 * 继承Object,实现Comparable
 * 重写了hashCode equals  compareTo
 */
public class Student implements Comparable<Student>{
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public int compareTo(Student s){
		int num = this.name.compareTo(s.name);
		return num==0?this.age-s.age :num;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	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;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}


测试类
package cn.itcats.treeset;

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

/*
 *  TreeSet存储Student对象,采用自然排序
 * 
 */
public class TreeSetDemo {
	public static void main(String[] args) {
		//创建集合对象
		Set<Student> s = new TreeSet<Student>();
		//添加元素到集合中
		s.add(new Student("zhangsan", 20));
		s.add(new Student("lisi", 22));
		for (Student s1 : s) {
			System.out.println(s1);
		}
	}
}

结果:
Student [name=lisi, age=22]
Student [name=zhangsan, age=20]
(2) 比较器 当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。 在集合初始化时,就有了比较方式。定义一个比较器,将比较器对象作为参数传递给 TreeSet 集合的构造函数。

比较器构造方式:定义一个类,实现Comparator接口,覆盖compare方法。

学生类
package cn.itcats.treeset;

public class Student {
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}

测试类
package cn.itcats.treeset;


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

/*
 * TreeSet存储自定义对象,Student,按照年龄排序
 * 年龄相同,比较姓名
 * Student类,具有自然顺序,姓名主要条件
 * TreeSet集合,提供另一种比较方式,比较器
 * 
 * 构造方法中,创建的空参数的,利用对象的自然顺序
 * 构造方法中,重载形式
 *   TreeSet(Comparator c)传递比较器对象
 *   传递接口的实现类的对象,自己定义比较器对象
 *   实现Comparator,重写接口抽象方法
 */
public class TreeSetDemo1 {
	public static void main(String[] args) {
		//创建集合对象
		TreeSet<Student> set = new TreeSet<Student>(new Comparator<Student>(){
			public int compare(Student s1,Student s2){
				int age = s1.getAge()-s2.getAge();
				return age == 0 ? s1.getName().compareTo(s2.getName()):age;
			}
		});
		//添加元素到集合中
		set.add(new Student("zhangsan", 24));
		set.add(new Student("lisi", 22));
		for (Student s1 : set) {
			System.out.println(s1);
		}
	}
}

结果:
Student [name=lisi, age=22]
Student [name=zhangsan, age=24]


-----------android培训java培训、java学习型技术博客、期待与您交流!------------






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值