集合:
    我们学习的是面向对象语言,而面向对象语言是对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储,而要想存储对个对象,就不能是一个基本的变量,而应该是一个容器的变量,在目前所学的知识,容器类型的有:数组和StringBuffer,但是StringBuffer 的结果是个字符串,所以我们只能选择数组,这就是对象数组。而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,java就提供了集合类供我们使用。

    数组和集合的区别:
    1、长度区别:
    数组长度固定
    集合长度可变
    2、内容不同:
    数组存储的是同一类型的元素
    集合存储的是不同类型的元素
    3、元素的数据类型
    数组可以存储基本类型,也可以存储引用类型
    集合只能存储引用类型(只能用来装对象)

    集合是存储多个元素的,存储多个元素会有不用的需求,比如:不能出现相同的元素,或者按照某一规则进行排序,针对不同的需求,java就提供了不同的集合类,这过个集合的数据结构不同。结构不同不重要,重要的是能够存储东西,并且还要能够使用;那么这多个集合使用共性的内容的,我们这这些集合类的共性不断向上提取,最终就能形成集合的继承体系结构。

    java提供多种集合类,而他们的数据结构不同,但是肯定会有共性的内容(判断,获取,存储等)通过不断地向上提取,我们就可以得到一个集合的继承体系结构图:

    Collection(集合)
    Collection.png
    分析:从具体到抽象
    实现:从抽象到具体
    使用:使用具体类

    数据结构:数据的存储方式

    Collection :是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的有无序的,
    1、添加
    boolean add(Object obj) //添加一个元素
    boolean addAll(Collection c) //添加一个集合的元素
    2、删除
    void clear() //移除所有元素
    boolean remove(Object obj) //移除一个元素
    boolean remove(Collection c) //移除一个集合的元素
    3、判断
    boolean contains(Object o) //判断集合是否包含指定的元素
    boolean contains(Collection c) //判断集合是否包含指定的集合元素
    boolean isEmpty() //判断集合是否为空
    4、获取(查找)
    Iterator<E> iterator()

    5、长度功能:
    int size() //元素的个数
    6、交集功能:
    boolean retainAll(Collection c) //两个集合都有的元素
    7、把集合转换为数组
    Object [ ] toArray

    1. package cn.Collection;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. /**
    5. * Collection :是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的有无序的,
    6. * 1、添加
    7. * boolean add(Object obj) //添加一个元素
    8. * boolean addAll(Collection c) //添加一个集合的元素
    9. * 2、删除
    10. * void clear() //移除所有元素
    11. * boolean remove(Object obj) //移除一个元素
    12. * boolean remove(Collection c) //移除一个集合的元素
    13. * 3、判断
    14. * boolean contains(Object o) //判断集合是否包含指定的元素
    15. * boolean contains(Collection c) //判断集合是否包含指定的集合元素
    16. * boolean isEmpty() //判断集合是否为空
    17. * 4、获取(查找)
    18. * Iterator<E> iterator()
    19. * 5、长度功能:
    20. * int size() //元素的个数
    21. * 6、交集功能:
    22. * boolean retainAll(Collection c) //两个集合都有的元素
    23. * 7、把集合转换为数组
    24. * Object [ ] toArray
    25. *
    26. * */
    27. public class CollectionDemo {
    28. public static void main(String[] args) {
    29. //测试不带All的方法
    30. //创建集合对象
    31. //Collection c = new Collection() //这是错误的,接口不能实例化
    32. Collection c = new ArrayList();
    33. //boolean add(Object obj) //添加一个元素
    34. //System.out.println("add= "+ c.add("hello"));
    35. c.add("hello");
    36. c.add("world");
    37. c.add("java");
    38. //void clear() 移除所有元素
    39. //c.clear(); // c.clear();移除所有元素
    40. // System.out.println("remove= "+c.remove("hello")); //c = [world, java] 移除hello
    41. // System.out.println("remove = "+ c.remove("hhhh")); //判断不在给集合的元素,就false
    42. //boolean contains(Object o) //判断集合是否包含指定的元素
    43. // System.out.println("contains = " + c.contains("hello"));
    44. // System.out.println("contains = "+ c.contains("heee")); //false
    45. //boolean is Empty() //判断集合是否为空
    46. //c.clear();//移除元素, 但是c = [],还有规则
    47. System.out.println("isEmpty= " + c.isEmpty()); //false
    48. //int size 长度
    49. System.out.println("size= " + c.size());
    50. System.out.println("c = " + c);
    51. }
    52. }
    1. package cn.Collection;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. /**
    5. * Collection :是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的有无序的,
    6. * 1、添加
    7. * boolean add(Object obj) //添加一个元素
    8. * boolean addAll(Collection c) //添加一个集合的元素
    9. * 2、删除
    10. * void clear() //移除所有元素
    11. * boolean remove(Object obj) //移除一个元素
    12. * boolean removeAll(Collection c) //移除一个集合的元素
    13. * 3、判断
    14. * boolean contains(Object o) //判断集合是否包含指定的元素
    15. * boolean contains(Collection c) //判断集合是否包含指定的集合元素
    16. * boolean isEmpty() //判断集合是否为空
    17. * 4、获取(查找)
    18. * Iterator<E> iterator()
    19. * 5、长度功能:
    20. * int size() //元素的个数
    21. * 6、交集功能:
    22. * boolean retainAll(Collection c) //两个集合都有的元素
    23. * 7、把集合转换为数组
    24. * Object [ ] toArray
    25. *
    26. * */
    27. public class CollectionDemo_02 {
    28. public static void main(String[] args) {
    29. //测试带All的对象
    30. //创建集合对象1
    31. Collection c1 = new ArrayList();
    32. c1.add("abc1");
    33. c1.add("abc2");
    34. c1.add("abc3");
    35. c1.add("abc4");
    36. //创建集合对象2
    37. Collection c2 = new ArrayList();
    38. // c2.add("abc1");
    39. // c2.add("abc2");
    40. // c2.add("abc3");
    41. // c2.add("abc4");
    42. //c2.add("abc4"); //可以重复,同样可以输出
    43. c2.add("abc5");
    44. c2.add("abc6");
    45. c2.add("abc7");
    46. //boolean addAll(Collection c) //添加一个集合的元素
    47. //System.out.println("addAll= "+ c1.addAll(c2)); //在c1里面添加了c2 的集合元素
    48. //boolean removeAll(Collection c) //移除一个集合的元素
    49. //System.out.println("removeAll= " + c1.removeAll(c2)); //只要移除一个元素,就返回true
    50. //boolean containsAll(Collection c) 判断集合中是否包含了指定元素的集合
    51. //System.out.println("containsAll = " + c1.containsAll(c2)); //只有包含所有的元素(只有包含所有的元素才叫包含),才会true
    52. //boolean retainAll(Collection c) //两个集合都有的元素
    53. /**
    54. * 假设有两个集合与B
    55. * A对B做交集,最终的结果保存在A中,B不变,
    56. * 返回值表示的是A是否发生了改变
    57. * */
    58. System.out.println("retainAll = "+ c1.retainAll(c2));
    59. System.out.println("c1 = " + c1);
    60. System.out.println("c2 = " + c2);
    61. }
    62. }
    1. package cn.Collection;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. /**
    5. * 集合的遍历:依次获取集合中的每一个元素
    6. * Object[] toArray 把集合转成数组
    7. *
    8. * */
    9. public class CollectionDemo_03 {
    10. public static void main(String[] args) {
    11. //创建集合对象
    12. Collection c = new ArrayList();
    13. //添加元素
    14. c.add("hello"); //Object obj = "hello";向上转型
    15. c.add("world");
    16. c.add("java");
    17. //遍历
    18. //Object [] toArray()
    19. Object[] obj = c.toArray();
    20. for (int x = 0; x < obj.length; x++) {
    21. //System.out.println(obj[x]);
    22. //如何获取元素的同时获取字符串的长度
    23. // System.out.println(obj[x] + "---" + obj[x].length); //因为Object没有length方法
    24. //如果要获取长度就必须转为字符串
    25. //向下转型
    26. String s = (String )obj[x];
    27. System.out.println("s = " + s+"---"+s.length());
    28. }
    29. }
    30. }
    1. package Iterator;
    2. import javax.naming.spi.ObjectFactoryBuilder;
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. import java.util.Iterator;
    6. /**
    7. * Iterator iterator() 迭代器,集合专门用来遍历
    8. *
    9. * Object next() 获取元素,并移到下一个位置
    10. * boolean hasNext(); 如果仍还有元素可以迭代,则返回true
    11. *
    12. *
    13. *
    14. * */
    15. public class IteratorDemo_01 {
    16. public static void main(String[] args) {
    17. //创建结合对象
    18. Collection c = new ArrayList();
    19. //创建并添加元素
    20. // String s = "hello";
    21. // c.add(s);
    22. c.add("hello");
    23. c.add("world");
    24. c.add("java");
    25. //Iterator iterator() 迭代器
    26. Iterator it = c.iterator(); //返回的是子类对象,这里是多态
    27. // Object obj = it.next();
    28. // System.out.println("obj = " + obj);
    29. // System.out.println(it.next());
    30. // System.out.println(it.next());
    31. // System.out.println(it.next());
    32. // System.out.println(it.next()); //会报错
    33. //最后一个不应该写,在前面应该加一个判断,判断是否有下一个元素,
    34. /*
    35. if(it.hasNext()){
    36. System.out.println(it.next());
    37. }
    38. if(it.hasNext()){
    39. System.out.println(it.next());
    40. }
    41. if(it.hasNext()){
    42. System.out.println(it.next());
    43. }
    44. if(it.hasNext()){
    45. System.out.println(it.next());
    46. }
    47. */
    48. while(it.hasNext()){
    49. //System.out.println(it.next());
    50. String s = (String) it.next(); //因为next的返回Object
    51. System.out.println("s = " + s);
    52. }
    53. }
    54. }
    1. package Iterator;
    2. import cn.CollectionTest.Student;
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. import java.util.Iterator;
    6. /**
    7. * 使用集合存储5名学生对象,然后使用迭代器遍历
    8. *
    9. * */
    10. public class IteratorTest {
    11. public static void main(String[] args) {
    12. //创建集合对象
    13. Collection c = new ArrayList();
    14. //创建学生对象
    15. Student s1 = new Student("小明", 27);
    16. Student s2 = new Student("小红", 30);
    17. Student s3 = new Student("小东", 33);
    18. Student s4 = new Student("小丽", 25);
    19. Student s5 = new Student("小王", 22);
    20. //把学生对象添加到集合:
    21. c.add(s1);
    22. c.add(s2);
    23. c.add(s3);
    24. c.add(s4);
    25. c.add(s5);
    26. //遍历
    27. Iterator it = c.iterator();
    28. while(it.hasNext()){
    29. //System.out.println(it.next()); //如果重写了toString方法,这样就不会输出地址值
    30. //System.out.println("-----------------");
    31. Student s = (Student)it.next(); //如果没有重写toString方法,可以这样使用
    32. System.out.println(s.getName()+"---"+ s.getAge());
    33. }
    34. }
    35. }
    1. package Iterator;
    2. import cn.CollectionTest.Student;
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. import java.util.Iterator;
    6. /**
    7. * 使用集合存储5名学生对象,然后使用迭代器遍历
    8. *
    9. * */
    10. public class IteratorTest_02 {
    11. public static void main(String[] args) {
    12. //创建集合对象
    13. Collection c = new ArrayList();
    14. //创建学生对象
    15. Student s1 = new Student("小明", 27);
    16. Student s2 = new Student("小红", 30);
    17. Student s3 = new Student("小东", 33);
    18. Student s4 = new Student("小丽", 25);
    19. Student s5 = new Student("小王", 22);
    20. //把学生对象添加到集合:
    21. c.add(s1);
    22. c.add(s2);
    23. c.add(s3);
    24. c.add(s4);
    25. c.add(s5);
    26. //遍历
    27. Iterator it = c.iterator();
    28. while(it.hasNext()){
    29. //System.out.println(it.next()); //如果重写了toString方法,这样就不会输出地址值
    30. //System.out.println("-----------------");
    31. Student s = (Student)it.next(); //如果没有重写toString方法,可以这样使用
    32. System.out.println(s.getName()+"---"+ s.getAge());
    33. //System.out.println(((Student)it.next()).getName()+"---"+((Student)it.next()).getAge()); //这样会报错
    34. //不要多次使用it.next()
    35. }
    36. //用for循环改进(这个效率高)
    37. // for(Iterator it = c.iterator(); it.hasNext();){
    38. // Student s = (Student)it.next();
    39. // System.out.println(s.getName()+ "---" +s.getAge());
    40. // }
    41. //
    42. }
    43. }

    Iterator
    迭代器:是集合遍历的一种方式
    迭代器:是依赖于Collection而存在的

    集合的使用步骤
    1、创建集合对象:
    Collection c = new ArrayList();

    2、创建元素对象并添加:
    Student s = new Student(“小明”,23);

    3、把元素添加到集合中
    c.add(s);

    4、遍历
    a、通过集合获取迭代器对象
    Iterator it = c.iterator();
    b、通过迭代器对象的hasNext()方法判断是否有元素
    c、通过迭代器的next()方法获取元素并移动到下一个位置

    Iterator 的使用方法

    1. Iterator it = c.iterator();
    2. while(it.hasNext()){
    3. //System.out.println(it.next()); //如果重写了toString方法,这样就不会输出地址值
    4. //System.out.println("-----------------");
    5. Student s = (Student)it.next(); //如果没有重写toString方法,可以这样使用
    6. System.out.println(s.getName()+"---"+ s.getAge());
    7. //System.out.println(((Student)it.next()).getName()+"---"+((Student)it.next()).getAge()); //这样会报错
    8. //不要多次使用it.next()
    9. }
    10. //用for循环改进(这个效率高)
    11. // for(Iterator it = c.iterator(); it.hasNext();){
    12. // Student s = (Student)it.next();
    13. // System.out.println(s.getName()+ "---" +s.getAge());
    14. // }
    1. package cn.Collection;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. import java.util.Iterator;
    5. /**
    6. * 需求:储存自定义对象并遍历;String(name,age)
    7. *
    8. * 分析:
    9. * 1、创建学生类
    10. * 2、创建集合类
    11. * 3、创建学生对象
    12. * 4、把学生对象添加到集合对象中
    13. * 5、遍历
    14. *
    15. * */
    16. public class CollectionTest {
    17. public static void main(String[] args) {
    18. //创建集合集合对象
    19. Collection c = new ArrayList();
    20. //创建学生对象
    21. Student s1 = new Student("貂蝉", 25);
    22. Student s2 = new Student("小婵", 16);
    23. Student s3 = new Student("黄月英", 20);
    24. Student s4 = new Student();
    25. s4.setName("大乔");
    26. s4.setAge(24);
    27. //把学生对象添加到集合中
    28. c.add(s1);
    29. c.add(s2);
    30. c.add(s3);
    31. c.add(s4);
    32. c.add(new Student("孙尚香",19)); //匿名对象
    33. //遍历
    34. // Iterator it = c.iterator();
    35. // while(it.hasNext()){
    36. // //System.out.println(it.next());
    37. // Student s = (Student )it.next();
    38. // System.out.println(s.getName()+"---"+ s.getAge());
    39. for(Iterator it = c.iterator();it.hasNext();){
    40. Student s = (Student)it.next();
    41. System.out.println(s.getName()+"---"+s.getAge());
    42. }
    43. }
    44. }
    • 分析:
      1、创建学生类
      2、创建集合类
      3、创建学生对象
      4、把学生对象添加到集合对象中
      * 5、遍历

    List的特有功能:
    a、添加功能:
    void add(int index;Object element) //在指定位置添加元素
    b、获取功能:
    Object get(int index) //获取指定位置的元素
    c、列表迭代器:
    ListIterator listIterator() List集合特有的迭代器
    d、删除功能:
    Object remove(int index) //根据索引删除元素;返回被删除元素
    e、修改功能:
    Object set(int index,Object element) //根据索引修改元素,返回被修改的元素

    1. package cn.List;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * List集合的特有功能:
    6. * a、添加功能:
    7. * void add(int index;Object element) //在指定位置添加元素
    8. * b、获取功能:
    9. * Object get(int index) //获取指定位置的元素
    10. * c、列表迭代器:
    11. * ListIterator listIterator() List集合特有的迭代器
    12. * d、删除功能:
    13. * Object remove(int index) //根据索引删除元素;返回被删除元素
    14. * e、修改功能:
    15. * Object set(int index,Object element) //根据索引修改元素,返回被修改的元素
    16. *
    17. *
    18. * */
    19. public class ListDemo_02 {
    20. public static void main(String[] args) {
    21. //创建集合对象
    22. List list = new ArrayList();
    23. //添加元素
    24. list.add("hello");
    25. list.add("world");
    26. list.add("java");
    27. //调用方法
    28. //添加功能 void add(int index,Object element) //在指定位置添加元素
    29. // list.add(1,"你好");
    30. //list.add(11,34); //索引越界
    31. //list.add(3,"javaEE"); //没有问题
    32. //list.add(4,"javaEE"); //有问题
    33. //Object get(int index); //获取制定位置的元素
    34. //System.out.println(list.get(1));
    35. //System.out.println(list.get(12)); //索引越界
    36. //Object remove(int index) //根据索引删除元素,返回删除元素
    37. //System.out.println(list.remove(0));
    38. //Object set(int index,Object element) //根据索引元素修改元素,返回被修改元素
    39. System.out.println(list.set(1,"WOTLD"));
    40. System.out.println("list = " + list); //list = [hello, world, java]
    41. }
    42. }
    1. * list 集合特有的遍历功能
    2. * sizeget功能的结合
    3. *
    4. * 获取集合长度size
    5. * for(int x = 0 ;x<list.size() ;x++){
    6. * System.out.println("list = " + list.get(x)); //get 是获取每个元素
    7. * }
    1. package cn.List;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * list 集合特有的遍历功能
    6. * size和get功能的结合
    7. * <p>
    8. * 获取集合长度size
    9. * for(int x = 0 ;x<list.size() ;x++){
    10. * System.out.println("list = " + list.get(x)); //get 是获取每个元素
    11. * }
    12. */
    13. public class LIstDemo_03 {
    14. public static void main(String[] args) {
    15. //创建集合对象
    16. List list = new ArrayList();
    17. //添加元素
    18. list.add("hello");
    19. list.add("world");
    20. list.add("java");
    21. //获取元素
    22. // System.out.println("list = "+ list.get(0));
    23. // System.out.println("list = " +list.get(1));
    24. // System.out.println("list = "+ list.get(2));
    25. // for (int x = 0; x < 3; x++) {
    26. // System.out.println("list = " + list.get(x));
    27. // }
    28. //获取集合长度size
    29. for (int x = 0; x < list.size(); x++) { //size可以获取集合长度
    30. System.out.println("list = " + list.get(x)); //get 是获取每个元素
    31. }
    32. }
    33. }

    ListIterator

    1. package cn.ListIterator;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. import java.util.ListIterator;
    6. /**
    7. * List集合的特点:
    8. * 有序 (存储和输出的元素一致) 可重复
    9. * ListIterator listIterator() 列表迭代器
    10. * 该迭代器继承了Iterator迭代器,就可以直接使用hasNext()和next()方法
    11. *
    12. * 逆向遍历
    13. * Object previous() //获取列表的上一个元素
    14. * 判断
    15. * boolean hasPrevious()判断列表上面是否还有元素
    16. *
    17. * 注意:ListIterator 可以通过previous 进行逆向遍历,但是必须要先正向遍历,才能够逆向遍历(一般无意义,不使用)
    18. *
    19. *
    20. * */
    21. public class ListIteratorDemo {
    22. public static void main(String[] args) {
    23. //创建集合对象
    24. List list = new ArrayList();
    25. //添加元素
    26. list.add("hello");
    27. list.add("world");
    28. list.add("java");
    29. //ListIterator listIteratorI() //返回子类对象
    30. ListIterator lis = list.listIterator();
    31. while(lis.hasNext()){
    32. String s = (String)lis.next();
    33. System.out.println(s);
    34. }
    35. System.out.println("---------------");
    36. // System.out.println(lis.previous());
    37. // System.out.println(lis.previous());
    38. // System.out.println(lis.previous());
    39. while(lis.hasPrevious()){
    40. //System.out.println(lis.previous());
    41. String s = (String)lis.previous();
    42. System.out.println("s = " + s);
    43. }
    44. System.out.println("-------------------");
    45. // Iterator it = list.iterator();
    46. // while (it.hasNext()) {
    47. // String s = (String) it.next();
    48. // System.out.println(s);
    49. // }
    50. //
    51. // System.out.println("-----------------------");
    52. }
    53. }
    1. package cn.ListIterator;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. import java.util.ListIterator;
    6. /**
    7. * 问题:有一个集合,判断里面是否有“world,如果就添加”javaee
    8. *
    9. * ConcurrentModificationException: 当方法及测到对象的并发修改,但不允许这种修改时,抛出此异常
    10. * 产生的原因:
    11. * 迭代器是依赖集合而存在的,在判断成功后,集合添加了新的元素,而迭代器不知道,所以就报错,这个错交并发修改异常
    12. * 其实这个问题的描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的
    13. *
    14. * 解决方式:
    15. * 1、迭代器迭代元素,迭代器修改元素
    16. * 元素是在迭代元素之后,
    17. * 2、集合遍历元素,集合修改元素(普通for)
    18. * 元素是在集合的最后面
    19. *
    20. * */
    21. public class ListIteratorDemo_02 {
    22. public static void main(String[] args) {
    23. //创建List对象
    24. List list = new ArrayList();
    25. //添加元素
    26. list.add("hello");
    27. list.add("world");
    28. list.add("java");
    29. //迭代器遍历
    30. /* 错误的
    31. Iterator it = list.iterator();
    32. while(it.hasNext()){
    33. String s = (String)it.next();
    34. if("world".equals(s)){
    35. list.add("javaee");
    36. }
    37. }
    38. */
    39. /*
    40. //方式1:迭代器迭代元素,迭代器修改元素
    41. //Iterator 迭代器没有添加功能,所以只能使用子类接口ListIterator 中的添加功能
    42. ListIterator lit = list.listIterator();
    43. while(lit.hasNext()){
    44. String s = (String)lit.next();
    45. if("world".equals(s)){
    46. lit.add("javaee"); //这里是通过迭代器添加元素
    47. }
    48. }
    49. System.out.println("list = " + list);
    50. */
    51. //方式2:集合遍历元素,集合修改元素(普通for)
    52. for (int x = 0; x < list.size(); x++) {
    53. String s = (String) list.get(x);
    54. if ("world".equals(s)) {
    55. list.add("javaee");
    56. }
    57. }
    58. System.out.println("list = " + list);
    59. }
    60. }

    数据结构:数据结构的组织方式。
    面试题:常见的出具结构的优缺点?

    栈:先进后出
    入栈(压栈) A-B-C
    出栈(弹栈) C-B-A
    举例:
    弹夹:存子弹,从上面压进,出去的的是从上面的先出

    队列:先进先出
    入栈(压栈) A-B-C
    出栈(弹栈) A-B-C

    举例:
    买票,

    数组:
    存储同一类型的多个元素的容器,有索引,方便我们获取

    链表:
    由一个链子把多个节点连接起来的数据
    节点:由数组和地址组成,(数据和指针域组成)
    (数据就相当于数据,地址相当于指针域)

    image.png
    List的子类特点:
    ArrayList:
    底层数据结构是数组,查询快,增删慢
    线程不安全,效率高
    Vertor:
    底层数据结构是数组,查询快,增删慢
    线程安全,效率低
    LinkedList:
    底层数据结构是链表,查询慢,增删快
    线程不安全,效率高

    List怎么选择呢:
    要安全吗?
    要:vector(即是要安全也不使用)
    不要:ArrayList 或者LinkedList
    查询多:ArrayList:
    增删多:LinkedList

    如果什么都不会,那么就用ArrayList

    //ClassCastException 类转换异常 这里要注意类型是否一致

    1. package cn.Vector;
    2. import javax.swing.text.Element;
    3. import java.util.Enumeration;
    4. import java.util.Vector;
    5. /**
    6. * Vector的特有功能
    7. * 1、添加功能:
    8. * public void addElement(Object obd) ---add()
    9. * 2、获取功能:
    10. * public Object element(int index) ---get()
    11. * public Enumeration element() ---Iterator iterator
    12. * boolean hasMoreElement() ---haxNext()
    13. * Object nextElement() ---next()
    14. *
    15. * jdk 升级的原因
    16. * 1、安全
    17. * 2、效率
    18. * 3、简写化
    19. *
    20. * */
    21. public class VectorDemo {
    22. public static void main(String[] args) {
    23. //创建集合对象
    24. Vector v = new Vector();
    25. //添加元素
    26. v.addElement("hello");
    27. v.addElement("world");
    28. v.addElement("java");
    29. //遍历
    30. for(int x = 0; x<v.size();x++){
    31. String s = (String)v.elementAt(x);
    32. System.out.println("s = " + s);
    33. }
    34. System.out.println("----------------");
    35. // Enumeration en = v.elements();
    36. // while(en.hasMoreElements()){
    37. // String s = (String)en.nextElement();
    38. // System.out.println(s);
    39. // }
    40. for(int x = 0 ; x< v.size(); x++){
    41. String s = (String)v.elementAt(x);
    42. System.out.println("s = " + s);
    43. }
    44. }
    45. }
    1. package cn.LinkedList;
    2. import java.util.LinkedList;
    3. /**
    4. * LinkedList的特有功能
    5. * 添加功能:
    6. * public void addFirst(Object e)
    7. * public void addLast(Object e)
    8. *
    9. * 获取功能:
    10. * public Object getFirst()
    11. * public Object getLast()
    12. * 删除功能:
    13. * public Object removeFirst()
    14. * public Object removeLast()
    15. *
    16. * */
    17. public class LinkedListDemo {
    18. public static void main(String[] args) {
    19. //创建集合对象
    20. LinkedList link = new LinkedList();
    21. //添加元素
    22. link.add("hello");
    23. link.add("world");
    24. link.add("java");
    25. //添加功能:
    26. //link.addFirst("xixi"); //添加在第一个
    27. //link.addLast("haha"); //添加在最后一个
    28. //获取功能:
    29. // System.out.println(link.getFirst());
    30. // System.out.println(link.getLast());
    31. //删除功能:
    32. System.out.println(link.removeFirst());
    33. System.out.println(link.removeLast());
    34. //输出
    35. System.out.println("link = " + link);
    36. }
    37. }
    1. package cn.Test;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. /**
    5. * 去除集合中自定义对象对象的重复值(对象的成员变量值都想同)
    6. * contains()方法依赖的是equals ()方法,而学生类中没有equals()方法,默认使用的是父类的Object的equals()方法
    7. * 而Object()的equals()默认比较的是地址值,所以全部输出,因为全部 都是new出来的,地址值都不一样,所以全部不一样
    8. * 按照需求,比较成员变量,重写equals()方法。(自动生成)
    9. *
    10. *
    11. * */
    12. public class ArrayListDemo_02 {
    13. public static void main(String[] args) {
    14. //创建集合对象:
    15. ArrayList array = new ArrayList();
    16. //创建学生对象:
    17. Student s1 = new Student("林青霞", 27);
    18. Student s2 = new Student("林志玲", 40);
    19. Student s3 = new Student("凤姐", 35);
    20. Student s4 = new Student("芙蓉姐姐", 18);
    21. Student s5 = new Student("翠花", 16);
    22. Student s6 = new Student("林青霞", 27);
    23. Student s7 = new Student("林青霞", 18);
    24. //添加元素
    25. array.add(s1);
    26. array.add(s2);
    27. array.add(s3);
    28. array.add(s4);
    29. array.add(s5);
    30. array.add(s6);
    31. array.add(s7);
    32. //创建新集合,
    33. ArrayList newArray = new ArrayList();
    34. //遍历旧集合,得到每一个元素
    35. Iterator it = array.iterator();
    36. while(it.hasNext()){
    37. Student s = (Student)it.next();
    38. //拿那个元素到新集合里面找,
    39. if(!newArray.contains(s)){
    40. newArray.add(s); //如果没有,就添加到新集合里面
    41. }
    42. }
    43. //遍历洗集合:
    44. for(int x = 0 ; x< newArray.size();x++){
    45. Student s = (Student)newArray.get(x);
    46. System.out.println(s.getName()+"---" +s.getAge());
    47. }
    48. }
    49. }

    MyStack

    1. package cn.LinkedList;
    2. import java.util.LinkedList;
    3. /**
    4. * 自定义栈集合
    5. * @author dengtonghu
    6. * @version 1.0
    7. *
    8. * */
    9. f
    10. public class MyStack {
    11. private LinkedList link;
    12. //构造方法:
    13. public MyStack(){
    14. link = new LinkedList();
    15. }
    16. //添加功能:
    17. public void add(Object obj){
    18. link.addFirst(obj);
    19. }
    20. //获取功能
    21. public Object get(){
    22. //return link.getFirst(); //只能获取第一个
    23. return link.removeFirst(); //删除第一个并返回
    24. }
    25. //添加判断:
    26. public boolean isEmpty(){
    27. return link.isEmpty();
    28. }
    29. }

    泛型:
    优点:
    1、把运行周期出现的问题提前到了编译期间
    2、避免了强制类型转换
    3、优化了程序设计,避免了黄色警告线

    使用场景:
    看API,如果类、接口、抽象类后面跟着有,就说明要使用泛型,一般在集合中使用

    1. package cn.Generic;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. /**
    5. * ArrayList存储字符串并遍历
    6. *
    7. * 程序出错:
    8. * 因为在存储的时候,储存了String类型和Integer 两种类型数据
    9. * 而在遍历的时候,我们都当做String 类型处理做转换,所以报错
    10. * 编译期间没有报错
    11. *
    12. * 数组:
    13. * String[] strArray = new String[3];
    14. * strArray[0] = "hello";
    15. * strArray[1] = "world";
    16. * strArray[2] = 10; //这里就会报错,数据类型不一致,String 和int类型
    17. *
    18. * 集合模仿数组的做法,在创建对象的时候明确元素的数据类型,这样就不会出问题了
    19. * 而这种技术就是 泛型
    20. *
    21. * 泛型是一种特殊类型,是一种把类型明确的工作 推迟到创建对象或调用方法的时候 采取明确特殊的类型
    22. * 参数化类型把类型当做参数一样传递
    23. * 格式<数据类型> //此处的数据类型只能是引用类型
    24. *
    25. *
    26. */
    27. public class GenericDemo {
    28. public static void main(String[] args) {
    29. //创建集合对象
    30. ArrayList<String> array = new ArrayList<String>();
    31. //添加元素
    32. array.add("hello");
    33. array.add("world");
    34. array.add("java");
    35. //array.add(new Integer(10));
    36. //array.add(10); //jdk5以后的自动装箱(自动装箱:把基本类型转为包装类类型.引用类型反之) 这里是引用类型,而其他是字符串类型
    37. //等价于:array.add(Integer.valueOf(10))
    38. //遍历
    39. Iterator<String> it = array.iterator();
    40. while(it.hasNext()){
    41. //String s =(String)it.next();
    42. String s = it.next(); //明确了数据类型就不需要强转
    43. System.out.println("s = " + s);
    44. }
    45. }
    46. }

    //遍历的三种方式:

    1. //遍历:
    2. Iterator<Student> it = array.iterator(); //迭代器
    3. while(it.hasNext()){
    4. Student s = it.next();
    5. System.out.println(s.getName()+"---"+ s.getAge());
    6. }
    7. System.out.println("----------------------");
    8. for(Iterator<Student> IT = array.iterator();IT.hasNext();){
    9. Student s = IT.next();
    10. System.out.println(s.getName()+"---"+s.getAge());
    11. }
    12. System.out.println("--------------------");
    13. for(int x= 0; x<array.size(); x++){ //普通for(size和get)
    14. Student s = array.get(x);
    15. System.out.println(s.getName()+"---"+s.getAge());
    16. }

    实现类在实现接口的两种情况:

    1. package cn.Genericity.Genericty_04;
    2. /**
    3. * 实现类在实现接口的时候有两种情况
    4. * 1、已经知道是什么类型
    5. * 2、不知道什么类型
    6. *
    7. * */
    8. //public class InterImpl implements Inter<String>{
    9. //
    10. //
    11. // @Override //不知道类型
    12. // public void show(String s) {
    13. // System.out.println("s = " + s);
    14. // }
    15. //}
    16. public class InterImpl<T> implements Inter<T>{
    17. @Override //知道类型
    18. public void show(T t) {
    19. System.out.println("t = " + t);
    20. }
    21. }

    泛型高级之通配符

    1. package cn.Genericity.Genericity_05;
    2. import java.util.ArrayList;
    3. import java.util.Collection;
    4. /**
    5. * ? :任意类型,如果没有明确,那么就是Object 以及任意java类
    6. * ? extends E :向下限定,E及其子类 ,不包括父类
    7. * ? super E :向上限定,E及其父类,
    8. *
    9. * */
    10. public class GenericityDemo {
    11. public static void main(String [] args){
    12. Collection<Object> c1 = new ArrayList<Object>();
    13. //注意:泛型如果明确写的时候,前后必须一致
    14. // Collection<Object> c2 = new ArrayList<Animal>();
    15. // Collection<Object> c3 = new ArrayList<dog>();
    16. // Collection<Object> s4 = new ArrayList<cat>();
    17. //<?>表示任意类型都可以
    18. Collection<?> c5 = new ArrayList<Animal>();
    19. Collection<?> c6 = new ArrayList<dog>();
    20. Collection<?> c7 = new ArrayList<cat>();
    21. //? extends E :向下限定,E及其子类,不包括父类
    22. //Collection<? extends Animal> c8 = new ArrayList<Object>();
    23. Collection<? extends Animal> c9 = new ArrayList<Animal>();
    24. Collection<? extends Animal> c10 = new ArrayList<dog>();
    25. Collection<? extends Animal> c11 = new ArrayList<cat>();
    26. //?super E:向上限定:E及其父类
    27. Collection<? super Animal> c12 = new ArrayList<Object>();
    28. Collection<? super Animal> c13 = new ArrayList<Animal>();
    29. //Collection<? super Animal> s14 = new ArrayList<dog>();
    30. //Collection<? super Animal> c15 = new ArrayList<cat>();
    31. }
    32. //定义一个类:
    33. class Animal{
    34. }
    35. class dog extends Animal{
    36. }
    37. class cat extends Animal{
    38. }
    39. }

    增强for

    1. package cn.JDK5;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * JDK5的新特性:
    6. * 自动拆装箱:
    7. * 自动装箱:把基本类型转为包装类类型
    8. * 自动拆箱:把包装类类型转为基本类型
    9. *
    10. * 泛型:
    11. * 看API,如果类、接口、抽象类后面跟着有<E>,就说明要使用泛型,一般在集合中使用
    12. *
    13. * 增强for:
    14. * 是for循环的一种
    15. * 格式:
    16. * for(元素的数据类型 变量: 数组或者Collection 集合){
    17. * 使用变量即可,给变量就是元素
    18. * }
    19. * 优点:简化了数组和集合的遍历
    20. * 弊端:增强for的目标不能我null
    21. * 解决:对增强for的目标先进行一个不为null的判断然后使用
    22. *
    23. * 静态导入
    24. * 可变参数
    25. * 枚举
    26. *
    27. *
    28. *
    29. *
    30. * */
    31. public class forDemo {
    32. public static void main(String[] args) {
    33. int[] arr = {1,2,3,4,5};
    34. for(int x = 0 ; x<arr.length; x++){
    35. System.out.print(arr[x]+" ");
    36. }
    37. System.out.print("\n"+"--------------------------"+"\n");
    38. //增强for
    39. for(int x : arr){
    40. System.out.print(x+" ");
    41. }
    42. System.out.println("\n"+"---------------------------");
    43. //定义一个字符串数组
    44. String[] strArray = {"张三","李四","小明","小红"};
    45. for(String s : strArray){
    46. System.out.println(s);
    47. }
    48. //定义一个集合:
    49. ArrayList<String> array = new ArrayList<String>();
    50. array.add("hello");
    51. array.add("java");
    52. array.add("world");
    53. for(String s :array){
    54. System.out.println(s);
    55. }
    56. List<String> list = null; //NullPointerException控制针异常
    57. if(list!= null) {
    58. for (String s : list) {
    59. //这个s是我从list里面获取的,在获取之前做了一个判断,其实就是迭代器功能
    60. System.out.println(s);
    61. }
    62. }
    63. }
    64. }
    1. package cn.JDK5;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. /**
    5. * ArrayList 存储字符串并遍历(三种方式:迭代器,普通for,增强for)
    6. */
    7. public class ForDemo_02 {
    8. public static void main(String[] args) {
    9. //创建集合:
    10. ArrayList<String> array = new ArrayList<String>();
    11. //创建并添加元素
    12. array.add("hello");
    13. array.add("world");
    14. array.add("java");
    15. //遍历:
    16. Iterator<String> it = array.iterator();
    17. while (it.hasNext()) {
    18. String s = it.next();
    19. System.out.println(s);
    20. }
    21. System.out.println("--------------------------");
    22. for (Iterator<String> IT = array.iterator(); IT.hasNext(); ) {
    23. String s = IT.next();
    24. System.out.println(s);
    25. }
    26. System.out.println("---------------------");
    27. //普通fo
    28. for (int x = 0; x < array.size(); x++) {
    29. String s = array.get(x);
    30. System.out.println(s);
    31. }
    32. System.out.println("---------------------------");
    33. //增强for:
    34. for (String s : array) {
    35. System.out.println(s);
    36. }
    37. }
    38. }

    增强for是用来替代迭代器