目录
Collection集合
Collection集合最基本的集合接口,用于存储一系列元素。
Collection集合有两个重要的子接口,分别是List和Set。其中List集合的特点是元素有序,可重复;Set集合的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和ListedList;Set接口的主要实现类有HashSet和TreeSet
List接口
List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象
ArrayList集合
ArrayList内部封装了一个长度可变的数组对象(初始容量为8,按1.5倍扩容),在ArrayList中进行增删改查效率会比较低,但是在遍历和查找元素时显得非常高效。
LinkedList集合
为了克服ArrayList增删效率低的问题,可以用LinkedList,该集合内有一个双向循环链表,增删效率较高。
List集合遍历
Iterator迭代器
Java迭代器(Iterator)是 Java 集合框架中的一种机制,是一种用于遍历集合(如列表、集合和映射等)的接口。
它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet等集合
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("数据1");
arrayList.add("数据2");
arrayList.add("数据3");
Iterator iterator=arrayList.iterator();
// hasNext() 判断还有无元素
while(iterator.hasNext()){
//iterator.next()返回当前元素,然后指向下一元素,可以这样理解:
//和c语言里面的指针一样 一开始是数据1 next把数据1返回然后指向了数据2
System.out.println(iterator.next());
}
}
//输出结果:
数据1
数据2
数据3
增强for循环
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("数据1");
arrayList.add("数据2");
arrayList.add("数据3");
for (Object s: arrayList ){
System.out.println(s);
}
}
//输出结果:
数据1
数据2
数据3
forEach遍历集合
forEach是java8新增的方法,使用Lambda表达式来遍历
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("数据1");
arrayList.add("数据2");
arrayList.add("数据3");
arrayList.forEach(s-> System.out.println(s));
}
//输出结果:
数据1
数据2
数据3
Set接口
Set接口中的元素无序,并且保证存入的元素不会重复。Set接口主要有两个实现类,分别是HashSet和TreeSet,其中HashSet是根据对象的哈希值来确定元素集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则以二叉树的方式来存储元素,它可以实现对集合中的元素排序。
HashSet集合
HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当想HashSet集合中添加元素时,首先会调用hashcode方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素。
Set和List集合遍历方法类似
public class Class3 {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add("数据1");
hashSet.add("数据2");
hashSet.add("数据3");
hashSet.forEach(s-> System.out.println(s));
}
//输出结果
数据1
数据2
数据3
}
向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象是,需要重写Object类中的hashCode()和equals()方法。例子中将字符串存入HashSet时,String类已经默认重写了hashCode的方法,但是有时候传入自定义类型的对象存入HashSet,需要重写方法。
可以参考我的另一篇文章:
TreeSet集合
TreeSet采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,且可以排序。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable定义的。对于我们自定义的类,就需要去实现Comparable接口,并重写compareTo()方法
public class Class4 {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add(new Cat("mimi",8));
treeSet.add(new Cat("tutu",9));
treeSet.add(new Cat("caca",3));
System.out.println(treeSet);
}
}
// 定义Cat类实现Comparable接口
class Cat implements Comparable{
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return name +":"+age;
}
// 重写Comparable接口的compareTo()的方法
@Override
public int compareTo(Object obj){
Cat Cat = (Cat) obj;
// 先比较年龄,再比较名称name
if(this.age- Cat.age>0){
return 1;
}
if(this.age- Cat.age==0){
return this.name.compareTo(Cat.name);
}
return -1;
}
}
输出结果:
在上面的代码中,我们实现Comparable接口,并重写compareTo()方法,让Cat对象先比较年龄,如果年龄相同,再去比较名字,名字比较又调用了compareTo()方法,但名字是String类型的,String类型的compareTo()方法已经实现了,所以不用再去重写。我们将这种排序方式称为自然排序,除了自然排序,还可以通过定制排序来实现。
关于2种排序,有不清楚的可以参考我的这篇博客:
标签:Java,arrayList,元素,接口,Cat,add,Collection,集合 From: https://blog.csdn.net/m0_62729850/article/details/140187444