静态方法只能继承,不能重写(Override).

StringBufffer,数组,对象 都是容器。

加入数据,“zhangsan” true ,67, 三个数据数据类型不同,不能用数组作为集合,只能用StringBuffer或者是StringBuilder作为集合,但是这两个类型,最终转换成字符串才可以使用。

上面的数据封装成StringBuilder为“zhangsantrue67”.

李四,23,都是(一个对象的)属性值所以用对象来封装,进行存储。

数值有很多的话可以用数组存储,数组有很多的话用二维数组进行存储, 数据有很多的话可以用对象存储,对象有很多的话用集合存储.(集合是能存储对象的对象)

集合中实际上存储的是地址,对象已经创建完了,存储用地址。集合中地址是怎么存放的那就不一定了,每中容器有各自不同的特点。

数组能存储Person对象吗?可以,类类型的数组。

但是人的数量可以是变化的,数组是固定长度的,集合是可变长度的。

集合类的由来:

对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定, 就使用集合容器进行存储。

集合特点:

1,用于存储对象的容器。

2,集合的长度是可变的。

3,集合中不可以存储基本数据类型值。

部分容器有一些共性,就不断的向上抽取。对体系的使用就是“看顶层用底层”.

集合类是属于java中的工具,在java.util包中。

迭代器:取出集合中元素的方式。

集合容器因为内部的数据结构不同,有多种具体容器,不断的向上抽取,就形成了集合框架。

框架的顶层Collection接口:

Collection中的常见方法:

1,添加。

boolean add(Object obj):

boolean addAll(Collection coll):

2,删除。

boolean remove(object obj):

boolean removeAll(Collection coll);

void clear();

3,判断:

boolean contains(object obj):

boolean containsAll(Colllection coll);

boolean isEmpty():判断集合中是否有元素。

4,获取:

int size():

Iterator iterator():取出元素的方式:迭代器。

该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。

所以该迭代器对象是在容器中进行内部实现的。

对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。

Iterator接口就是对所有的Collection容器进行元素取出的公共接口.( 其实就是抓娃娃游戏机中的夹子!)

5,其他:

boolean retainAll(Collection coll);取交集。

Object[] toArray():将集合转成数组。

集合类的由来:

对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定, 就使用集合容器进行存储。

coll.add("abc1");

coll.add("abc2");

coll.add("abc3");

System.out.println(coll);

集合可以这样直接打印,打印的结果是: [abc1, abc2, abc3]  集合中重写了toString()方法.

retainAll 保留和指定集合相同的元素在当前元素中.

removeAll 正好和retainAll相反,删除和指定集合相同的元素在当前元素中.

//使用了Collection中的iterator()方法。 调用集合中的迭代器方法,是为了获取集合中的迭代器对象。

    Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

    for(Iterator it = coll.iterator(); it.hasNext(); ){
System.out.println(it.next());
}

这两种使用迭代器的方法.第一种在while循环用完迭代器之后还可以继续使用(如果不用的话就是浪费内存).  第二种方式老外经常使用,他们不浪费一点内存.开发用第二种.

Collection

|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

|--Set:元素不能重复,无序。

List:特有的常见方法:有一个共性特点就是都可以操作角标。

1,添加

void add(index,element);

void add(index,collection);

2,删除;

boolean remove(index);

boolean remove(Object o); 从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。如果列表不包含元素,则不更改列表

   void clear() ;从列表中移除所有元素

3,修改:

Object set(index,element);

4,获取:

Object get(index);//Collection的子类中只有List有这个多余的方法来获取,其他子类没有.

int indexOf(object);

int lastIndexOf(object);

List subList(from,to);(注意是不包含尾角标的,和前面的一个方法是一样的道理)

list集合是可以完成对元素的增删改查。

ListDemo3.java

 public class ListDemo3 {
public static void main(String args[]){
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3"); Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("abc2")){
list.add("abc9");
           //在迭代器过程中,不要使用集合操作元素,容易出现异常。
           //可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。 
}
else{
System.out.println("next:"+obj);
}
}
System.out.println(list);
}
}

结果输出:

next:abc1

Exception in thread "main" java.util.ConcurrentModificationException

当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

为什么会出现这种情况呢?

元素”abc9”添加进来,迭代器是不知道的,因为现在是迭代器在操作这些元素。在迭代器操作的过程中,你又在用集合在操作这个元素。

集合和迭代器同时在对元素进行修改就会出现问题。

该如何解决?

原始的Iterator就只有三个功能, hasNext(),next(),remove();有局限性,没有添加的功能

那在迭代的过程中添加元素怎么办?

Iterator的子接口ListIterator就丰富了这个功能,有更多的功能。

ListIterator it = list.listIterator();//获取列表迭代器对象
//它可以实现在迭代过程中完成对元素的增删改查。
//注意:只有list集合具备该迭代功能.所以叫ListIterator while(it.hasPrevious()){
System.out.println("previous:"+it.previous());
}

如果以逆向遍历列表,列表迭代器有多个元素,则返回 true

ListIterator<E>

listIterator()
          返回此列表元素的列表迭代器(按适当顺序)。

 ListIterator<E>

listIterator(int index)
          返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

容器之所以可以区分就是因为他们内部的存储结构是不一样的。

List:

|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!

|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。

|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

Vector

从 Java 2 平台 v1.2 开始,此类改进为可以实现
List 接口,使它成为 Java
Collections Framework
的成员。与新 collection 实现不同,Vector 是同步的。

从以下版本开始:

JDK1.0 (元老级,很早就出现了)

现在几乎不用vector了,那遇到多线程的程序怎么办呢?那就给ArrayList加锁使用(把添加和删除的方法放在同一个锁中就可以了)。现在几乎不用vector了。

ArrayList  :List 接口的大小可变数组的实现。

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

数组不是固定长度吗?

集合怎么实现不断向里面添加元素?

是用可变长度数组原理。创建新数组,将原来数组中的内容都复制到新数组中来。

Vector是百分之百延长.

ArrayList是百分之五十延长,相比Vector既浪费空间又浪费效率。

ArrayList 内部是数组,是一片连续的空间,所以查找很快。

附录一些源码:

关于ArrayList.class中内部存储元素数组的增长

     /**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}

如果增加的元素超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1.

然后将原数组的内容复制到新数组中,并且后续增加的内容都会放到新数组当中.当新数组无法

容纳增加的元素时,重复该过程.

同理LinkedList因为元素在内存中不是连续的是分散的所以查询很慢。

LinkedList有角标吗?

有角标,是List的子类。LinkedList本身不是数组,是链表结构,也是有角标的。虽然他们都有编号,但是就是在内存连续与否造成的查询和增删的快慢。

作业:

1,自己去查文档演示Vector中的elements()方法。

2,LinkedList中的,addFirst addLast getFirst,getLast  removeFirst removeLast。

3,既然集合是存储对象的,请定义ArryaList集合,并存储Person对象。如new Person("lisi",20);

并取出。将姓名和年龄打印出来。

关于JDK中的集合总结(一)的更多相关文章

  1. 关于JDK中的集合总结(二)

    1.2版本的JDK才出现的java集合框架. 下面介绍说一下Vector的一些特点. import java.util.Enumeration; import java.util.Iterator; ...

  2. 关于JDK中的集合总结(三)

    泛型: jdk1.5出现的安全机制. 好处: 1,将运行时期的问题ClassCastException转到了编译时期. 2,避免了强制转换的麻烦. <>:什么时候用?当操作的引用数据类型不 ...

  3. 集合篇 —— Collection(1):JDK 中的重复实现问题

    1.      问题的提出 在 Java 的集合体系当中,无论是 List(列表)还是 Set(集),在设计的时候都存在一个很奇怪的现象:这两种集合的接口,Java 都为其设计了抽象类 Abstrac ...

  4. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  5. JDK中工具类的使用

    JDK中内置了很多常用的工具类,且多以“s”结尾,如:集合工具类Collections,数组工具类Arrays,对象工具类Objects,文件工具类Files,路径工具类Paths,数学工具类Math ...

  6. (转载)JDK中的设计模式

    写的很好,学习道路更轻松一些 原文地址:http://blog.csdn.net/gtuu0123/article/details/6114197 JDK中设计模式 分类: Java相关 设计模式 2 ...

  7. 初探Java设计模式4:JDK中的设计模式

    JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现 ...

  8. JDK中所包含的设计模式

    本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助. 一.设计模式是什么(1)反复出现问题的解决方案( ...

  9. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

随机推荐

  1. Java设计模式系列之适配器模式

    适配器模式的定义 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.(就类似于我们充电器的转接头将220V的电压转换成我们的手机端 ...

  2. nyoj 118 修路方案(最小生成树删边求多个最小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修 ...

  3. ASP.NET面试题总结

    1.ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释ASP.NET身份验证模式包括Windows.Forms(窗体).Passport(护照)和None(无). 1.Windows身 ...

  4. Contest 7.21(贪心专练)

    这一次都主要是贪心练习 练习地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#overview Problem APOJ 13 ...

  5. C#学习笔记(二):继承、接口和抽象类

    继承 密封类 密封类(关键字sealed)是不允许其它类继承的,类似Java中的final关键字. public sealed class SealedClassName { //... } 初始化顺 ...

  6. delete数组引发的core分析

    delete [] ptr 引发了singnal 6 abort的core错误,跟踪过程发现写入ptr大量数据,引发内存越界,破坏了new数组的尾部数据保护,导致delete的时候core. 问题分析 ...

  7. 正整数的n次方求和

    引理: (Abel分部求和法) $$\sum_{k=1}^{n}a_{k}b_{k}=A_{n}b_{n}+\sum_{k=1}^{n-1}A_{k}(b_{k}-b_{k+1})$$其中$A_{k} ...

  8. 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)

    概述: 我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉. ...

  9. 一次线上OOM故障排查经过

    转贴:http://my.oschina.net/flashsword/blog/205266 本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以 ...

  10. Codeforces Round #327 (Div. 2) D. Chip 'n Dale Rescue Rangers 二分 物理

    D. Chip 'n Dale Rescue Rangers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/co ...