黑马程序员-------集合(ArrayList,LinkedList)
来源:互联网 发布:淘宝森马官方店真假 编辑:程序博客网 时间:2024/05/21 11:00
------- android培训、java培训、期待与您交流! ----------
集合概述:
Java是面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。
而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能满足变化的要求。所以,Java就提供了集合供我们使用。集合的特点:
1 长度可以发生改变。
2 只能存储对象。
3 可以存储多种类型对象(一般存储的还是同一种,因为1.5JDK的新特性 泛型)。集合和数组的区别:
1 长度问题 数组固定,集合可变。
存储元素问题 数组可以是基本类型,也可以是引用类型。 集合只能是引用类型。(JDK1.5以后还可以存储基本数据类型,因为JDK1.5自动装箱拆箱)是否同一类型 数组元素类型一致; 集合元素类型可以不一致。(建议还是同一种类型,因为JDK1.5出现了泛型)
功能是否一致
数组只能对数据进行存取操作,当然删除数组中的元素还可以删除,就是null。
集合不但可以对数据进行基本操作,还提供了更强大的功能,比如删除 修改...。
集合体系的由来
集合是存储多个元素的容器,但是,由于数据结构不同,Java就提供了多种集合类。
而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系
结构。
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构。
数据结构:数据存储的方式。
Collection:定义了集合框架的共性功能。
|------List(列表):元素是有序的,元素可以重复,因为该集合体系有索引。
|--ArrayList:底层是数组数据结构,查询速度很快,但是增删稍慢,线程不同步,默认10个元素。(线程不同步)
|--LinkedList:底层是链表数据结构,查询很慢,增删速度很快。(线程不同步)
|--Vector:底层是数组数据结构,和ArrayList一样,查询,增删,都很慢,Vector是1.0出现,ArrayList是1.2出现,(线程同步)但已经不用了。
|------Set(集):元素是无序的(存入和取出顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。线程是不同步的。
采用散列函数对元素进行排序(Asiic),是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。
|--TreeSet:底层的数据结构是二叉树。线程是不同步的。
对Set集合中的元素的进行指定(我们指定的比较器)顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。
需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。如何学习和使用一个继承体系呢?
学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。Collection集合中的方法演示:
代码演示:
把取出方式定义在了集合的内部,这样就可以直接访问集合内部的元素。
这样取出方式就成了内部类。
而每一个容器的数据结构不同,
所以取出的动作也不一样。
判断和取出。那么可以将其共性抽取出来。
那么这些内部类都符合一个规则。改规则就是Iterator。
如何获取集合的取出对象呢?
通过一个对外的方法。
iterator();迭代器就是取出集合中元素的方式。把取出的方式定义在集合的内部,就可以直接访问集合内的元素,那么取出方式就成了内部类。而每一个容器的数据结构不同,因此取出的动作也不同,但都有共性内容:判断和取出。那么可以将这些共性内容抽取得到了Iterator接口。ArrayList al = new ArrayList(); Iterator it = al.iterator();获取迭代器用于取出集合中的元素。
代码演示:
List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index);
subList(from,to);
ListIterator();
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生并发修改异常。ConcurrentModificationException
所以在迭代时,只能用迭代器的方法操作元素,但是Iterator的方法是有限的
只能对元素进行判断,取出,删除等操作。
如果想要其他的操作如添加,修改等。就需要使用其子接口,ListIterator。
该接口只能通过List集合的ListIterator方法获取。Arraylist集合代码演示
ArrayList小测试一个,
代码演示:
LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询速度稍慢。
LinkedList:特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除。如果集合中没有元素,会出现NoSuchElementsException异常。
removeFirst();
removeLast();
获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementsException异常。
在JDK1.6版本以后出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有该元素,则返回null。
pollFirst();
polllast();
获取元素,并删除元素。如果集合中没有该元素,返回null。
代码演示:
LinkedList小测试
代码演示:
listIterator(int index)方法可以控制迭代器位置,当参数为集合size时,调用previous可反向遍历集合
当一个集合创建了两个迭代器,一个迭代器对集合进行了修改,或者集合本身方法对集合进行了修改,另一个迭代器发现了这些修改会抛出ConcurrentModification异常(布尔方法不会抛出异常)。
list <String> s=new LinkedList<String>();
Listiterator it=s.listIterator();
ListIterator it2=s.listIterator();
it.add("123");
it.add("321");//抛出ConcurrentModification异常
为了避免此异常的发生需遵循下列原则:可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读取列表。另外再单独附加一个既能读又能写的迭代器。
集合采用一个简单的方法检测并发修改。集合跟踪记录操作次数,每个迭代器都维护一个计数值,当计数值和集合的操作数不一致时,抛出异常。
- 黑马程序员-------集合(ArrayList,LinkedList)
- 黑马程序员_Vector、LinkedList、ArrayList集合
- 黑马程序员_集合1(ArrayList,LinkedList,Vector,Iterator,ListIterator)
- 黑马程序员——java集合中的ArrayList和LinkedList
- 黑马程序员---集合的介绍与使用(1)(List,linkedlist,Arraylist;Set,hashSet)
- 黑马程序员------集合框架(No.2)(ArrayList、LinkedList、vector)
- 黑马程序员:集合类:List(ArrayList、LinkedList、Vector)、Set(HashSet、TreeSet)介绍
- (黑马程序员)学习笔记,Collection集合(ArrayList、LinkedList、Vector、HashSet、TreeSet)
- 黑马程序员------毕老师视频笔记第13-17天------集合Collection-List-(ArrayList、LinkedList)
- 黑马程序员-ArrayList集合
- 黑马程序员_学习笔记:9) 集合框架1:Collection(List、Set)、Iterator、List(ArrayList、LinkedList、Vector)
- 黑马程序员-List-ListIterator-LinkedList-ArrayList
- 黑马程序员_JavaSE基础17 之 集合框架 Vector LinkedList ArrayList HashSet LinkedHasSet TreeSet
- 《黑马程序员》java笔记->集合List中:ArrayList,LinkedList,及队列设计例子
- 黑马程序员--07.集合框架--04.List实现子类【ArrayList】【LinkedList】【Vector】
- 黑马程序员_集合1_(ArrayList、LinkedList、Vector、Iterator、ListIterator)
- 黑马程序员——List集合中ArrayList、linkedList、Vector的数据结构及特点
- 黑马程序员---2015.6.20java基础笔记---集合类--ArrayList---LinkedList---HashSet
- mysql导入source数据库sql的C++实现和封装
- POJ 2063 Investment 变形的完全背包
- 无线传输杂叙三
- 设计模式(6):原型模式
- 昨天晚上斗了几场地主,得到一门挑战赛冠军,喜得10000。开发欢乐斗地主游戏辅助神器
- 黑马程序员-------集合(ArrayList,LinkedList)
- POJ 1384 Piggy-Bank 完全背包
- UVA 10954- Add All(优先队列)
- Hive 中内部表与外部表的区别与创建方法
- 读取七位数的代码片段
- ESql修改(介绍对数据库的增、删、改用法,Edoit的核心内容之一)
- 基于AWS的广告服务应用架构
- VC++下命名管道编程的原理及实现
- Unity3D游戏开发之动画模型导入