[Java手记]集合
什么是集合
集合是一种容器,类似前面的数组,集合用来存储对象,相对数组,集合可以增加,删除等操作。
1、Collection集合接口
1.1 List子接口
1.1.1 ArrayList
ArrayList可以添加有序且可以重复的对象
ArrayList底层封装数组实现,分配的是一块连续内存空间
读取快,增删慢,线程不安全
初始大小是10,扩充时扩充50%
ArrayList的一些操作实例
//Main类
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//创建一个ArrayList集合
ArrayList a1 =new ArrayList();
//创建3个学生对象
Stu s1 = new Stu("张三",12);
Stu s2 = new Stu("李四",11);
Stu s3 = new Stu("王五",13);
//在集合中添加对象
a1.add(s1);
a1.add(s2);
a1.add(s3);
//删除集合中的元素
a1.remove(s1);
//查看集合中有几个对象
System.out.println(a1.size());
//判断集合中是否为空
System.out.println(a1.isEmpty());
//判断某一个对象是否在集合中
System.out.println(a1.contains(s3));
//将另一个集合中所有对象添加进来
a1.addAll(a1);
//集合转换成数组
Stu sArray[] = new Stu[a1.size()];
a1.toArray(sArray);
for(Stu x:sArray){
System.out.println(x);
}
//取值
System.out.println(a1.get(0));
//删除集合里所有对象
a1.clear();
}
}
//Stu类
public class Stu {
private String name;
private int age;
public Stu(String name, int age) {
super();
this.name = name;
this.age = 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;
}
}
LinkedList、Vector具体操作流程与ArrayList一致
1.1.2 LinkedList
底层封装链表实现,分配的是不连续的内存空间。
增删快,读取慢,线程不安全
没有扩容的机制
使用首尾添加的操作【addFirst()和addLast()】
1.1.3 Vector
老版本java使用,底层封装数组实现
增删插速度都慢,线程安全
初始大小10
扩充时扩充一倍
1.2 Set子接口
Set操作方式与List接口基本一致
Set接口与List接口最大区别是无序且不允许重复
因此.get方法不能使用
Set接口常用的实现类
HashSet:散列存放,无序
TreeSet:有序存放,自然排列如(123456789升序排序)
Set接口对存、取、删对象都有很高的效率
HashSet的遍历方法
public static void main(String[] args) {
//创建3个学生对象
Stu s1 = new Stu("张三",12);
Stu s2 = new Stu("李四",11);
Stu s3 = new Stu("王五",13);
//实例化一个HashSet集合
HashSet<Stu> hs=new HashSet();//<Stu>声明这个HashSet中存储的都是Stu对象
hs.add(s1);
hs.add(s2);
hs.add(s3);
//遍历HashSet中的数据
for (Stu s:hs){
System.out.println(s);
}
}
2、Map集合接口
Map集合通过键值对(Key-Value)的形式来存储数据。
Map中,Key可以为任意类型,实际开发建议使用String,value也可以是任意类型;
Map集合通过键获取值,查询速度非常快。
Map里的值不可以重复,出现重复是后存入值会覆盖前面的值
Map的常用实现类
HashMap:使用频率最高,无序,线程不安全,允许Key值出现一次Null,Value允许为Null;
TreeMap:线程不安全,自然升序,Key值不允许为null,Value值可以
HashTable:无序,线程安全,它不仅实现了Map接口也实现了Dictionary接口,它的Key值与Value都不允许出现Null;
值可以重复
hashSet的遍历方法
public static void main(String[] args) {
//创建3个学生对象
Stu s1 = new Stu("张三",12);
Stu s2 = new Stu("李四",11);
Stu s3 = new Stu("王五",13);
//实例化一个HashSet集合
HashSet<Stu> hs=new HashSet();//<Stu>声明这个HashSet中存储的都是Stu对象
hs.add(s1);
hs.add(s2);
hs.add(s3);
//遍历HashSet中的数据
for (Stu s:hs){
System.out.println(s);
}
}
3、分支
另外还有三个分支,均是为上述两大接口服务的。
3.1 Iterator接口(迭代器)
一个集合中有多种对象,遍历是可以使用Iterator迭代器进行遍历。
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add("张三");
hs.add("李四");
hs.add(666);
//返回一个Iterator迭代器对象
//用it接收
Iterator it=hs.iterator();
while (it.hasNext()){//判断有没有下一个值
System.out.println(it.next());
}
}
3.2 Comprator接口(比较器)
在集合中存储对象时候,用于对象之间的比较;
3.3 Collecitons工具类
注意该类名带个s,一般就表示工具类。里面提供了很多静态方法,来对Colleciton集合进行操作。