前言:
集合啦!!!
在介绍集合之前,先来想一下为什么会出现集合呢?嘻嘻,揣摩一下设计者的意图,根据生活中的经验,
不难得出,新事物的出现必然是旧的事物无法满足现有的需求,所以,新事物应运而生。
那在集合面前,旧的事物是什么呢?
想一下,我们之前存储一些学生的成绩是怎么存储的,数组,但是如果要存储的类型中有不同的类型呢?
比如: String,int,char,对象Person,如果是学过 C++ 的小伙伴一定可能会说 用 struct 结构体
来存储,段位搞点的可能会想到用 C++ STL 库中的东西,学过 Python 的小伙伴可能会想到 List,
元组,and so on...................
总而言之,言而总之,用数组是实现不了的,所以在 Java 里面就有了 Collection,List,Set,
Map(之后会有专门的文章进行介绍)。
集合之间的关系:
从上图可以看到, Collection 是 List 和 Set 的 父接口, List 和 Set 是 Collection 的子
接口,同时 ArrayList 和 LinkedList 是 List 与 Collection 的实现方法,同理, HashSet 和
TreeSet 是 Set 和 Collecion 的实现方法。
Collection 的常用方法:
代码实现进行检测:
package collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test01 {
public static void main(String[] args) {
// 多态的体现,接口不能被实例化,所以通过其实现类进行实现
Collection coll = new ArrayList();
// add()方法中的参数类型是 Object,向集合中添加一个元素
coll.add("a");
coll.add("b");
coll.add("c");
System.out.println(coll);
// 清除集合中的所有元素
coll.clear();
System.out.println(coll);
// 将三个学生对象放到 集合中
Student student1 = new Student();
student1.setName("张三");
student1.setAge(23);
Student student2 = new Student();
student2.setName("李四");
student2.setAge(96);
Student student3 = new Student();
student3.setName("王五");
student3.setAge(78);
// 向集合中添加 3 个对象
coll.add(student1);
coll.add(student2);
coll.add(student3);
// 如果不重写 Student 类中的 toString() 方法,调用默认的 toString() 方法时输出的是内存地址
System.out.println(coll);
// size() 输出集合中真实数据的个数
System.out.println(coll.size());
// addAll() : 将一个集合添加到另一个集合中
Collection coll1 = new ArrayList();
coll1.add("a");
coll1.add("b");
Collection coll2 = new ArrayList();
coll2.add("123");
coll2.add("456");
coll1.addAll(coll2);
System.out.println(coll1);
// 结果:[a, b, 123, 456]
// contains(Object e) : 查询集合中是否存在 一个 对象
System.out.println(coll.contains("a"));
System.out.println(coll.contains(student1));
System.out.println("---------------------------");
// containsAll() : 看一个集合中是否包含另一个集合
System.out.println(coll1.containsAll(coll2));
System.out.println(coll2.containsAll(coll1));
System.out.println("---------------------------");
coll.clear();
// isEmpty() 判断某个集合是否为 空
System.out.println(coll.isEmpty());
System.out.println(coll1.isEmpty());
System.out.println("---------------------------");
// 迭代器 -- 常常用于遍历
Iterator iterator = coll1.iterator();
// hasNext() : 判断下一个值是否为 空
while(iterator.hasNext()){
// iterator.next() : 取到下一个值
System.out.println(iterator.next());
}
System.out.println("---------------------------");
// remove() : 删除集合中 指定的对象
System.out.println("未删除前" + coll1);
coll1.remove("a");
System.out.println("删除后:" + coll1);
System.out.println("---------------------------");
// 删除一个集合中 另一个集合中的所有元素
coll1.removeAll(coll2);
System.out.println(coll1);
System.out.println("---------------------------");
// retainAll,与 removeAll 是相反操作,在一个集合中,只保留另一个集合中的所有内容
coll1.add("a");
coll1.add("b");
coll2.add("123");
coll2.add("456");
coll1.addAll(coll2);
System.out.println("未 retainAll() 之前:" + coll1);
coll1.retainAll(coll2);
System.out.println("retain() 之后:" + coll1);
System.out.println("---------------------------");
// size() 集合的实际大小
System.out.println(coll1.size());
System.out.println("---------------------------");
// toArray() 将集合转换为数组
Object[] o = coll1.toArray();
System.out.println(o[0]);
System.out.println(o[1]);
}
}
Student.java – 向集合中插入对象时需要用到:
package collection;
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
List 中的主要方法:
由于 List 是 Collection 的一個子接口,所以 Collection 中有的方法, List 中也已經存在,在
此不再多加贅述,重点实现一下再 List 中特有的方法(很多都是 重载 Collection 中的方法)。
方法重载不了解的小伙伴戳我哦
代码演示:
package collection;
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
// list 是有序的,(添加是什么顺序,输出时就是什么顺序)
System.out.println(list);
System.out.println("--------------------------------------");
// 重载方法,在指定位置添加元素(位置是从 0 开始的)
list.add(1,"d");
System.out.println(list);
System.out.println("--------------------------------------");
// get() : 获取集合之中某一个位置的元素(类似于数组的下标)
Object o = list.get(2);
System.out.println("位置上有值" + o);
// 访问的位置上没有值时会报错:java.lang.IndexOutOfBoundsException:
// Object value = list.get(4);
// System.out.println("这个位置上没有值:" + value);
System.out.println("--------------------------------------");
// indexOf() : 获取某个指定元素(对象) 在集合中的位置,不存在时返回 -1
int index = list.indexOf("d");
System.out.println(index);
int index1 = list.indexOf("x");
System.out.println(index1);
System.out.println("--------------------------------------");
// remove(int index) : 删除指定位置的元素,重载方法(因为 List 是有序的)
System.out.println(list);
list.remove(2);
System.out.println(list);
System.out.println("--------------------------------------");
// set() 更改集合中指定位置的值
System.out.println(list);
list.set(2,"x");
System.out.println(list);
System.out.println("--------------------------------------");
// subList() 截取集合中的一段元素
System.out.println(list);
List list1 = list.subList(1,3);
System.out.println(list1);
}
}
Set 常用方法:
Set 中的方法与 List 和 Collection 中的使用方法类似,再次不在多加赘述,下面会重点说
List 和 Set 的区别,选择适合的场景选用即可。
List 和 Set 的区别:
List: 有序,不唯一
Set: 无序,唯一
有序: 输入是有序,输出时跟输入时顺序一样称为有序。
唯一: 元素在集合中的只出现一次。
代码测试:
List list2 = new ArrayList();
list2.add("中国");
list2.add("美国");
list2.add("美国");
list2.add("俄罗斯");
Set set = new HashSet();
set.add("中国");
set.add("美国");
set.add("美国");
set.add("俄罗斯");
System.out.println(list2);
System.out.println(set);
结果:
ArrayList 和 LinkedList 的区别:
两者各自的方法都是类似的,使用方法也是类似的,只是底层原理实现不一样:
* ArrayList() 是动态连续的数组,数组的长度可变 (读取方便,增删改查比较麻烦)
* LinkList() -- 与链表类似 (读取麻烦,增删改查比较容易)
HashSet 和 TreeSet 的区别:
同上,两者各自的方法都是类似的,使用方法也是类似的,只是底层原理实现不一样:
HashSet : 基于 Hash 表实现。
TreeSet : 基于 红黑树实现。
由于本人技术有限,相关知识可以自行了解,嘻嘻。
后记:
到此,跟 Collection 相关的知识就介绍完了,如果有问题或者有疑问的地方,或者写的不到位的地方,
欢迎各位指出,本人一定会细心改正。
如果对您有所帮助,不要忘了 赞 一下哟,嘻嘻,关注一下也是可以的。
加油!