编程语言
首页 > 编程语言> > 2022.01.19_Java学习总结_集合_2

2022.01.19_Java学习总结_集合_2

作者:互联网

1. 集合

1.1 概述
1.2 继承体系
1.3 Collection
1.3.1 常用方法
1.3.2 使用方式
1.3.3 Iterator
1.3.4 注意
1.4 forEach

1.5 List

1.5.1 ArrayList

1.5.2 LinkedList

1.5.2.1 基本使用

在这里插入图片描述

 * LinkedList : 底层是一个双向链表,因为不是连续存储,
 * 
 * 只是能够找到下一个元素的地址而已,所以进行添加和删除操作效率较高
 * 
 * 但是 查询效率较低,因为只能从第一个挨个找

		LinkedList list = new LinkedList();
		// ArrayList list = new ArrayList();
		// 添加 到尾部
		list.add(1);
		list.add(11);
		list.add(12);
		list.add(13);
		// 添加到指定位置
		// list.add(index, element);
		// 添加到头部
		// list.push(e);
		// list.addFirst(e);
		// 尾部添加
		// list.addLast(e);
		// 个数
		System.out.println(list.size());
		// 是否为空
		System.out.println(list.isEmpty());
		// 根据下标删除
		list.remove(0);
		// 根据数据删除
		list.remove(new Integer(11));
		// 清空
		list.clear();
		// 更改
		list.set(2, 111);
		// 获取
		list.get(2);
		// 遍历
		for (Object object : list) {

		}
	

1.5.2.2 底层实现

1.5.2.2.1 节点类
链表由节点构成,因为是双向链表,所以节点中有三个属性
1 保存的数据 Object
2 下一个节点对象  节点类型
3 上一个节点对象  节点类型

在这里插入图片描述

1.5.2.2.2 LinkedList类

在这里插入图片描述

为了首尾添加效率更高,在LinkedList类中保存了首节点和尾结点
1.5.2.2.3 添加-add

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5.2.2.4 获取-get

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获取数据
在这里插入图片描述

Get方法只是模拟下标获取的方式而已,本质上就是遍历操作
只不过做了一定的判断,判断找前半截快还是找后半截快

1.6 Set和排序

 * Set特性 无序且不可重复,无序指的是添加顺序和取出顺序不保证一致
 * 
 * HashSet :  底层是散列表
 * 
 * TreeSet : 底层是红黑树,添加的元素必须按照一定的格式进行排序
 * 		数字 : 默认从小到大
 * 		字符串 : 按每位ASCII码进行排序
 * 		日期 : 自然日期,昨天今天明天...

1.6.1 TreeSet


		// 创建对象
		TreeSet set = new TreeSet();
		// 添加
		set.add(1);
		set.add(2);
		// 因为treeSet必须保证元素有序,也就意味着元素类型必须统一
		// 不统一就没有可比性,就不能排序
		// set.add("xxx");
		set.add(22);
		set.add(12);
		set.add(24);
		// 不可重复,如果重复则不添加
		set.add(12);
		System.out.println(set.size());
		System.out.println(set);
		// 根据内容删除, 不能根据索引删除,因为没有索引
		set.remove(22);
		// 遍历
		for (Object object : set) {
			System.out.println(object);
		}
		
		set = new TreeSet();
		// 每一位ASCII进行比较
		set.add("aadddd");
		set.add("aa");
		set.add("acadas");
		set.add("caa");
		set.add("d");
		// a,aa,aadddd,acadas,caa,d
		System.out.println(set);
		
		set = new TreeSet();
		set.add("1");
		set.add("2");
		set.add("3");
		set.add("4");
		set.add("5");
		set.add("6");
		set.add("7");
		set.add("8");
		set.add("9");
		set.add("10");
		// [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
		System.out.println(set);
	

1.6.2 Comparable

 *  使用TreeSet的时候,元素必须实现了Comparable接口,因为在添加的时候,会自动调用该接口的compareTo方法进行比较
 *		添加字符串,数字,日期的时候,会进行自动排序,是因为Integer,String,Date都实现了该接口和该方法
 *	如果我们要存储自定类型的时候,就需要让该类去实现对应的接口和方法才能进行存储

在这里插入图片描述

因为 User没有实现对应的Comparable接口,所以在使用TreeSet的时候,会报错
class User implements Comparable{
	@Override
	public int compareTo(Object o) {
		// this是要添加的元素
		// o是集合中的元素
		if (o instanceof User) {
			User u = (User) o;
			// 升序
			// return this.age - u.age;
			// 降序
			return u.age - this.age;
		}
		// 该方法 返回 0 说明重复,不添加
		// 返回 大于0的值 说明要添加的元素比集合中的大,就往后放
		// 返回 小于0的值 说明要添加的元素比集合中的元素小,就往前放
		return -1;
	}
	int age;
}

1.6.3 Comparator

 * Comparator 也是比较器类 Comparable 也是做比较的 , 如果这两个同时存在,则Comparator优先级高
 * 
 * Comparable : 如果treeSet中保存我们自己定义的类型的时候,使用Comparable
 * 
 * Comparator : 如果treeSet中保存的不是我们写的类型的时候,就要使用Comparator来指定排序规则
 * 		比如 Integer 默认是升序排序,假如我们需要降序排序,我们只能使用 Comparator,因为我们不可能去更改Integer的源码
 * 		但此时 Integer中是有Comparable接口的实现的,等于两个比较都存在,但是Comparator优先级高,
 * 		所以会按照我们定义的规则进行排序
 * 		开闭原则 : 对修改关闭,对扩展开发
public class Collection_06_Comparator {
	public static void main(String[] args) {
		// 把比较器类的对象传入
		TreeSet set = new TreeSet(new A());
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		System.out.println(set);
	}
}
// 比较器类
class A implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		// o1 是要添加的元素
		// o2 是集合中的元素
		Integer i1 = (Integer) o1;
		Integer i2 = (Integer) o2;
		// 该方法 返回 0 说明重复,不添加
		// 返回 大于0的值 说明要添加的元素比集合中的大,就往后放
		// 返回 小于0的值 说明要添加的元素比集合中的元素小,就往前放
		return i2-i1;
	}
	
}

	public static void main(String[] args) {
		// 把比较器类的对象传入
//		TreeSet set = new TreeSet(new A());
		// 匿名内部类写法
		TreeSet set = new TreeSet(new Comparator () {
			@Override
			public int compare(Object o1, Object o2) {
				// o1 是要添加的元素
				// o2 是集合中的元素
				Integer i1 = (Integer) o1;
				Integer i2 = (Integer) o2;
				// 该方法 返回 0 说明重复,不添加
				// 返回 大于0的值 说明要添加的元素比集合中的大,就往后放
				// 返回 小于0的值 说明要添加的元素比集合中的元素小,就往前放
				return i2-i1;
			}
		});
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		System.out.println(set);
	}

1.6.4 List排序


		List list = new ArrayList();
		list.add(1);
		list.add(22);
		list.add(3);
		list.add(11);
		// 该方法会调用对象的Comparable中的compareTo方法或者是Comparator接口中的方法
		// 因为Integer中有compareTo方法,而且是升序,所以才可以使用sort方法
		// 比如想要降序可以使用sort方法重载
		// Collections.sort(list);
		Collections.sort(list, new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				// o1 是要添加的元素
				// o2 是集合中的元素
				Integer i1 = (Integer) o1;
				Integer i2 = (Integer) o2;
				// 该方法 返回 0 说明重复,不添加
				// 返回 大于0的值 说明要添加的元素比集合中的大,就往后放
				// 返回 小于0的值 说明要添加的元素比集合中的元素小,就往前放
				return i2 - i1;
			}
		});
		System.out.println(list);

1.6.5 总结

 * Comparable : 如果treeSet中保存我们自己定义的类型的时候,使用Comparable
 * 
 * Comparator : 如果treeSet中保存的不是我们写的类型的时候,就要使用Comparator来指定排序规则
 * 		比如 Integer 默认是升序排序,假如我们需要降序排序,我们只能使用 Comparator,因为我们不可能去更改Integer的源码
 * 		但此时 Integer中是有Comparable接口的实现的,等于两个比较都存在,但是Comparator优先级高,
 * 		所以会按照我们定义的规则进行排序
 * 		开闭原则 : 对修改关闭,对扩展开发
 * 

标签:set,Java,Comparator,19,list,add,添加,Integer,2022.01
来源: https://blog.csdn.net/m0_46552030/article/details/122588666