1、集合框架(简介、Collection方法、迭代器)
集合框架中提供了一个内部类专门操作集合中的元素,这个内部类就是迭代器
数据结构
集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从而形成了集合框架这一体系。
Collection方法
如图所示
演示结果如下
迭代器
如图所示
错误演示
Iterator it = a1.iterator();
while(it.hasNext()) {
Object obj = it.next();
a1.remove(obj);
}
原因:
出现了并发问题。两个对象同时操作了同一个变量,所以不能这样删除集合里的元素
2、集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
**
* Collection
1. List 有序 元素可以重复 因为该集合体系有索引
2. Arraylist 数组结构 增删慢,查询快 有连续下标 线程不同步(没有synchronized(索契标)) 增长因子为1.5
* 内部表示如下:
*
增长因子为1.5 论证代码如下
效果如下:
解释增长因子(1.5):
原数组的默认长度为10,一旦超过这种长度它的长度就会以原来的数组长度情况下乘以1.5,取整。
例如一开始默认为10,超过之后就是101.5,结果为15-----以此类推超过15后就是101.51.5,取整后为22-----超过22后就是101.51.51.5,取整后为22。因此可以得出增长因子的性质
-
- vector 数组结构 增删改查都慢 有连续下标 线程同步(有synchronized(索契标)) 增长因子2
list集合的调优
* 内部表示如下:
*
增长因子为2 论证代码如下
解释增长因子(2):
原数组的默认长度为10,一旦超过这种长度它的长度就会以原来的数组长度情况下乘以2,取整。
例如一开始默认为10,超过之后就是102,结果为20-----以此类推超过20后就是1022,取整后为40-----超过40后就是10222,取整后为80。因此可以得出增长因子的性质
-
- Linkedlist 链表结构 增删快,查询慢 没有连续下标
- 链表结构 如图所示
解释:小红要去找小明,她先找到小狗问小狗认识小明嘛,小狗不认识,但他认识小马,就问小马认识小马嘛,小马认识,所以小红就找到了小明,这就是我们所说的链表结构。
这就表示了这种结构查询慢,但它的优点就是增删快
列如:如图所示:
解释:要进行删除和增加操作的时候,只需要让小狗记住小马就行了,直接在他们中间进行增删,这样就不会影响到其它的内容,这样就提高了增删速度。
- vector 数组结构 增删改查都慢 有连续下标 线程同步(有synchronized(索契标)) 增长因子2
- 5.Set 无序 元素不可以重复
- List:凡是可以操作角标的方法都是该体系所特有的方法
- 增
- Add(index,element)
- Add(index,Collection)
- 删
- Remove(index)
- 改
- Set(index,element)
- 查
- Get(index)
- subList(from,to)
- listIterator()
- index(element)
- list集合所特有的迭代器,ListIterator是Iterator的子接口
- 在迭代时,不可以通过集合对象的方法操作集合中的元素;
- 因为会发生并发修改异常(ConcurrentModificationException);
- 所以,在迭代时,只能通过迭代器来操作元素,课时Iterator的方法是有限的,Iterator只提供了判断、
- 取出、删除的操作;
- 如果想要有其他的操作,如添加、修改等,就需要使用其子接口ListIterator,该接口只能list集合的listIterator方法来获取
3、Iterator与ListIterator的区别
ListIterator可以顺着获取值也可以倒着获取值
、
运行结果 如图所示:
*/
3、集合框架Vector
只需要了解它的遍历方式是特殊的就行(了解)
4、集合框架LinkedList
**
链表的数据结构:
上面已经展示过了(如果有疑问可以看一下上面的详细介绍)
-
特有方法
addFirst();
addLast();
获取元素但是不删除元素,如果集合中没有元素,会出现NoSuchElementException
getFirst();
getLast();
获取元素的同时会删除元素,如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
在jdk1.6出现了替代方法
offerFirst()
offerLast()
peekFirst();
peekLast();
获取元素的同时会删除元素,如果集合中没有元素,会返回null
pollFirst();
pollLast();
由于是链表结构,当前节点能够记住上一个节点、以及下一个节点,所有有带First、last的方法存在。
模拟队列以及堆栈 如图所示:
堆栈:先进后出 子弹夹
结果:
执行移除方法后的结果 如图所示:
队列:先进先出 水管
执行移除方法后的结果 如图所示:
5、集合框架ArrayList中的重复元素去重及其底层原理
判断list 集合中元素是否相同,依据的是元素的equals方法
Contains调用了equals
Remove调用了equals
list中存储的是字符串,而string的equals方法就是比的字符串值
字符串去重
代码如图所示
对象类型去重(同姓名同年龄视为同一个人)
思路
1、对人进行描述,将数据封装进对象
2、将对象放入容器
3、去重
集合list中Contains方法调用时,调用了equals方法验证
代码如下:
package com.dengrenli.list;
import java.util.ArrayList;
/**
* 如何取出list中的集合元素
* @author machenike
*
*/
public class ArrayListRepeatDemo1 {
public static void main(String[] args) {
ArrayList a1=new ArrayList();
a1.add(new Person("aa", 12));
a1.add(new Person("bb", 13));
a1.add(new Person("cc", 43));
a1.add(new Person("dd", 23));
a1.add(new Person("ee", 23));
//a1.add(new Person("aa", 12));
a1.remove(new Person("aa", 12));
System.out.println(a1.size());
//调用去重方法
// ArrayList newall=repeatList(a1);
// System.out.println(newall.size());
}
//去重复元素的方法
private static ArrayList repeatList(ArrayList a1) {
// TODO Auto-generated method stub
ArrayList newall=new ArrayList();
for (Object obj : a1) {
if(!newall.contains(obj)) {
newall.add(obj);
}
}
return newall;
}
}
class Person{
private String name;
private int 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;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person) obj;
System.out.println(this.getName() +"----equals-----"+p.getName());
return this.getName().equals(p.getName())
&& this.age == p.getAge();
}
return false;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
结果如图所示:
集合list中remove方法调用时,调用了equals方法验证