java基础复习(十四)

1.对象数组的概述

//创建基本数据类型数组

//创建引用数据类型数据

数组是有弊端的,数组的长度是固定的,当添加元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。

2.数组和集合的区别

区别1:

  • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值引用数据类型存储的是地址值
  • 集合只能存储引用数据类型对象,集合中也可以存储基本数据类型但是在存储的时候会自动装箱编程对象。

区别2:

  • 数组长度时固定的,不能自动增长
  • 集合的长度的是可变的,可以根据元素的增加而增加

数组和集合什么时候使用:

  • 如果元素个数是固定的推荐用数组
  • 如果元素个数不是固定的推荐用集合

【固定是长处也是短处,部分集合的底层也用的是数组】

集合继承体系图

img

Collection 【接口,接口不能创建对象】

java.util.Collection

Collection<E>泛型 JDK1.5才出现泛型

Collection c = new ArrayList();//查看ArrayList的源码
boolean b1 = c.add("abc");
boolean b2 = c.add(true); //自动装箱 这种基本数据类型变成对象的 都是自动装箱
boolean b3 = c.add(100);
boolean b4 = c.add(new Student("张三",23));
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
System.out.println(c);
//注解:@SuppressWarning({"rawtypes","unchecked"}) 原始类型 不检查

方法摘要:

1.add 添加 【List里面一直都是true,而因为set里面是不能存重复的,所以有false】

ArrayList的父类的父类重写toString方法,所以在打印对象的引用的时候,输出结果不是类+hash码

2.remove()

3.clear()

4.isEmpty()

集合的遍历

  • 其实就是一次获取集合中的每一个元素

案例演示

  • 把集合转成数组,可以实现集合的遍历
  • toArray()
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Object[] arr = c.toArrayList();

带All的功能演示:

boolean addAll(Collection c)

boolean removeAll(Collection c)//

boolean containsAll(Collection c) //判断调用的集合是否包含传入的集合

boolean retainAll(Collection c)//取交集 如果调用的集合改变就返回true,如果调用的集合不变就返回false

集合的遍历 迭代器概述

集合是用来存储信息的,存储的元素需要查看,要查看就需要迭代

Iterator

Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");

Iterator it = c.iterator();//获取迭代器
/*boolean b1 = it.hasNext();//判断集合中是否有元素,有就返回true
Object obj1 = it.next();
System.out.println(b1);
System.out.pritnln(obj1);
*/
while(it.hasNext()) {
    System.out.println(it.next());
}
Collection c = new ArrayList();
c.add(new Student("zhangsan1",231));//此处传进去上转型为Object类型了
c.add(new Student("zhangsan2",232));
c.add(new Student("zhangsan3",233));
c.add(new Student("zhangsan4",234));

Iterator it = c.iterator();//获取迭代器
while(it.hasNext()) {
    Student s =(Student)it.next(); //向下转型 Object类型转为Student类型
    System.out.println(s.getName()+s.getAge());
}

迭代器的原理

迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么久需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己的迭代方式,这样做的好处有二:

第一:规定了整个集合体系的遍历方式都是hasNext()和next()方法

第二:代码有底层内部实现,使用者不用管怎么实现的,会用即可。

迭代器源码解析

1.在eclipse中ctrl+shift+t找到ArrayList类

2.ctrl+o查找iterator()方法

3.查看返回值类型new Itr(),说明Itr

java.util.List

List集合的特有功能

在指定位置添加元素

当存储时,使用不存索引的时候,就会出现索引越界异常。index<=size

//删除 通过索引删除 删除的时候不会自动装箱 把111当作list

//通过索引遍历list集合

并发修改异常

迭代之中 增加了一个元素 就叫做并发修改

遍历的同时再增加元素

解决方案:通过ListIterator的特有功能add

ListIterator lit = list.listIterator();
while(lit.hasNex()){
    String str =(String)lit.next();
    if("world".equals(str)){
        lit.add("javaee");
    }
}

Vector类的特有功能

数据

  • 查询快修改快
  • 增删慢【切断复制 原理】

链表

  • 查询慢,修改也慢
  • 增删快【后面的对象记录前面的人的地址值】

List的三个子类的特点:

ArrayList:底层数据结构是数组,查询快,增删慢

线程不安全,效率高

Vector:

底层数据 结构是数组,查询快,增删慢

线程安全,效率低

LinkedList:

底层数据结构是链表,查询慢,增删快

线程不安全,效率高

Vector相对ArrayList查看查询慢(线程安全)

Vector相对LinkedLIst增删慢(数据结构)

Vector和ArrayList的区别

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高。

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快。

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢。

List有三个儿子,我们到底该用谁?

查询多用ArrayList

增删多用LinkedList

如果都多用ArrayList

将线程不安全的集合变成线程安全的工具类

本文链接:

https://heyzen.club/index.php/J/252.html
1 + 7 =
快来做第一个评论的人吧~