数组:
集合和数组存储的引用数据类型,存的都是地址值
集合框架(集合的由来及集合的继承体系)
由来:
数组的长度是固定的,当添加的元素超过了数组的长度时需要对数组进行重新定义,太麻烦。java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。
数组和集合的区别:
1、
- 数组既可以保存基本数据类型,又可以存储引用数据类型。基本数据类型存储的是值,引用数据类型存储的是地址值。
- 集合只能存储引用数据类型(对象)集合中也可以 存储基本数据类型,但是在存储的时候会自动装箱包装成对象。
2、
- 数组的长度是固定的,不能自动增长
- 集合的长度是可以改变的,可以根据元素的增加而增长
数组和集合什么时候使用?
1、元素的个数是固定的推荐使用数组
2、元素的个数不确定则推荐使用集合
集合的遍历方式:
1、转成数组遍历
2、使用迭代器遍历
迭代器的原理:
迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不一样的所以每个集合的存和取都不一样,那么久需要在每一个类中定义hasNext()和next()方法,这样做会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部定义自己的迭代方式。这样做的好处有:
1、规定了整个集合体系的遍历方式都是hasNext()和next()方法
2、代码有底层内部实现,使用者不用管怎么实现的,会用即可。
============================================================================================================================================
List
* A:List集合的特有功能概述
| |
* void add(int index,E element)
| |
* E remove(int index)
| |
* E get(int index)
| |
* E set(int index,E element)
|
ConcurrentModificationException出现?(黑马笔记day515)
出现该异常的原因是并发修改。使用迭代器进行修改的时候,集合修改内部元素,导致出现该异常。
解决方案:
1、迭代器遍历时,使用迭代器内的方法修改元素。
2、集合遍历元素,集合修改元素。
例子:
ListIterator lit = list.listIterator();
|
//如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
| |
while(lit.hasNext()) {
| ||
String str = (String)lit.next();
| ||
if(str.equals("world")) {
| ||
lit.add("javaee");
| ||
//list.add("javaee");
| ||
}
| ||
}
|
============================================================================================================================================
数组和链表:
A:数组
- 查询快修改也快
- 增删慢
B:链表
- 查询慢,修改也慢
- 增删快
List的三个子类的特点:
ArrayList:
{
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
}
Vector:
{
底层数据结构是数组,查询快,增删慢
线程安全,效率低
}
Vector相对ArrayList查询慢(线程是安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
{
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
}
Vector和ArrayList的区别:
a.Vector线程安全,效率低
b.ArrayList线程不安全,效率高
共同点:都是数组实现的
ArrayList和LinkedList区别:
ArrayList底层是数组,查询和修改比较快
LinkedList底层是链表结构,增删快,查询慢
共同点:线程都不安全。
如何使用三者?
查询多用ArrayList
增删多用LinkedList
都多则使用ArrayList