Day15 集合、List

集合

能使程序储存与操作元素不固定的一组数据,位于java.util包中
如果集合中存放基本数据类型,要先转换成对应的包装类
Java的集合类主要由两个接口派生而出:Collection和Map。Collection和Map是Java结合框架的根接口,这两个接口又包含了一些子接口或实现类。
在这里插入图片描述
在这里插入图片描述
最常用的几个子接口和实现类:
Collection ——> List ——> ArrayList类
Collection ——> List ——> LinkedList类
Collection ——> Set ——> HashSet类
Collection ——> Set ——> SortedSet接口 ——> TreeSet类
Map ——> HashMap类
Map ——> SortedMap ——> TreeMap类

Collection

Collection接口是List接口和Set接口的父接口,它定义的方法可以用于操作List集合和Set集合。
在这里插入图片描述

Iterator : 迭代器

生成迭代器
Iterator it = 集合对象.iterator();
迭代器为了方便遍历,提供了三个方法

  1. boolean hasNext() : 判断光标的下一位是不是还有元素,有就是true,没有就是false
  2. E next() : 将迭代器光标向下移动一位,并取出该元素 Element
  3. remove() : 删除当前指向的元素

迭代器一旦创建,集合不能进行添加和删除操作,如果 添加或删除了.必须重新生成迭代器
增强for循环 forEach 就是为了让iterator循环访问的形式简单,写起来方便,但是也是不能进行添加和删除的
使用普通的for和while是可以进行添加删除的,这种遍历还是和数据结构存储相关的,删除和添加时会影响集合的size
使用contains和remove的时候 如果是自定义类型,需要根据需求覆写equals方法
因为这两个方法底层都会去自动调用对象的 equals方法来进行对象的比较

		Iterator it = x.iterator();
		x.add(5);
		// 如果添加或删除了集合中的数据,则迭代器需要重新生成
		// it.next();
		it = x.iterator();
		
		// 判断还有没有数据,有就执行
		while(it.hasNext()){
			// 光标向下移动一位,并取出数据
			Object e = it.next();
			System.out.println(e);
			// 删除当前指向的元素(必须使用迭代器的删除,否则报错)
			it.remove();
		}
		System.out.println(x);
		// false 因为已经移动到最后了,此时想要继续使用必须重新生成
		System.out.println(it.hasNext());

List

有序,可重复
有指定下标,添加顺序和取出顺序一致

ArrayList : 底层是个Object[] 数组,随机查询效率高,随机删除效率低,默认初始化时10,扩大之后是原来的1.5倍,并且是第一次添加数据的时候进行默认长度设置,只new的时候,不添加数据,则长度为0, 等于是 Object[] elementData= {}; 长度为0
LinkedList : 底层是双向链表,随机查询效率低,随机删除效率高
Vector : 已经过时,属于线程安全,而ArrayList是Vector的升级版 , 默认初始化是10,扩大之后是原来的2倍

// 利用Arrays的asList 可以直接把数组转换为集合
		Collection c2 = Arrays.asList(arr);
				// 转换为数组,无参,返回新数组
		Object[] objArr = c1.toArray();
		// 利用有参方式,也能转换为数组,返回值为传入的数组引用
		Object[] objArr2 = new Object[ c1.size() ];
		// 由于是传引用 所以不用接收返回值
		c1.toArray(objArr2);

底层链表

节点类
在这里插入图片描述
添加
在这里插入图片描述
获取
在这里插入图片描述
在这里插入图片描述
删除
在这里插入图片描述
集合常用方法

System.out.println(c1.size());
		System.out.println(c1.isEmpty());
		// 判断是否存在, 会调用判断元素的equals方法,挨个和集合中的每个元素进行比较
		System.out.println(c1.contains(new Integer(1)));
		// 根据内容删除元素,用要删除的元素对象调用equals方法,挨个和集合中的元素进行比较
		// 如果找到 就删除,并返回true, 如果未找到 就return false
		c1.remove(1);
		// [1,2,3,4,5.....]
		System.out.println(c1);

		// 通过上面代码和看底层实现得知,会调用判断/删除对象的equals进行比较
		// 所以 当我们操作的是自定义类型的时候,就需要根据需求自己覆写equals方法
		// 如果使用的是Integer/String等对应的包装类的时候,则不需要,因为人家覆写了equals方法
		Student s1 = new Student(1, "张三", 18);
		Student s2 = new Student(1, "张三", 18);
		c1.add(s1);
		System.out.println(c1);
		System.out.println(c1.contains(s1));
		System.out.println(c1.contains(s2));
		System.out.println(c1.remove(s2));
		System.out.println(c1);
		
		// 清空集合
		c1.clear();
		System.out.println(c1);
		System.out.println(c1.size());
		System.out.println(c1.isEmpty());
		
		c1.add("张三");
		
		Object[] arr = {1,2,3,4};
		// 利用Arrays的asList 可以直接把数组转换为集合
		Collection c2 = Arrays.asList(arr);
		// 把 c2集合中元素,全部添加到c1中
		c1.addAll(c2);
		System.out.println(c1);
		
		// 转换为数组,无参,返回新数组
		Object[] objArr = c1.toArray();
		// 利用有参方式,也能转换为数组,返回值为传入的数组引用
		Object[] objArr2 = new Object[ c1.size() ];
		// 由于是传引用 所以不用接收返回值
		c1.toArray(objArr2);
List想要排序可以调用Collections中sort方法
 * 		前提是 保存的元素,必须 接口
 * 
 *  包装类 , 字符串类 , 时间类 都实现了该接口,所以可以直接进行排序
 *  		数字  : 从小到大
 *  		字符串 : ASCII码值
 *  		日期 : 昨天,今天,明天  自然日期
 *  
 *  自定义类 或者想要更改String等默认排序方式,都需要重新定义排序规则
LinkedList linkedList = new LinkedList();
		// 尾部添加 true
		linkedList.add(1);
		// 尾部添加 void
		linkedList.addLast(2);
		// 插入指定位置
		linkedList.add(0,2);
		// 首部添加 void
		linkedList.addFirst(2);
		// 首部添加 void
		linkedList.push(3);
		// 尾部添加 true
		linkedList.offer(22);
		// 首部添加 true
		linkedList.offerFirst(1);
		// 尾部添加 true
		linkedList.offerLast(4);
		
		// 本质就是在调用两个方法 : linkLast 和 linkFirst
		// 根据下标获取
		System.out.println(linkedList.get(0));
		System.out.println(linkedList.get(0));
		// 获取首元素
		System.out.println(linkedList.getFirst());
		// 获取尾元素
		System.out.println(linkedList.getLast());
		// 删除第一个元素,并返回该元素
		linkedList.pop();
		// 删除最后一个元素,并返回该元素
		linkedList.poll();
		// remove重载  int是根据索引删除, Object 是根据内容删除
		linkedList.remove(1);
		linkedList.remove(  new Integer(22) );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值