1.集合
存多个引用数据类型的数据的集合.它的长度可变.(动态)
2.集合中常用概念:
-
有序性:按照添加顺序来排列.
-
可排序性:按照一定规则来排序(eg:数字由小到大,或由大到小来排序)
-
唯一性:只有一个,不可重复.
-
集合家族系谱图:
3 List
3.1:Collection接口
存储无序,可重复的单一对象.
3.1.1 List接口
存储有序,可重复的单一对象.
- ArrayList类:存储有序,可重复的单一对象.底层采用Object[]存值.
- LinkedList类:存储有序,可重复的单一对象.底层采用双向链表结构存值.
3.1.2 Set接口
存储无序,唯一的单一对象.
- HashSet类:存储无序,唯一的单一对象.底层采用HashMap的Key存值.
- TreeSet类:存储无序,但是可排序,唯一的单一对象.底层采用TreeMap的Key存值.
3.2 Map接口
按照Key-value对存值.
- HashMap:按照Key-value对存值,Key无序,唯一的.底层采用数组+链表结构存值.
- TreeMap:按照Key-value对存值,Key无序可排序,唯一的.底层采用二叉树结构存值.
4.ArrayList
存储有序的,可重复的单一对象.底层采用Object[]存值.默认按照1.5倍扩容.
- 优点:按顺序添加和修改及遍历的效率高.
- 缺点:删除元素或按指定索引添加元素效率低.
public static void main(String[] args) {
//创建集合对象
List stuAges=new ArrayList();
//向集合中添加元素
stuAges.add(11);
stuAges.add(99);
stuAges.add(61);
//向集合中指定索引位置添加元素时,索引范围:[0,集合.size()]
stuAges.add(2, 33);
stuAges.add(3, 71);
stuAges.add(11);
//遍历集合
for (int i = 0; i < stuAges.size(); i++) {
System.out.println(stuAges.get(i));
}
System.out.println("------------------------------");
//修改集合中元素,修改元素索引范围为:[0,集合.size()-1]
stuAges.set(2, 44);
//遍历集合
for (Object ob : stuAges) {
System.out.println(ob);
}
System.out.println("________________________________");
//删除集合中元素,删除的索引范围:[0,集合.size()-1]
stuAges.remove(1);
//删除集合中元素
stuAges.remove((Object)11);
//根据过滤器,删除满足条件元素
stuAges.removeIf(new Predicate() {
/**
* 过滤方法
*/
@Override
public boolean test(Object t) {
//将判断集合中每个元素转换字符串类型,再判断元素是否以1结尾
if (t.toString().endsWith("1")) {
return true;
}
return false;
}
});
//遍历集合
for (int i = 0; i < stuAges.size(); i++) {
System.out.println(stuAges.get(i));
}
System.out.println("------------------------------");
//清空集合
stuAges.clear();
//遍历集合
for (Object ob : stuAges) {
System.out.println(ob);
}
System.out.println("________________________________");
}
5.过滤器(filter)
将需要数据留下,不需要的数据剔除掉.
6.LinkedList
存储有序的,可重复的单一对象.底层采用双向链表结构存值.
- 优点:添加和删除元素效率高.
- 缺点:遍历和修改元素效率低.
public static void main(String[] args) {
//创建集合对象
LinkedList stuAges=new LinkedList();
//向集合中添加元素
stuAges.add(11);
stuAges.add(99);
stuAges.add(61);
//向集合中指定索引位置添加元素时,索引范围:[0,集合.size()]
stuAges.add(2, 33);
stuAges.add(11);
//向集合中添加第一个元素
stuAges.addFirst(22);
//向集合中添加最后一个元素
stuAges.addLast(55);
//遍历集合
for (int i = 0; i < stuAges.size(); i++) {
System.out.println(stuAges.get(i));
}
System.out.println("------------------------------");
//修改集合中元素,修改元素索引范围为:[0,集合.size()-1]
stuAges.set(2, 44);
//遍历集合
for (Object ob : stuAges) {
System.out.println(ob);
}
System.out.println("________________________________");
//删除集合中第一个元素
stuAges.removeFirst();
//删除集合中最后一个元素
stuAges.removeLast();
//删除集合中元素,删除的索引范围:[0,集合.size()-1]
stuAges.remove(1);
//删除集合中元素
stuAges.remove((Object)11);
//根据过滤器,删除满足条件元素
stuAges.removeIf(new Predicate() {
/**
* 过滤方法
*/
@Override
public boolean test(Object t) {
//将判断集合中每个元素转换字符串类型,再判断元素是否以1结尾
if (t.toString().endsWith("1")) {
return true;
}
return false;
}
});
//遍历集合
for (int i = 0; i < stuAges.size(); i++) {
System.out.println(stuAges.get(i));
}
System.out.println("------------------------------");
//清空集合
stuAges.clear();
//遍历集合
for (Object ob : stuAges) {
System.out.println(ob);
}
System.out.println("________________________________");
}
7.ArrayList VS Vector(面试)
相同点存储的都是有序的可重复单一对象,底层采用Object[]存值.
- 1:推出时间不同:Vector在JDK1.2之前就推出了;而ArrayList在JDK1.2后才推出.
- 2:线程安全性和效率不同:Vector是线程安全的集合,效率低;ArrayList是线程不安全的集合,效率高.
- 3:扩容不同:Vector按原来2倍扩容;ArrayList按原来1.5倍扩容.
- 4:方法不同:ArrayList拥有的所有方法Vector都有,Vector还有自己独有的方法.
8.迭代器(Iterator)
遍历访问collection集合中每个元素.
- 集合名.iterator();获得当前集合跌代器对象.
- 跌代器对象.hasNext();判断跌代器对象后面是否有元素可跌代.
- 跌代器对象.next();跌代元素(访问当前元素),
注意: 集合中每个元素只能调用一次next().
public static void main(String[] args) {
//创建集合对象
ArrayList stuAges=new ArrayList();
//向集合中添加元素
stuAges.add(11);
stuAges.add(99);
stuAges.add(61);
//获得集合的迭代器对象
Iterator it1=stuAges.iterator();
//循环判断迭代器对象后面是否有元素可迭代
while (it1.hasNext()) {
//迭代出当前元素
Object ob=it1.next();
System.out.println(ob);
}
}
public static void main(String[] args) {
//创建集合对象
ArrayList stus=new ArrayList();
//向集合中添加元素
stus.add(new Student("张三",88));
stus.add(new Student("李四",38));
stus.add(new Student("田七",48));
//获得集合的迭代器对象
Iterator it2=stus.iterator();
//循环判断迭代器后面是否有元素可迭代
while (i