目录
一、单列集合的介绍
二、单列集合的使用
1:关于Collection
(1)迭代器遍历
(2)增强for循环遍历
(3)Lambda表达式遍历
2:List的使用
(1)ArrayList的使用
(2)LinkedList的使用
2:Set的使用
(1)HashSet的使用
(2)LinkedHashSet的使用
(3)TreeSet的使用
单列集合我们可以把它理解成是一个储存数据的容器,任何类型都可以。单列集合包括有两大类。一个是Set,,一个是List。它们共同继承了Collection接口,并且在他们之下还有ArraryList,LinkedList,Vector,HashSet和TreeSet子类。总的来说它们就是帮我们存储数据的容器而已。
List的特点:有序,可重复,有索引
Set的特点:无序,不重复,无索引
因为单列集合四是继承了Collection接口的,所以Collection的方法单列集合都是可以使用的。
Collection方法:
add(E e) 在末尾添加元素,返回值是boolean型,添加成功返回true
remove(E e) 删除指定的元素,注意是元素,而不是下标,返回值是boolean型,删除成功返回true
isEmpty() 判断集合是否为空,返回值是boolean型
clear() 清空集合,void类型无返回值
size() 返回集合大小,返回值是int型
contains(E e) 判断元素是否存在于集合中,返回值是boolean型
我们知道了Set集合是无索引的,但是List集合是有索引的,遍历的话List可以通过索引,那么Set该如何遍历呢?所以我们就要学习通用的Collection遍历了。
Colletion的三种遍历方式:
迭代器,什么是迭代器呢?如果学过C语言的话就可以将它理解成是指针。没学过的话不要紧,之前不是说集合就相当于是个容器吗,那么集合就是一个很大的容器,其中的元素我们当成是一个一个的小容器,放在大容器中。那么现在我们想找到其中一个小容器,这时候迭代器就有用处了,它就相当于是一个箭头,指着某一个小容器,当我们获取迭代器时,我们就可以获得迭代器指向的该小容器获得元素,想要遍历只要控制好迭代器就好了。
package article;
import java.util.Collection;
import java.util.*;
public class first {
public static void main(String[] args) {
Collection s=new ArrayList<>();
s.add("123");
s.add("jkjk");
s.add("iuiui");
s.add("klk");
System.out.println(s);
System.out.println("遍历----------------");
Iterator it=s.iterator();//创建迭代器对象
while(it.hasNext()) {
String h=it.next();//
System.out.println(h);
}
}
}
这里创建了Iterator的对象之后,我们遍历时用到了它的两种方法
hasNext() 判断当前迭代器指向的位置是否有元素
next() 获取迭代器当前指向的元素,并将迭代器往后移动一个位置
注意啊,使用迭代器遍历时是不能对集合进行增添和删除的
package article;
import java.util.Collection;
import java.util.*;
public class first {
public static void main(String[] args) {
Collection s=new ArrayList<>();
s.add("123");
s.add("jkjk");
s.add("iuiui");
s.add("klk");
System.out.println(s);
System.out.println("遍历----------------");
for(String h:s) {
//这里的s就是集合,而h就是一个替换的,也就是说将s集合中的每个元素都给了h
System.out.println(h);
}
}
}
Lambda也是固定格式,使用的是匿名内部类形式
package article;
import java.util.Collection;
import java.util.*;
public class first {
public static void main(String[] args) {
Collection s=new ArrayList<>();
s.add("123");
s.add("jkjk");
s.add("iuiui");
s.add("klk");
System.out.println(s);
System.out.println("遍历----------------");
s.forEach(h->System.out.println(h));
}
}
List继承了Collection,包括他的方法,当然我们也有一些List常用的方法来掌握
List中常见的方法:
void add(int index,E e) 在集合中指定的下标处添加元素
E remove(int intdex)删除指定下标处的元素,并返回
E set(int index,E e)修改指定下标出的元素,返回被修改的元素
E get(int index)返回指定下标处的元素
package article;
import java.util.Collection;
import java.util.*;
public class first {
public static void main(String[] args) {
List s=new ArrayList<>();
s.add("123");
s.add("opop");
s.add("sdsds");
System.out.println(s);
s.add(1,"mmmmmm");
System.out.println(s);
String ss=s.remove(3);
System.out.println("删除的元素是"+ss+" 现在集合:"+s);
s.set(2,"klklkkkkk");
System.out.println(s);
for(int i=0;i
在之前我已经写过了关于ArrayList的文章:ArrayList的详解 。
使用ArrayList只要会用Collection的方法就够了
package article;
import java.util.Collection;
import java.util.*;
public class first {
public static void main(String[] args) {
Collection s=new ArrayList<>();
s.add("123");
s.add("jkjk");
s.add("iuiui");
s.add("klk");
System.out.println("该集合的大小="+s.size());
System.out.println(s);
//boolean b=s.remove("123");
//System.out.println("删除:"+b);
System.out.println(s);
boolean bb=s.contains("123");
System.out.println("包含:"+bb);
}
}
LinkedList顶层是双链表实现的(其中学过数据结构的同学应该更加了解,一个节点中有元素值同时还有前后节点的地址值,这就是它增删改快的原因),查找慢,但是删增改快。因此它也出现了一些特有的方法
void addFirst(E e) 在该链表开头插入指定的元素
void addLast(E e) 将指定的元素插入到末尾
E getFirst() 获取当前链表中的第一个元素
E getLast() 获取当前链表中的最后一个元素
E removeFirst() 删除该链表中的第一个元素,并返回
E removeLast() 删除该链表中的最后一个元素,并返回
package article;
import java.util.Collection;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
LinkedList s=new LinkedList<>();
s.add("122");
s.add("shdj");
s.add(">>>>>>>");
s.addFirst("<<<<<<<-----");
System.out.println(s.getFirst());
}
}
Set集合的特点不要忘记了,无序(取出顺序和拿出顺序不一致),无索引(不可再用索引的方法遍历了),不重复(重复的元素,会去除)。Set的基本方法也是和Collection的方法是一致的(原因就是继承啊)
Set的实现类:
(1)HashSet:底层实现结构是哈希表,无序不重复,无索引
(2)LinkedHashSet:有序,不重复,无索引
(3)TreeSet:可排序,不重复,无索引
关于HanshSet的特点在强调一遍是无序,不重复,无索引。因为它是无索引的,所以遍历可以用Collection的三种方法来遍历。
package article;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
Set s=new HashSet<>();
s.add("8989");
s.add("klkl");
s.add(">>>>");
Iterator it=s.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("-------------");
//增强for
for(String h:s) {
System.out.println(h);
}
System.out.println("---------------");
//Lambda表达式
s.forEach(new Consumer() {
public void accept(String st) {
System.out.println(st);
}
});
}
}
如果添加的类型是自写的,在自写类中需要重写equals和HashCode方法,因为equals比较的是地址值。
package article;
import java.util.Objects;
public class student {
String name;
int age;
public student(String name,int age) {
this.age=age;
this.name=name;
}
public void setname(String name) {
this.name=name;
}
public void setage(int age) {
this.age=age;
}
public String getname() {
return name;
}
public int getage() {
return age;
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
student other = (student) obj;
return age == other.age && Objects.equals(name, other.name);
}
}
package article;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
Set s=new HashSet<>();
student s1=new student("uiu",190);
student s2=new student("opop",200);
student s3=new student("klkl",1000);
student s4=new student("opop",200);
System.out.println("添加情况:");
System.out.println(s.add(s1));
System.out.println(s.add(s2));
System.out.println(s.add(s3));
System.out.println(s.add(s4));
//迭代器遍历
Iterator it=s.iterator();
while(it.hasNext()) {
student ss=it.next();
System.out.println(ss.getname()+" "+ss.getage());
}
}
}
LinkedHashSet的特点:有序,无重复,无索引。有序的话它的遍历输出就和放进去的元素是一样的,数据结构中的队列差不多吧。使用方法和前面说到的HahsSet是一样的。
package article;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
Set s=new LinkedHashSet<>();
s.add("klkl");
s.add("99999");
s.add(">>>");
s.add("+++++");
s.forEach(new Consumer(){
public void accept(String ss) {
System.out.println(ss);
}
});
}
}
TreeSet的特点:可排序,无重复,无索引。TreeSet的使用方法和其他集合还是一样的,不过最大的不同就是它可排序,它的底层是基于红黑树实现的,所以对于它,我们着重学习如何排序。它的排序方法有两种。一种是用Comparaable接口实现,一种是使用比较器进行排序。当然它是有着默认排序的,对于数字按照升序,对于字母按照ASCII升序。
1:Comparable接口排序:
这里的o代表的就是当前准备插入的元素,不明白排序规则,记住this在前就是升序就可以了
package article;
import java.util.Objects;
public class student implements Comparable{
String name;
int age;
public student(String name,int age) {
this.age=age;
this.name=name;
}
public void setname(String name) {
this.name=name;
}
public void setage(int age) {
this.age=age;
}
public String getname() {
return name;
}
public int getage() {
return age;
}
@Override
public int compareTo(student o) {
// TODO 自动生成的方法存根
int t=this.name.compareTo(o.name);//先按年龄升序,相同按照年龄升序
if(t==0) {
return this.age-o.age;
}
return t;
}
}
package article;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
Set s=new TreeSet<>();
student s1=new student("abc",20);
student s2=new student("abk",30);
student s3=new student("dec",10);
student s4=new student("dbc",29);
student s5=new student("abc",30);
student s6=new student("abc",40);
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
s.add(s6);
s.forEach(new Consumer() {
@Override
public void accept(student t) {
// TODO 自动生成的方法存根
System.out.println(t.getname()+" "+t.getage());
}
});
}
}
2:比较器排序
这里的排序规则可以理解成o1在前就是升序,o2在前就是降序
package article;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
public static void main(String[] args) {
Set s=new TreeSet<>(new Comparator() {
@Override
public int compare(student o1, student o2) {
// TODO 自动生成的方法存根
//先按照名字升序,相同则按照年龄降序
int t=o1.name.compareTo(o2.name);
if(t==0) {
return o2.age-o1.age;
}
return t;
}
});
student s1=new student("abc",20);
student s2=new student("abk",30);
student s3=new student("dec",10);
student s4=new student("dbc",29);
student s5=new student("abc",30);
student s6=new student("abc",40);
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
s.add(s6);
s.forEach(new Consumer() {
@Override
public void accept(student t) {
// TODO 自动生成的方法存根
System.out.println(t.getname()+" "+t.getage());
}
});
}
}