文章目录
本次文章就要开始真正进入到Java的核心部分了,集合是属于较难的部分,不仅难在不好理解,还有运用上,再加上这个东西的内容十分的多,体系也十分的庞大,需要花一段时间乃至更久来仔细学习,目前我会先从它的应用层面入手,关于底层实现原理 后期我们慢慢补上,由于最近我要准备考试可能会有拖更的情况,如果有疑问欢迎评论留言。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
深呼吸,然后开始干,熬到深夜两点半~~~
一、什么是集合
1、集合的概念
集合的概念:1、集合是Java API 所提供的一系列类,可以用于动态存放多个对象,集合只能存对象
2、集合与数组的不同:集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型,集合中不能存放基本数据类型,但是可以存放基本数据类型的包装类。
3、集合支持全部的泛型,是一种数据安全的用法。
2、集合的框架图(Collection部分)
说明:Collection是集合两大家族之一(另一个家族是Map,我打算留到明天去讲),也是今天我要讲的上半部分内容,由于内容繁多 我分为两次来讲解这个部分的内容。
Collection是家族的长老也是最顶层的掌权者,其中包含了他的子孙类和接口的所有方法,换句话说在Collection接口下所有的子接口和继承类所需要的方法最终都来自于Collection接口。此外,对于集合这个大家庭来说,还有容器工具类(Collections)其中提供了许多的静态方法并用来对集合进行操作(后面会提到一些),还有一个就是对象排序接口(Compareble与 Comparator)用于在集合中存储对象的时候,用于对象之间的比较,
Iterator(迭代器):主要用于遍历Collection接口及其子类而设计(当然如果个人爱好使用传统的for循环遍历也可以)
二、认识“List”与“Set”子接口
1、分析“List”与“Set”子接口
二者的区别:
1、List:有序的,有下标的,并且在操作的时候有专门的操作方法(迭代器,ListIterator),录入顺序与输出的顺序一致,可以重复存储相同的值。
2、Set:无序的,不能重复储存相同的值,注意:无序,并不代表随机,之所以取出的时候是无序的是因为元素在存入其中的时候是通过hash值和一些散列算法的计算后安插在一些新位置上的,所以说存入的时候位置就已经固定了 取出来的时候不一定是你初始化的时候的顺序
2、基本常用方法
1、添加— add(value) 2、删除— remove(二者删除的顺序有区别) 3、清空— clear()
4、查看元素个数(长度) — size() (这个方法区别于数组中的循环长度length) 5、 查看collection中是否有元素 — boolean isEmpty() 6、查看collection中是否包含指定元素 — boolean contains(Object obj);
…还有很多 我就不列举了 太多了 。。我之前发过的 API文档上面也有 哈哈 我就偷个懒吧。。
代码如下(示例):
3、“List”子接口的定义与使用
说明:List接口相比Collection接口的新增方法
1、public Object get(int index) 根据下标,返回列表中的元素
2、public Object add(int index,Object element); 在列表的指定位置插入指定元素将当前处于该位置的元素和所有或许元素向右移动
3、public Object set(int index,Object element); 用指定的元素替换列表中的指定位置的元素
4、public Object remove(int index);移除列表中指定位置的元素
注意:ArrayList相比数组的区别?容量的可扩展性,数据类型只要是Object类型就行,存储的必须是对象,不能存储基础数据类型。
(1)、ArrayList部分
代码如下(示例):
元素的添加
import java.util.ArrayList;
public class Test01{
public static void main(String [] args){
/**
*知识点:了解ArrayList
*可以看出,集合是可以装任意应用类型的数据
*/
ArrayList list =new ArrayList();
//添加元素
list.add("字符串");
list.add(100);//Integer.valueOf(100); 底层实现,实际上将值进行包装成Integer
list.add(123.123);//Double.valueOf(123.123);底层实现,实际上进行装箱操作成了Double包装类
//遍历
//说明:为什么要用Object 因为该ArrayList中存储了不同类型的应用数据 他们的父类都是Object
for (Object s:list) {
System.out.println(s);
}
}
}
基本操作
package net.yzy.knowledge.lesson30;
import java.util.ArrayList;
import java.util.List;
/**
* ArrayList 的一些基本能使用方式
*/
public class Test02 {
public static void main(String[] args) {
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
System.out.println("基本的添加及遍历操作:");
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//1 2 3
}
System.out.println();
System.out.println("------------------------------");
System.out.println("删除操作:");
list.remove(0);
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//2,3
}
System.out.println();
System.out.println("------------------------------");
System.out.println("修改操作:");
list.set(0,11);
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//11,2,3
}
}
}
(2)、LinkedList部分
LinkedList的基本操作与ArrayList差不多
package net.yzy.knowledge.lesson30;
import java.util.LinkedList;
import java.util.List;
/**
* ArrayList 的一些基本能使用方式
*/
public class Test02 {
public static void main(String[] args) {
List list=new LinkedList();
list.add(1);
list.add(2);
list.add(3);
System.out.println("基本的添加及遍历操作:");
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//1 2 3
}
System.out.println();
System.out.println("------------------------------");
System.out.println("删除操作:");
list.remove(0);
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//2,3
}
System.out.println();
System.out.println("------------------------------");
System.out.println("修改操作:");
list.set(0,11);
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");//11,2,3
}
}
}
删除的操作
public class Test02 {
public static void main(String[] args) {
/**
* 知识点:LinkedList 队列模式
*
* 特点:先进先出
*/
LinkedList<String> list = new LinkedList<>();
list.add("盖伦");
list.add("赵信");
list.add("李青");
list.add("泰隆");
list.add("瑞文");
while(!list.isEmpty()){
//删除第一个元素,并返回
String element = list.removeFirst();
System.out.println(element);
}
System.out.println("集合中元素的个数:" + list.size());
while(!list.isEmpty()){
//删除最后一个元素,并返回
String element = list.removeLast();
System.out.println(element);
}
System.out.println("集合中元素的个数:" + list.size());
}
}
4、“Set”子接口以及使用
这一部分相对于 List部分而言难度加大了一些,努力掌握吧
(1)“Set”知识点要求
需要掌握部分:
1、HashSet的存储特点,以及深入探究其存储原理
2、TreeSet的存储特点,及深入探究其存储原理
3、了解LinkedHashSet的特点
(2)、案例学习
HashSet方法:
import java.util.HashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
public class Test01 {
public static void main(String[] args) {
/**
* 知识点:使用HashSet方法
*
* 特点:去重+无序
*/
HashSet<String> set = new HashSet<>();
//添加元素
set.add("赵信");
set.add("李青");
set.add("泰隆");
set.add("瑞文");
set.add("塞恩");
//获取元素的个数
int size = set.size();
System.out.println("获取元素的个数:" + size);//5
HashSet<String> newSet1 = new HashSet<>();
Collections.addAll(newSet1, "aaa","bbb","ccc","盖伦");//利用集合工具类进行批量添加
set.addAll(newSet1);//将新集合中所有的元素添加到指定集合的末尾
//清空集合中所有的元素
//set.clear();
System.out.println("判断集合中是否包含某个元素:" + set.contains("李青"));//true
HashSet<String> newSet2 = new HashSet<>();
Collections.addAll(newSet2, "eee","ddd","fff","ggg");//利用集合工具类进行批量添加
System.out.println("判断集合中是否包含某个集合中所有元素:" + set.containsAll(newSet2));//false
boolean empty = set.isEmpty();//有元素-false 没有元素-true
System.out.println("判断集合中是否没有元素:" + empty);//false
//删除
set.remove("塞恩");//依据元素删除元素
//删除 - 去交集
HashSet<String> newSet3 = new HashSet<>();
Collections.addAll(newSet3, "fff","aaa","bbb","xxx");//利用集合工具类进行批量添加
set.removeAll(newSet3);
//保留交集
HashSet<String> newSet4 = new HashSet<>();
Collections.addAll(newSet4, "林成","卢永刚","泰隆","盖伦","李青","yyy");//利用集合工具类进行批量添加
set.retainAll(newSet4);
//将集合转换为数组
Object[] array = set.toArray();
System.out.println(Arrays.toString(array));
System.out.println("-------------");
//遍历 - foreach
for (String element : set) {
System.out.println(element);
}
System.out.println("-------------");
//遍历 - Iterator迭代器
Iterator<String> it = set.iterator();//获取Iterator迭代器对象
while(it.hasNext()){//判断是否有可迭代的元素
String e = it.next();//返回下一个元素
System.out.println(e);
}
}
}
LinkedHashSet方法
import java.util.LinkedHashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
public class Test01 {
public static void main(String[] args) {
/**
* 知识点:使用LinkedHashSet方法
*
* 特点:去重+有序
*/
LinkedHashSet<String> set = new LinkedHashSet<>();
//添加元素
set.add("泰隆");
set.add("塞恩");
set.add("李青");
set.add("赵信");
set.add("盖伦");
//获取元素的个数
int size = set.size();
System.out.println("获取元素的个数:" + size);//5
LinkedHashSet<String> newSet1 = new LinkedHashSet<>();
Collections.addAll(newSet1, "aaa","bbb","ccc","嘉文");//利用集合工具类进行批量添加
set.addAll(newSet1);//将新集合中所有的元素添加到指定集合的末尾
//清空集合中所有的元素
//set.clear();
System.out.println("判断集合中是否包含某个元素:" + set.contains("李青"));//true
LinkedHashSet<String> newSet2 = new LinkedHashSet<>();
Collections.addAll(newSet2, "eee","ddd","fff","ggg");//利用集合工具类进行批量添加
System.out.println("判断集合中是否包含某个集合中所有元素:" + set.containsAll(newSet2));//false
boolean empty = set.isEmpty();//有元素-false 没有元素-true
System.out.println("判断集合中是否没有元素:" + empty);//false
//删除
set.remove("塞恩");//依据元素删除元素
//删除 - 去交集
LinkedHashSet<String> newSet3 = new LinkedHashSet<>();
Collections.addAll(newSet3, "fff","aaa","bbb","xxx");//利用集合工具类进行批量添加
set.removeAll(newSet3);
//保留交集
LinkedHashSet<String> newSet4 = new LinkedHashSet<>();
Collections.addAll(newSet4, "林成","卢永刚","赵信","李青","塞恩","yyy");//利用集合工具类进行批量添加
set.retainAll(newSet4);
//将集合转换为数组
Object[] array = set.toArray();
System.out.println(Arrays.toString(array));
System.out.println("-------------");
//遍历 - foreach
for (String element : set) {
System.out.println(element);
}
System.out.println("-------------");
//遍历 - Iterator迭代器
Iterator<String> it = set.iterator();//获取Iterator迭代器对象
while(it.hasNext()){//判断是否有可迭代的元素
String e = it.next();//返回下一个元素
System.out.println(e);
}
}
}
总结
今天的主要内容如上,由于集合的内容十分的重要,在以后的面试中将近百分之七十的问题都会来自于集合,所以需要好好弄一下这部分知识明天我将会给大家分享集合的下半部分关于另一个大家族Map的内容,