1 概述
Java集合是使程序能够存储和操纵元素不固定的一组数据。 所有Java集合类都位于java.util包中。
【问】:之前我们需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供Java集合工具类呢?? 我们通过对比数组和Java集合工具类来解释Java集合工具类的必要性。
数组 | 集合 | 长度固定 | 长度不固定 | 存放任意类型 | 不能存放基本数据类型,只能存放对象的引用 |
注意:如果集合中存放基本类型,一定要将其 “装箱”成对应的”基本类型包装类”。
2 Collection
2.1 继承体系
Java的集合类主要由两个接口派生而出:Collection和Map。Collection和Map是Java结合框架的根接口,这两个接口又包含了一些子接口或实现类。
层次结构如图所示
Java集合类有清晰的继承关系,有很多子接口和实现类。但是,并不是所有子接口或实现类都是最常用的。
下面我们列举出最常用的几个子接口和实现类:
Collection ——> List ——> ArrayList类
Collection ——> List ——> LinkedList类
Collection ——> Set ——> HashSet类
Collection ——> Set ——> SortedSet接口 ——> TreeSet类
Map ——> HashMap类
Map ——> SortedMap ——> TreeMap类
?2.2 常用方法
?2.3 使用方法
?代码实现?? ?
? ? ? ? ?// 创建集合对象 ?? ??? ?Collection c1 = new ArrayList<>(); ?? ??? ?// 判断是否为空,即个数是否为0 ?? ??? ?System.out.println(c1.isEmpty()); ?? ??? ?// 集合中是不能保存基本类型的,需要转换为对应的包装类才可以 ?? ??? ?// 这里会进行自动装箱为Integer类型,然后发生多态转型为Object类型进行存储 ?? ??? ?c1.add(123); ?? ??? ?c1.add(new Integer(1)); ?? ??? ?c1.add(new Collection_01()); ?? ??? ?// 个数 ?? ??? ?System.out.println(c1.size()); ?? ??? ?System.out.println(c1.isEmpty()); ?? ??? ?// 删除,会调用要删除的元素的equals方法,但是Integer覆写了,所以可以把1删除掉 ?? ??? ?c1.remove(1); ?? ??? ?A a = new A("张三"); ?? ??? ?A a1 = new A("张三"); ?? ??? ?c1.add(a); ?? ??? ?// 所以使用集合保存自定义类型的时候,要注意是否要覆写equals方法,定义怎么算相等 ?? ??? ?c1.remove(a1); ?? ??? ?// 把集合转换为数组 ?? ??? ?Object[] arr = c1.toArray(); ?? ??? ?for (Object object : arr) { ?? ??? ??? ?System.out.println(object); ?? ??? ?} ?? ??? ?// 清空集合 ?? ??? ?c1.clear(); ?? ??? ?System.out.println(c1.size());
2.4 注意Contains和Remove
Contains(数据) : 判断集合中是否包含某个元素
Remove(数据 ) : 删除指定元素
两个方法底层都会自动调用该对象的equals方法
因为不管是判断是否包含还是删除,都要先找到这个数据,而找到只能比较
但是集合中保存的都是引用类型,所以比较只能使用equals方法
所以如果存储的是自定义类型,就要考虑equals方法的覆写问题
3 Integer
3.1 概述
?在面向对象的编程中,迭代器模式是一种设计模式,是一种最简单也最常见的设计模式 ?* 它可以让用户透过特定的接口寻访容器中的每一个元素,而不用了解底层的实现 ?* 获取该集合的迭代器对象 ?* Iterator it=集合对象.iterator(); ?* ? ? ? ? ? ? ? 三个方法: ?* ? ? ? ? ? ? ? ? ? ? ? 1 boolean hasNext():判断下面有没有元素,如果有就返回true,没有就返回false ?* ? ? ? ? ? ? ? ? ? ? ? 2 E next():获取下一个元素,并指向下一个元素 ?* ? ? ? ? ? ? ? ? ? ? ? 3 remove(): 删除当前指向的元素 ?* ? ? ? ? ? ? ?三个方法的使用步骤就是1,2,3,按照这个顺序调用 ?* ? 注意 : 迭代器一旦创建,集合中就不能添加和删除元素(长度就不能更改了) ?* ? ? ? ? ? ?如果添加或者删除了元素,那么迭代器必须重新生成 ?* ? 增强for循环:就是为了让用iterator循环访问的方式简单,写起来更方便,当然功能不太全,比如删除时还是要用iterator来删除
?3.2 常用方法
?3.3 使用方法
代码实现?? ?
? ? ? ? Collection c1=new LinkedList(); ?? ??? ?c1.add(1); ?? ??? ?c1.add("abc"); ?? ??? ?//判断是否包含 ?? ??? ?System.out.println(c1.contains(1)); ?? ??? ?//1 创建迭代器 ?? ??? ?Iterator it=c1.iterator(); ?? ??? ?//遍历 ?判断下面是否有元素 ?? ??? ?while(it.hasNext()){ ?? ??? ??? ?//获取并指向下一个元素 ?? ??? ??? ?Object obj=it.next(); ?? ??? ??? ?System.out.println(obj); ?? ??? ?} ?? ??? ?//使用完之后想要再次使用需要重新创建 ?? ??? ?it=c1.iterator(); ?? ??? ?//迭代器创建之后不能添加和删除,必须重新生成迭代器 ?? ??? ?c1.add(2); ?? ??? ?c1.add(3); ?? ??? ?c1.remove(1); ?? ??? ?it=c1.iterator(); ?? ??? ?while (it.hasNext()) { ?? ??? ??? ?//获取并指向下一个元素 ?? ??? ??? ?Object obj=it.next(); ?? ??? ??? ?System.out.println(obj); ?? ??? ??? ?//使用迭代器的时候不能更改集合个数,所以删除数据的时候不能使用集合的删除,应该使用迭代器的删除 ?? ??? ??? ?//c1.remove(obj); ?? ??? ??? ?it.remove(); ?? ??? ?} ?? ??? ?System.out.println(c1.size()+"-----");
4 List
4.1 概述
?* List特点: 有序,可重复 ?* ? ? ? ? ? ? ? 有序: 添加顺序和取出顺序是一致的 ?* ? ? ? ? ? ? ? 可重复: 就是可以有重复的数据 ?* ArrayList: 底层是个Object数组,随机查询和更改效率高,但随机添加和删除效率低 ?* LinkedList: 底层是一个双向链表,随机查询更该效率低,但随机添加和删除效率高
4.2 ArrayList
4.2.1概述
? ?ArrayList底层是数组,下标从0开始 ?* ? ? ? ? ? ? ? ? 默认初始化容量为10,扩大容量为原始容量的1.5倍 ?* ? ? ? ? ? ? ? ? 并且默认容量是第一次添加数据的时候设置的 ?* ? ? ? ? ? ?也就是说,我们new ArrayList()的时候,数组长度是为0的 ?* ? ? ? ? ? ? ? ? 1.5倍: 长度+长度>>1 ? ?
? ? ? ?
?4.2.2基本使用
? ? ? ? //创建对象 ?? ??? ?//Vector已经过时了,ArrayList是Vector的升级版,Vector是线程安全,而ArrayList是非线程安全 ?? ??? ?List list=new ArrayList(); ?? ??? ?list.add(100); ?? ??? ?list.add(123); ?? ??? ?//[100,123]覆写了toString方法 ?? ??? ?System.out.println(list);
4.2.3 常用方法
? ? ? ? ?//add(E e): 尾部添加 ?? ??? ?//add(int index,E e): 添加到指定位置 ?? ??? ?//set(int index,E e): 更改指定位置上的元素值 ?? ??? ?//remove(Object object): 根据元素内容删除 ?? ??? ?//remove(int index): 根据索引删除 ?? ??? ?//get(int index): 获取指定位置的数据?
4.2.4 遍历
? ? 代码实现? ??
? ? ? ? ?//传统for遍历 ?? ??? ?for (int i = 0; i < list.size(); i++) { ?? ??? ??? ?System.out.println(list.get(i)); ?? ??? ?} ?? ??? ?//foreach遍历 ?? ??? ?for (Object object:list) { ?? ??? ??? ?System.out.println(object); ?? ??? ?} ?? ??? ?//迭代器遍历 ?? ??? ?Iterator it=list.iterator(); ?? ??? ?while(it.hasNext()){ ?? ??? ??? ?System.out.println(it.next());
4.3 LinkedList
?4.3.1 基本使用及方法
? ? 和 ArrayList操作 一样
4.3.2 底层实现
4.3.2.1 Node节点类
?链表: 保存的都是节点,每个节点都有三个属性,分别是:?添加的数据,上一个节点引用,下一个节点引用
?4.3.2.2LinkedList类
?4.3.2.3 add方法实现
?
?4.3.2.4 Get方法实现
?
?
?获取数据
Get方法 只是模拟了下标获取数据的方式,本质就是遍历,从头挨个去找
所以这可以理解为 并不是下标,只是决定了循环次数
而 ArrayList的get才是根据下标获取
?
?
|