Java学习笔记day14

List与Set的区别

List: 有序的,有下标的,元素可重复
Set: 无序,无下标,元素不可重复

LIst

List提供的方法

增
	void add(int index, E element)
		作用: 将元素添加到List的指定位置
		参数: 
			index: 插入的位置
			element: 添加的元素
			
	boolean addAll(int index, Collection<E> c)
		作用: 将一个集合的数据添加到当前集合指定位置
		参数: 
			index: 插入的位置
			c: 添加的集合
						
删
	E remove(int index)
		作用: 删除指定位置的元素
		参数: 
			index: 指定的位置
		返回值: 
			被删除的元素			
						           
改			
	E set(int index, E element)
		作用: 修改指定位置的元素
		参数: 
			index: 指定的位置
			element: 修改后的元素
		返回值: 
			修改前集合中该位置的元素
			
查
	E get(int index)
		作用: 获取指定位置的元素
		参数: 
			index: 指定的位置
		返回值: 
			指定位置的元素
		注意: 取出元素后,该元素依旧在集合存在
		
	int indexOf(Object o)
		作用: 查询元素在集合中的位置
		参数: 
			o: 查询的元素
		返回值: 
			元素在集合中的位置
		注意: 如果查询的元素在集合中不存在返回-1
		
	int lastIndexOf(Object o)
		作用: 查询元素在集合中最后一次出现的位置
		参数: 
			o: 查询的元素
		返回值: 
			元素在集合中最后一次出现的位置
		注意: 如果查询的元素在集合中不存在返回-1
		
	list<E> subList(int fromIndex, int toIndex)
		作用: 截取集合中一段元素
		参数: 
			fromIndex: 开始位置
			toIndex: 结束位置
		返回值: 
			截取的元素集合
		注意: 
			1.截取的元素包含开始位置,不包含结束位置
			2.不会影响原集合的数据
			
遍历List集合有3种方式
	for
	foreach
	迭代器
使用List模拟栈与队列
	List<Integer> list = new ArrayList<Integer>();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	
	栈: 后进先出
	//判断集合是否为空
	while(!list.isEmpty()){
		//删除最后一个元素
		Integer i = list.remove(list.size() - 1);
		System.out.println(i);
	}
	System.out.println(list);
	
	队列: 先进先出
	while(!list.isEmpty()){
		//删除第一个元素
		Integer i = list.remove(0);
		System.out.println(i);
	}
	System.out.println(list);
	注意: 出去后数据就不在集合中存在了

常用子类

ArrayList
	数据结构: 数组
	特点: 查询速度快,增删速度慢,线程不安全
	时间: JDK1.2
LinkedList
	数据结构: 链表
	特点: 查询速度慢,增删速度快
	时间: JDK1.2
Vector
	数据结构: 数组
	特点: 查询速度快,增删速度慢,线程安全的
	时间: JDK1.0
	
注意: List的子类没有提供特有的方法

Set

Set提供的方法

没有提供特有的方法,所有方法都来自Collection

特点

无序,无下标,元素不可重复

常用的子类

HashSet
	特点: 数据按照对应的hash码值进行排序
	数据结构: 
		1.8以前: 数组 + 链表
		1.8及以后: 数组 + 红黑树
	注意: 
		HashSet中数据前后顺序是根据存储的对象的hashCode值决定的
	存储原理: 
		存储对象时,先调用对象的hashCode()方法,获取对象的hashCode值,使用该hashCode值与集合中已经存储的对象的hashCode值进行比较,如果不相同,直接存储(在红黑树的结构中).如果相同,再调用对象的equals()方法与相同的对象进行比较,如果不相同,存储到集合中(在数组中存储).如果equals()方法结果为true表示相同,那么HashSet集合认为两个对象相同,不再存储第二个对象
		
LinkedHashSet
	数据结构: 
		1.8以前: 数组 + 链表 + 链表
		1.8及以后: 数组 + 红黑树 + 链表
		注意: LinkedHashSet多出的链表是用来记录数据的存储顺序,所以LinkedHashSet是有序的
		
TreeSet
	数据结构: 红黑树
	注意: 
		TreeSet存储数据时要么数据拥有比较性,要么创建TreeSet时指定比较器
	让数据拥有比较性
		就是让存储的数据所属的类实现Comparable接口
		注意: 实现Comparable接口就要重写compareTo()方法
		
	指定比较器
		在创建TreeSet集合时,传入实现了Comparator的接口对象							

数据结构

栈: 后进先出
队列: 先进先出
数组: 
	特点: 
		在内存中连续开辟一片空间,所以在寻找数据中所有数据计算机一次遍历内存即可,所以查询速度快
		但是因为所有数据在同一片区域,此时如果给其中插入或删除一个数据,那么后面的数据位置都将需要修改,所以增删速度慢
		
链表: 
	单链表: 
		特点: 前一个数据中存储下一个数据的位置
		
	双链表: 
		特点: 前一个数据中存储上一个与下一个数据的位置
		
红黑树: 
	特点: 左叉,右叉,节点
	别名: 二叉树

经验

ArrayList: 查询
LinkedList: 修改
Vector: 古老的ArrayList

HashSet: 剔重
LinkedHashSet: 有序的HashSet
TreeSet: 排序
注意: 在实际开发中,数据管理主要是靠数据库,数据可以通过SQL实现对数据剔重与排序,SQL语句可以对数据直接进行修改

原因: 
	1.面试	2.考试	3.不操作数据库时可以快速实现对数据的剔重与排序

练习

1.将以下数据存储到ArrayList集合中
	10,19,12,8,6,3,7,15
	并使用冒泡排序对其进行排序
2.将以下数据存储到ArrayList集合中
	Student s1 = new Student(10010, "德玛", 18);
	Student s2 = new Student(10008, "蛮王", 13);
	Student s3 = new Student(10014, "寒冰", 12);
	Student s4 = new Student(10053, "剑圣", 18);
	Student s5 = new Student(10001, "狗熊", 28);
	Student s6 = new Student(10021, "狗头", 48);
	Student s7 = new Student(10013, "锤石", 29);
	并使用选择排序对其进行排序, 要求按照学号排序
3.使用TreeSet存储以下数据, 并进行排序
	要求
		1.用比较性与比较器两种方法完成
		2.按照年龄排序, 年龄相同时按照学号排序
	Student s1 = new Student(10010, "德玛", 18);
	Student s2 = new Student(10008, "蛮王", 13);
	Student s3 = new Student(10014, "寒冰", 12);
	Student s4 = new Student(10053, "剑圣", 18);
	Student s5 = new Student(10001, "狗熊", 28);
	Student s6 = new Student(10021, "狗头", 48);
	Student s7 = new Student(10013, "锤石", 29);
4.使用HashSet对以下数据进行剔重, 如果属性值相同, 就认为相同
	Student s1 = new Student(10010, "德玛", 18);
	Student s2 = new Student(10008, "蛮王", 13);
	Student s3 = new Student(10010, "德玛", 18);
	Student s4 = new Student(10053, "剑圣", 18);
	Student s5 = new Student(10001, "狗熊", 28);
	Student s6 = new Student(10021, "狗头", 48);
	Student s7 = new Student(10021, "狗头", 48);
import java.util.ArrayList;
import java.util.List;
//对集合进行冒泡排序
public class Test01 {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(19);
		list.add(12);
		list.add(8);
		list.add(6);
		list.add(3);
		list.add(7);
		list.add(15);
		
		for (Integer i : list) {
			System.out.print(i + "  ");
		}
		System.out.println();
		
		for(int i = 0; i < list.size() - 1; i++) {
			for(int j = 0; j < list.size() - i - 1; j++) {
				if(list.get(j) > list.get(j + 1)) {
					int temp = list.get(j);
					list.set(j, list.get(j + 1));
					list.set(j + 1, temp);
				}
			}
		}
		
		for (Integer i : list) {
			System.out.print(i + "  ");
		}
		System.out.println();
	}
}

运行结果


public class Student {
	private int id;
	private String name;
	private int age;
			
	public Student() {
		
	}

	public Student(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	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 [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
		
}

import java.util.ArrayList;
import java.util.List;
//对集合进行选择排序
public class Test02 {
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		Student s1 = new Student(10010, "德玛", 18);
		Student s2 = new Student(10008, "蛮王", 13);
		Student s3 = new Student(10014, "寒冰", 12);
		Student s4 = new Student(10053, "剑圣", 18);
		Student s5 = new Student(10001, "狗熊", 28);
		Student s6 = new Student(10021, "狗头", 48);
		Student s7 = new Student(10013, "锤石", 29);

		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		list.add(s5);
		list.add(s6);
		list.add(s7);
		
		for (Student s : list) {
			System.out.println(s);
		}
		
		//选择排序, 按照学号排序
		for(int i = 0; i < list.size() - 1; i++) {
			int minIndex = i;
			for(int j = i + 1; j < list.size(); j ++) {
				if(list.get(j).getId() < list.get(minIndex).getId()) {
					minIndex = j;
				}
			}
			if(minIndex != i) {
				Student s = list.get(i);
				list.set(i, list.get(minIndex));
				list.set(minIndex, s);			
			}
		}
		
		System.out.println("排序后: ");
		for (Student s : list) {
			System.out.println(s);
		}
	}
}

运行结果

package demo03;

public class Student implements Comparable<Student>{
	private int id;
	private String name;
	private int age;
			
	public Student() {
		
	}

	public Student(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	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 [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Student o) {
		if(age != o.age) {
			return age - o.age;
		}
		if(id != o.id) {
			return id - o.id;
		}
		return 1;
	}
		
}

package demo03;

import java.util.Set;
import java.util.TreeSet;
//用比较性进行排序
public class Test {
	public static void main(String[] args) {
		Set<Student> set = new TreeSet<Student>();
		Student s1 = new Student(10010, "德玛", 18);
		Student s2 = new Student(10008, "蛮王", 13);
		Student s3 = new Student(10014, "寒冰", 12);
		Student s4 = new Student(10053, "剑圣", 18);
		Student s5 = new Student(10001, "狗熊", 28);
		Student s6 = new Student(10021, "狗头", 48);
		Student s7 = new Student(10013, "锤石", 29);

		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);
		set.add(s6);
		set.add(s7);
		
		for (Student s : set) {
			System.out.println(s);
		}
	}
}

运行结果

package demo04;

public class Student {
	private int id;
	private String name;
	private int age;
			
	public Student() {
		
	}

	public Student(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	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 [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}

package demo04;

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

import demo04.Student;
//用比较器进行排序
public class Test {
	public static void main(String[] args) {
		Set<Student> set = new TreeSet<Student>(new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				if(o1.getAge() != o2.getAge()) {
					return o1.getAge() - o2.getAge();
				}
				if(o1.getId() != o2.getId()) {
					return o1.getId() - o2.getId();
				}
				return 1;
			}
		});
		Student s1 = new Student(10010, "德玛", 18);
		Student s2 = new Student(10008, "蛮王", 13);
		Student s3 = new Student(10014, "寒冰", 12);
		Student s4 = new Student(10053, "剑圣", 18);
		Student s5 = new Student(10001, "狗熊", 28);
		Student s6 = new Student(10021, "狗头", 48);
		Student s7 = new Student(10013, "锤石", 29);

		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);
		set.add(s6);
		set.add(s7);
		
		for (Student s : set) {
			System.out.println(s);
		}
	}
}

运行结果

package demo05;

public class Student {
	private int id;
	private String name;
	private int age;
			
	public Student() {
		
	}

	public Student(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	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 [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	@Override
	public int hashCode() {
		return id + name.hashCode() + age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		if(obj instanceof Student) {
			Student stu = (Student)obj;
			if(id == stu.id && name.equals(stu.name) && age == stu.age) {
				return true;
			}
		}
		return false;
	}
}

package demo05;

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

import demo05.Student;
//使用HashSet对数据进行剔重
public class Test {
	public static void main(String[] args) {
		Set<Student> set = new HashSet<Student>();
		Student s1 = new Student(10010, "德玛", 18);
		Student s2 = new Student(10008, "蛮王", 13);
		Student s3 = new Student(10010, "德玛", 18);
		Student s4 = new Student(10053, "剑圣", 18);
		Student s5 = new Student(10001, "狗熊", 28);
		Student s6 = new Student(10021, "狗头", 48);
		Student s7 = new Student(10021, "狗头", 48);
		
		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);
		set.add(s6);
		set.add(s7);
		
		for (Student s : set) {
			System.out.println(s);
		}
	}
}

运行结果

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值