第十七章 集合上(接口和实现类)

一、集合

容器

1.变量
2.数组的特点

  1. 空间是连续的(一个空间挨着一个空间);
  2. 长度固定;
  3. 可以存储基本数据类型和引用数据类型;

3.集合的特点:

  1. 存储引用数据类型;
  2. 容量可变长(自动的扩容);

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

集合是一些接口,一些实现类。

1.Collection(单例存储)

Collection接口: 它是一个(集合)父接口,可以存储重复的数据,本身没有顺序(具有通用的一些功能);

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class TestCollection {
	public static void main(String[] args) {
		/**		Collection接口: (导包:import java.util.Collection;;)
		 * 		ArrayList实现类:(导包:import java.util.ArrayList;)
		 * 		Collection接口:不能直接创建对象,可以引用实现类对象(多态)
		 * 		集合只能用泛型去约束容器存储的内容
		 */
//创建Collection集合:c
		Collection<String> c = new ArrayList<>();//实现类独特的功能不能使用;
		//向集合容器添加元素 ,添加成功true
		c.add("aa");
		c.add("bb");
		c.add("cc");
		System.out.println(c);//[aa, bb, cc]
//1.查看集合是否为空(空是true)
		System.out.println(c.isEmpty());//false
//2.返回集合中元素的个数
		System.out.println(c.size());//3
		//新的集合:c1
		Collection<String> c1 = new ArrayList<>();
		c1.add("dd");
		c1.add("ee");
		c1.add("ff");
		System.out.println(c1);//[dd, ee, ff]
//3.把参数集合中的所有元素 添加到当前集合c中 只要当前集合发生了改变返回true
		c.addAll(c1);
		System.out.println(c);//[aa, bb, cc, dd, ee, ff]
//4.把参数元素(对象)从当前集合中移除  只要当前集合发生了改变返回true
		c.remove("cc");
		System.out.println(c);//[aa, bb, dd, ee, ff]
//5.把参数集合中的所有元素 从当前集合c中移除掉
		//c.removeAll(c1);
		//System.out.println(c);//[aa, bb]
//6.把不在参数集合中的所有元素,从当前集合中移除掉
		c.retainAll(c1);
		System.out.println(c);//[dd, ee, ff]
//7.参数对象在当前集合中是否包含
		System.out.println(c.contains("ee"));//true
//8.参数集合的所有元素在当前集合中是否包含
		System.out.println(c.containsAll(c1));//true
//9.集合转数组
		Object [] o = c.toArray();//将集合转换成了Object类型的数组
		o = c.toArray(new Object [0]);//将集合中的元素存在数组里
		//保留类型
		String [] str = c.toArray(new String[0]);
		/* stream:
		 * forEach:输出
		 * System.out::printlnforEach:Lambda表达式
		 */
		Arrays.stream(o).forEach(System.out::println);//将Object数组中的元素输出
//10.清空集合
		c.clear();
		System.out.println(c.size());//0
		System.out.println(c.isEmpty());//true
	}
}

2.List线性表

List: 线性表(具有独特的一些方法),可以存储重复的数据,有顺序(线性排列的);

import java.util.ArrayList;
import java.util.List;
public class TestList {
	public static void main(String[] args) {
		/**		List接口:      (导包:import java.util.List;)
		 * 		ArrayList实现类:(导包:import java.util.ArrayList;)
		 * 		List接口:它是Collection的子接口(具备自己特有的功能)
		 * 		List:线性表。线性表是一种数据结构
		 * 		数据结构(数据之间的关系,数据的组织形式)
		 * 		线性表:一个由很多相同特性的元素组成的,有序的序列
		 * 			     一个元素连接下一个元素
		 * 		List:有位置,有索引
		 */
//List方法
	//创建List集合:list
		List<String> list = new ArrayList<>();
		list.add("aa");//位置索引0
		list.add("bb");//位置索引1
		list.add("cc");//位置索引2
//1.把一个元素添加到指定的索引位置  add(index,element)
		list.add(1, "hello");
		System.out.println(list);//[aa, hello, bb, cc]
//2.获得参数索引位置的元素
		System.out.println(list.get(1));//hello
//3.把指定索引位置的元素改为指定元素
		list.set(1, "tom");
		System.out.println(list);//[aa, tom, bb, cc]
		//--------------
		list.add("cc");
		list.add("cc");
		System.out.println(list);//[aa, tom, bb, cc, cc, cc]
//4.获得参数元素在集合中第一次出现的位置索引
		System.out.println(list.indexOf("cc"));//3
//5.获得参数元素在集合中最后一次出现的位置索引
		System.out.println(list.lastIndexOf("cc"));//5
//6.取子集【起始位置,终止位置)
		System.out.println(list.subList(1, 3));
//7.集合排序
		//升序
		//null 意思是没有指定Comparator,会按照Comparable自然排序
		list.sort(null);
		System.out.println(list);//[aa, bb, cc, cc, cc, tom](阿斯克码值)
		//降序(自己定义顺序)
		list.sort((s1,s2)->{return s2.compareTo(s1);});
		System.out.println(list);//[tom, cc, cc, cc, bb, aa]
	}
}

3.集合遍历

3.1 Iterator迭代器

作用: 遍历集合中的各种容器
Iterator迭代器: 通常用来遍历Collection接口,子接口,和实现类的
Collection集合的遍历方式

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TestCollection_Iterator {
	public static void main(String[] args) {
		/**		最通用的:Collection集合的遍历方式
		 * 		不同的集合遍历的方式不一样
		 * 		Iterator是一个<泛型>接口
		 * 		Iterator迭代器:就是对集合中的元素进行迭代的,进行遍历的,进行循环的
		 * 		适合Collection集合的遍历
		 */
 //创建Collection集合:c
		Collection<String> c = new ArrayList<>();
		c.add("aa");
		c.add("bb");
		c.add("cc");
		//不叫遍历,只是输出了集合元素的名称,它会自动调用toString方法,然后重写了toString,所展示的信息
		System.out.println(c);//[aa, bb, cc]
//遍历数组元素 (Collection没有顺序,没有分配索引)--------------
	//1.循环增强for是用来遍历集合和数组的 
		for (String s:c) {
			System.out.println(s);
		}
	//2.这里的forEach属于集合对象Collection的方法(是最简单的方式)
		c.forEach(System.out::println);
	//3.这里的forEach属于sream流接口的方法
		c.stream().forEach(System.out::println);
		System.out.println("-----------------------");
	//4.Iterator迭代器
		//获得了一个迭代器对象(i作为迭代器)
		//创建了迭代器之后,迭代器的指针在第一个元素前面
		Iterator<String> i = c.iterator();//不同的集合对象可以调用iterator();方法来去获得一个迭代器对象
		//System.out.println(i.next());//aa 获得迭代器指针后面的下一个元素(迭代器指针在第一个元素后面,第二个元素前面)
		//System.out.println(i.next());//bb
		//i.remove();//删除最近一次next访问的元素
		//System.out.println(c);//[aa, cc]
		while (i.hasNext()) {//i.hasNext()集合中是否存在下一个元素
			System.out.println(i.next());
		}
	//5.Iterator迭代器的forEachRemaining方法遍历
		Iterator<String> i1 = c.iterator();//新建了一个迭代器指针i1
		i1.forEachRemaining(System.out::println);
	}
}

List集合的遍历方式

3.2 ListIterator子迭代器

ListIterator迭代器:专门遍历List集合的
List集合的遍历方式

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class TestList_Iterator {
	public static void main(String[] args) {
		//创建List集合
		List<String> list = new ArrayList<>();
		list.add("aa");
		list.add("bb");
		list.add("cc");
		//List遍历(有顺序,有位置,有索引)---------------------
		//1.普通for
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		//2.ListIterator迭代器(只针对List集合)
		//向下迭代,并且添加元素
		//获得ListIterator的一个对象
		System.out.println("--------------");
		ListIterator<String> i1 = list.listIterator();
		while (i1.hasNext()) {
			System.out.println(i1.next());
			i1.add("hello");
		}
		//向上迭代
		while (i1.hasPrevious()) {
			System.out.println(i1.previous());
		}
	}
}

二、线性表的底层技术

1. 数组:

         ArrayList: 线程非安全的,性能好。(扩容:1.5倍扩容)
         Vector: 线程安全的,性能低。(扩容:2倍扩容)现在已经被淘汰了

2. 链表:

         LinkedList: 一些非连续的节点,组成的存储结构

分类
       单向链表:(节点只有一个链域的)
                单项非循环:【节点:1个值域(存数据)|一个链域(存地址)】
                单项    循环:
在这里插入图片描述
       双向链表:(节点有两个链域的)
                双项非循环:
                双项    循环:
在这里插入图片描述

3. 数组和链表的差别:

ArrayList 和 LinkedList 的区别:
ArrayList:遍历或随机访问,效率高。
LinkedList:遍历或随机访问,效率低。
ArrayList:插入元素或删除元素,效率低。
LinkedList:插入元素或删除元素,效率高。

三、Collections

Collections:集合工具类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestCollections {
	public static void main(String[] args) {
		//创建List集合:list
		List<Integer> list = new ArrayList<>();
		//向集合中添加多个元素:Collection
		Collections.addAll(list, 22,11,33);
		System.out.println(list);//[22, 11, 33]
		//1.自然升序排序Comparble
		Collections.sort(list);
		System.out.println(list);//[11, 22, 33]
		//2.自定义排序,针对List,Comparator
		//Collections.sort(list, (n1,n2)->{return n2-n1;});
		//System.out.println(list);//[33, 22, 11]
		//3.二分查找法(前提:生序排序)
		System.out.println(Collections.binarySearch(list, 22));//1(规则和数组一样)
		//4.返回集合中的 最大元素Collection
		System.out.println(Collections.max(list));//33
		//5.返回集合中的 最小元素Collection
		System.out.println(Collections.min(list));//11
		//6.反转集合中的元素
		Collections.reverse(list);
		System.out.println(list);//[33, 22, 11]
		//7.返回某一个元素在集合中出现的次数
		System.out.println(Collections.frequency(list, 33));//1次
		list.add(33);
		list.add(33);
		System.out.println(list);//[33, 22, 11, 33, 33]
		System.out.println(Collections.frequency(list, 33));//3次
		//8.用第二个参数替换掉集合中的所有元素
		Collections.fill(list, 999);
		System.out.println(list);//[999, 999, 999, 999, 999]
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值