对象数组的概述和使用:
需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息
Student[ ] arr = new Student[5]; //存储学生对象
arr[0] = new Student("张三",23);
arr[1] = new Student("李四",24);
arr[2] = new Student("王五",25);
arr[3] = new Student("赵六",26);
arr4] = new Student("老马",20);
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
import com.bean.Student; public class Demo1 { public static void main(String[] args) { // int[] arr = new int[5]; //创建基本数据类型数组 Student[] arr = new Student[5]; // 创建引用数据类型数组 arr[0] = new Student("张三", 23); //创建一个学生对象,存储在数组的第一个位置 arr[1] = new Student("李四", 24); //创建一个学生对象,存储在数组的第二个位置 arr[2] = new Student("王五", 25); //创建一个学生对象,存储在数组的第三个位置 arr[3] = new Student("赵六", 26); //创建一个学生对象,存储在数组的第四个位置 arr[4] = new Student("老马", 20); //创建一个学生对象,存储在数组的第五个位置 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
注:数组和集合存储引用数据类型,存的都是地址值
集合的由来及集合继承体系图:
A:集合的由来
数组长度是固定的,当添加元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,
能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
B:数组和集合的区别:
区别1:
数组即可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
区别2:
数组长度是固定的,不能自动增长
集合的长度是可变的,可以根据元素的增长而增长
C:数组和集合什么时候用
1、如果元素个数是固定的推荐使用数组
2、如果元素个数不是固定的推荐使用集合
Collection集合的基本功能测试:
注意:collectionXxx.java使用了未经检查或不安全的操作
import java.util.ArrayList; import java.util.Collection; import com.bean.Student; public class Demo2 { /** * add方法如果是List集合一直都返回true,因为List集合中是可以存储重复元素的 * 如果是Set集合当存储重复元素的时候,就会返回false * * ArrayList的父类的父类重写toString方法,所以在打印对象的引用的时候,输出的结果不是object类中toString的结果 */ public static void main(String[] args) { // demo1(); Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); // c.remove("b"); //删除指定元素 // c.clear(); //清空集合 // System.out.println(c.contains("b")); //判断是否包含 // System.out.println(c.isEmpty()); System.out.println(c.size()); //获取元素的个数 System.out.println(c); } public static void demo1() { Collection c = new ArrayList(); boolean b1 = c.add("abc"); boolean b2 = c.add(true); boolean b3 = c.add(100); boolean b4 = c.add(new Student("张三",23)); boolean b5 = c.add("abc"); System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(c.toString()); } }
集合的遍历之集合转数组遍历:
集合的遍历:其实就是一次获取集合中的每一个元素
public static void demo2() { Collection c = new ArrayList(); c.add(new Student("张三",29)); c.add(new Student("李四",24)); c.add(new Student("王五",26)); c.add(new Student("赵六",22)); Object[] arr = c.toArray(); //将集合转换成数组 for (int i = 0; i < arr.length; i++) { //System.out.println(arr[i]); Student s = (Student)arr[i]; //向下转型 System.out.println(s.getName() + "..." + s.getAge()); } } public static void demo1() { Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); Object[] arr = c.toArray(); //将集合转换成数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
Collection集合的带All功能测试:
public static void demo4() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("z"); //取交集,如果调用的集合改变就返回true,如果调用的集合不变就返回false boolean b = c1.retainAll(c2); //取交集 System.out.println(b); System.out.println(c1); } public static void demo3() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("z"); boolean b = c1.containsAll(c2); //判断调用的集合是否包含传入的集合 System.out.println(b); } public static void demo2() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("z"); boolean b = c1.removeAll(c2); System.out.println(b); System.out.println(c1); } public static void demo1() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("c"); c2.add("d"); // c1.addAll(c2); //将c2中的每一个元素添加到c1中 c1.add(c2); // 将c2看成一个对象添加到c1中 System.out.println(c1); }
集合的遍历之迭代器遍历:
概述:
集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)
public static void demo2() { Collection c = new ArrayList(); c.add(new Student("张三",29)); c.add(new Student("李四",24)); c.add(new Student("王五",26)); c.add(new Student("赵六",22)); //获取迭代器 Iterator it = c.iterator(); while (it.hasNext()) { //System.out.println(it.next()); Student s = (Student)it.next(); //向下转型 System.out.println(s.getName() + "..." + s.getAge()); } } public static void demo1() { 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.println(obj1); boolean b2 = it.hasNext(); //判断集合中是否有元素,有就返回true Object obj2 = it.next(); System.out.println(b2); System.out.println(obj2);*/ while (it.hasNext()) { System.out.println(it.next()); } }
Collection存储自定义对象并遍历:
迭代器的原理及源码解析:
A:迭代器原理
迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和
取都是不一样的,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以
的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,
定义自己的迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,
第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
B:迭代器源码解析
1、在eclipse中Ctrl + shift + t 找到ArrayList类
2、Ctrl + o查找iterator()方法
3、查看返回值是new Itr(),说明Itr这个类实现Iterator接口
4、查找Itr这个内部类,发现重写了Iterator中的所有抽象方法
List集合的特有功能概述和测试:
概述:
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
public static void demo5() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.set(1, "z"); //将指定位置的元素修改 System.out.println(list); } public static void demo4() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); //Object obj = list.get(2); //System.out.println(obj); //通过索引遍历list集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } public static void demo3() { List list = new ArrayList(); list.add(111); list.add(222); list.add(333); list.add(444); list.remove(111); //删除的时候不会自动装箱,把111当作索引 System.out.println(list); } public static void demo2() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); Object obj = list.remove(1); //通过索引删除元素,被删除的元素返回 System.out.println(obj); System.out.println(list); } public static void demo1() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add(4,"f"); //index <= size并且index >= 0都不会 报异常 //list.add(1,"e"); //list.add(10,"z"); //java.lang.IndexOutOfBoundsException,当存储时使用不存在索引时 System.out.println(list); }
List集合存储学生对象并遍历:
import java.util.List; import java.util.ArrayList; import com.bean.Student; public class Demo2 { public static void main(String[] args) { List list = new ArrayList(); list.add(new Student("张三",29)); list.add(new Student("李四",24)); list.add(new Student("王五",26)); list.add(new Student("赵六",22)); for (int i = 0; i < list.size(); i++) { //System.out.println(list.get(i)); //通过索引获取每一个元素 Student s = (Student)list.get(i); System.out.println(s.getName() + "..." + s.getAge()); } } }
并发修改异常产生的原因及解决方案:
A:需求:
我有一个集合,请问,我想判断里面有没有“world”这个元素,如果有,我就添加一个“javaee”元素
,请写代码实现
B:ConcurrentModificationException出现
迭代器遍历,集合修改集合
C:解决方案
a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
b:集合遍历元素,集合修改元素
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class Demo3 { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("world"); list.add("d"); list.add("f"); /* Iterator it = list.iterator(); //获取迭代器 while (it.hasNext()) { //判断集合中是否有元素 String str = (String)it.next(); //向下转型 if ("world".equals(str)) { list.add("javaee"); //遍历的同时在增加元素,并发修改ConcurrentModificationException } }*/ ListIterator lit = list.listIterator(); //获取迭代器(List集合特有的) while (lit.hasNext()) { String str = (String)lit.next(); //向下转型 if ("world".equals(str)) { //list.add("javaee"); //遍历的同时在增加元素,并发修改ConcurrentModificationException lit.add("javaee"); } } System.out.println(list); } }
数据结构之数组和链表:
A:数组
查询快修改也快
B:链表
查询慢,修改也慢
增删快
List的三个子类的特点:
A:特点
ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
Vector和ArrayList的区别:
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别:
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢