java开发的第十四个博客(集合概述与泛型)

1.集合体系

1.集合体系如下:
java开发的第十四个博客(集合概述与泛型)_第1张图片

  • Collection:单列集合类的根接口

  • 单列List的特点是元素有序、元素可重复,有索引。

  • Set的特点是元素无序,而且不可重复,无索引。

2.Collection接口的常用功能

  • public boolean add(E e): 添加元素
  • public boolean remove(E e): 删除元素
  • public void clear() :清空集合
  • public Object[] toArray(): 集合转换为数组
  • public boolean contains(E e): 判断集合内是否有给定对象
  • public boolean isEmpty(): 判断集合是否为空
  • public int size(): 返回集合元素个数

2.迭代器

1.迭代的概念
取元素前先判断集合中有没有元素,有就取出,直到把集合中的元素全部取出。

2.迭代器的常用方法

  • public E next():返回迭代的下一个元素(迭代器原理内置了一个指针,一开始在集合的外面,每调用一次next方法,指针向下移动一次,得到对应的元素)。
  • public boolean hasNext():如果仍有元素可以迭代,则返回 true。

3.示例

Collection<String> arrayList = new ArrayList();
        arrayList.add("hello1");
        arrayList.add("hello2");
        arrayList.add("hello3");
        Iterator<String> iterator = arrayList.iterator();
        while (iterator.hasNext()){
     
            System.out.println(iterator.next());
        }

3.增强for循环

1.概念

  • JDK1.5后出来的高级for循环,专门用来遍历数组和集合
  • 增强for对于数组是普通for循环,而对于集合是迭代器

2.反编译

  • 对于数组正常程序内容
int[] arr = {
     1,2,3,4,5};
for(int i : arr){
     
	System.out.println(i);
}
  • 反编译结果
int[] arr = {
     1,2,3,4,5};
int ai[] = arr;
int j = ai.length;
for(int k = 0; k < j;k++){
     
	int i = ai[k];
	System.out.println(i);
}
  • 对于集合正常程序内容
ArrayList<String> arr = new ArrayList();
arr.add("hello");
arr.add("world");
for(String i : arr){
     
	System.out.println(i);
}
  • 反编译结果
ArrayList<String> arr = new ArrayList();
arr.add("hello");
arr.add("world");
String e;
for(Iterator iterator = arr.iterator();iterator.hasNext();System.out.println(e)){
     
	e = (String)iterator.next();
}

3.增强for出现并发修改异常

  • 出现异常
ArrayList<String> list = new ArrayList<>();
        list.add("s1");
        list.add("s2");
        list.add("s3");
        for (String s : list) {
     
            if(s.equals("s1"))
            list.add("s4");
        }
        System.out.println(list);
        //ConcurrentModificationException并发修改异常
  • 解决异常
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList();
        //ArrayList list = new ArrayList<>();
        list.add("s1");
        list.add("s2");
        list.add("s3");
        for (String s : list) {
     
            if(s.equals("s1"))
            list.add("s4");
        }
        System.out.println(list);
        //ConcurrentModificationException解决并发修改异常

4.泛型

1.概述

  • 用来规范元素的数据类型
  • 可以在类或方法中预先地使用未知的类型

2.作用

  • 将运行时期异常转移为编译时期异常
  • 避免了类型强转的麻烦

3.泛型的定义和使用

  • 泛型类:class 类名<泛型>{ }
  • 泛型方法:修饰符<泛型变量> 返回值类型 方法名(参数){ }
  • 泛型接口:修饰符 interface 接口名<泛型>{ }

4.泛型写在方法的不同位置

  • 泛型通过类创建时给泛型赋值并放在成员位置
  • 通过set/get方法返回泛型或者作为参数
class Person<E> {
     
    private E e;
    public E getE() {
     
        return e;
    }
    public void setE(E e) {
     
        this.e= e;
    }
  • 类的成员方法泛型不是类的泛型(推荐 多态输入 )
class Person<E> {
     
    private E e;
   public <F> void show(F f) {
     
   		//方法体
    }
  • 类的成员方法泛型与类同名(就近原则 )
class Person<E> {
     
    private E e;
   public <E> void show(E e) {
     
   		//方法体
    }
  • 类的静态方法泛型与类同名与不同名都使用方法位置的泛型
    都会使用方法上的泛型
class Tan<E> {
     
    private String name;
    private int age;
    private E e;
    public static <F> void show4(F f) {
     
        System.out.println("mvp是谁:"+f);
    }
    public static <E> void show5(E e) {
     
        System.out.println("mvp是谁:"+e);
    }
}
  • 静态使用类的泛型(错误!!!)(面试)
public class<E>{
     
	private E e;
	//方法在类加载时已经存在(mian方法之前),所以无法使用泛型的内容
	public static void show6(E e) {
     
        System.out.println(e);
    }
}

你可能感兴趣的:(java,iterator,编程语言)