主要是List和Set接口的实现类
List:有顺序,可重复,有索引值
- ArrayList :有顺序,可以存储重复的元素,有索引值,是一个非同步的(多线程)。底层是使用数组来进行实现的,所以其增删的效率比较低。其内部的大部分方法是从List继承而来。
- LinkedList: 有顺序,可以存储重复的元素,有索引值,是一个非同步的(多线程)。底层是使用链表来实现的,其增删的效率比较高,因为使用链表实现,LinkedList除了有Collection的所有方法之外,它还有一些自己特有的方法;
- Vector:有顺序,可以存储重复的元素,有索引,但是是一个同步的(单线程),现在被ArrayList取代了
LinkedList特有的一些方法:
push(Object obj) //向集合中的表头添加一个元素
addFirst(Object obj) //向集合的表头添加一个元素,等同于push
addLast(Object obj) //向集合中的表尾添加一个元素
pop() //弹出集合中的最后一个元素
removeFirst() //移除集合中第一个元素
removeLast() //移除集合中的最后一个元素,相当于pop
getFirst()//获取集合中的第一个元素
getLast()//获取集合中的最后一个元素
多态的使用:·
使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
//这里创建对象不使用多态是为了可以使用到自己的特有的方法
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(1);
System.out.println(list);
//增加表头的元素
list.addFirst(666);
list.push(999);
//在list末尾增加一个元素
list.addLast(888);
System.out.println(list);
//判断是不是为空
boolean b = list.isEmpty();
if (!b){
//获取list的第一个元素
System.out.println(list.getFirst());
//获取list的最后一个元素
System.out.println(list.getLast());
}
//移除list中的最后一个元素
list.removeLast();
//移除list中的第一个元素
list.removeFirst();
//获取list的长度
int size = list.size();
System.out.println(list+"-->"+size);
System.out.println("---------------------");
//遍历所有元素
Iterator it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println("---------------------");
//遍历的到所有元素
for(Integer i :list){
System.out.println(i);
}
System.out.println("---------------------");
//因为LinkedList是带有索引的集合,所以可以使用for来遍历得到
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
Set:无顺序,不可重复,无索引值
Set根据对象的哈希值来确定元素在集合中存放的位置,底层是以HashMap来实现的,其存取、查询效率高。
- HashSet:存储无顺序,不可以存放重复的元素,没有索引值,添加元素的时候是通过计算hashCode来确定存储的位置。存放之前会判断这位置是否有相同的元素,有的话就不进行存放,没有,就放进来。底层是通过哈希表(链表+数组)来实现;
- LinkedHashSet:属于HashSet的子类,有顺序,不允许重复,底层是通过哈希表+链表实现
- TreeSet:无顺序,不可以重复,底层使用二叉树来实现。可以用来对集合的元素进行排序。
HashSet<String > set = new HashSet();
set.add("AA");
set.add("重地");
set.add("通话");
set.add("AA");
System.out.println(set);//[AA, 重地, 通话] 不允许添加重复的元素
//获取各个元素的hashcode
System.out.println("AA".hashCode());//2080
System.out.println("重地".hashCode());//1179395
System.out.println("通话".hashCode());//1179395
//获取set集合的大小
int size = set.size();
System.out.println(size);
boolean b = set.isEmpty();
//遍历得到set集合的所有元素:Iterator、foreach 因为没有索引,索引不能使用for
if(!b){
//通过Iterator进行遍历
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("--------------------------");
// 通过foreach来遍历
for(String s : set){
System.out.println(s);
}
}
上述代码实现不重复存放的原理流程:
1· new HashSet(); 内存为其开辟一个长度为16的空间
2· set.add(“AA”);调用hashCode()方法获取AA的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是没有元素,所以存入;
3· set.add(“重地”);调用hashCode()方法获取“重地”的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是没有元素,所以存入;
4· set.add(“通话”);调用hashCode()方法获取“通话”的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是有元素,然后调用“通话”.equals(“重地”)判断其元素是否相等,发现不相等,存入。
5· set.add(“AA”);调用hashCode()方法获取AA的哈希值,然后根据哈希值找到空间中的位置,发现这个位置是有元素,然后调用“AA”.equals(“AA”)判断其元素是否相等,发现相等,不存入。
– LinkedHashSet(有顺序,不能存放重复的元素)
LinkedHashSet<String > link = new LinkedHashSet();
link.add("AA");
link.add("BB");
link.add("CC");
link.add("AA");
System.out.println(link);//结果:[AA, BB, CC]
(补充今天学的一个小知识)
补充一个可变参数类型:/**
- 测试可变长度的参数,其参数底层为一个数组类型
- 格式:
修饰符 返回值 方法名(参数类型…参数名){ 方法体; }
public class TestKebainCansh u {
//计算n个数字的和
public static int add(int…a){//这里的a是一个数组
int sum = 0;
for(int i = 0; i<a.length;i++){
sum = sum+a[i];
}
return sum;
}
public static void main(String[] args) {
System.out.println(add(1,2,3));
}
}
2019年8月9号下午的学习笔记就到这里~有缘再会