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才是根据下标获取
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)