java基础之集合

来源:互联网 发布:wow60数据库 编辑:程序博客网 时间:2024/06/06 03:56
* A:集合的由来
* 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 
* B:数组和集合的区别
   * 区别1 : 
* 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
* 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
* 区别2:
* 数组长度是固定的,不能自动增长
* 集合的长度的是可变的,可以根据元素的增加而增长

* C:数组和集合什么时候用
 * 1,如果元素个数是固定的推荐用数组

  * 2,如果元素个数不是固定的推荐用集合


【Collection集合图谱】


Collection基本功能

boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()


Collection集合的带All功能

                boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)


当集合存入元素之后,使用迭代器进行遍历

* A:迭代器概述
* 集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历) 
* B:案例演示
* 迭代器的使用

Collection c = new ArrayList();

  //向集合中添加元素
c.add("a");
c.add("b");
c.add("c");
c.add("d");

Iterator it = c.iterator();//获取迭代器的引用
while(it.hasNext()) {//集合中的迭代方法(遍历)
System.out.println(it.next());
}

集合框架(Collection存储自定义对象并遍历)

              // Collection存储自定义对象并用迭代器遍历

Collection c = new ArrayList();

c.add(new Student("张三",23));
c.add(new Student("李四",24));
c.add(new Student("王五",25));
c.add(new Student("赵六",26));
c.add(new Student("赵六",26));

for(Iterator it = c.iterator();it.hasNext();) {
Student s = (Student)it.next();//向下转型
System.out.println(s.getName() + "," + s.getAge());//获取对象中的姓名和年龄
}
System.out.println("------------------------------");
Iterator it = c.iterator();//获取迭代器
while(it.hasNext()) {//判断集合中是否有元素
//System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
Student s = (Student)it.next();//向下转型
System.out.println(s.getName() + "," + s.getAge());//获取对象中的姓名和年龄
}

List集合是Collection的子接口

list具备Collection的特点,并且list具有自己的特点

{

        * void add(int index,E element)
* E remove(int index)
* E get(int index)
* E set(int index,E element)


}

【1】ArrayList是list接口的实现类

A:案例演示List集合存储学生对象并遍历
             * 通过size()和get()方法结合使用遍历。


List list = new ArrayList();
list.add(new Student("张三", 18));
list.add(new Student("李四", 18));
list.add(new Student("王五", 18));
list.add(new Student("赵六", 18));

for(int i = 0; i < list.size(); i++) {
Student s = (Student)list.get(i);
System.out.println(s.getName() + "," + s.getAge());
}


list集合在并发的情况下会出现ConcurrentModificationException异常

案例:判断list集合里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素

List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");

/*Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee");//这里会抛出ConcurrentModificationException并发修改异常
}
}*/

这样做显然不行

解决方案
1:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
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");
}
}


listIterator给我们提供了以下功能

boolean hasNext()是否有下一个
 boolean hasPrevious()是否有前一个
Object next()返回下一个元素
Object previous();返回上一个元素

【2】Vector的特有功能,已过时,很少用

Vector的迭代
Vector v = new Vector();//创建集合对象,List的子类
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");

//Vector迭代
Enumeration en = v.elements();//获取枚举
while(en.hasMoreElements()) {//判断集合中是否有元素
System.out.println(en.nextElement());//获取集合中的元素
}

【3】List的三个子类的特点

{

ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
       Vector相对ArrayList查询慢(线程安全的)
       Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。


Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的



}


如何区分什么时候使用数组或链表

* A:数组
* 查询快修改也快,是根据索引找到值
* 增删慢,增加的话,需要将后面的元素往后移动,删除需要往前移动
* B:链表
* 查询慢,修改也慢
* 增删快








































0 0
原创粉丝点击