A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© heifachangcun 中级黑马   /  2018-11-14 16:04  /  538 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 heifachangcun 于 2018-11-14 16:08 编辑

day02

Collection单列集合
集合和数组的区别:
1. 数组长度不可变; 集合长度可变
2. 数组可以存基本类型或引用类型, 只能存同一种类型; 集合只能存储引用类型元素, 可以是多种类型元素
共性方法
Collection成员方法(共性的):
  // 使用多态创建Collection对象, 帮助我们区分哪些方法是Collection接口中的共性方法
                    Collection<String> coll = new ArrayList<>();
    // boolean add(E e): 把给定的对象添加到当前集合中
                    coll.add("张三");
    // void clear(): 清空集合中所有的元素
   coll.clear();
    // boolean remove(E e): 把给定的对象在当前集合中删除
                    boolean b = coll.remove("李四");
                            System.out.println("remove删除李四的返回值:" + b);
    // boolean contains(E e): 判断当前集合中是否包含给定的对象
                    boolean b2 = coll.contains("王五")
    // boolean isEmpty(): 判断当前集合是否为空(没有元素)
                    boolean isEmpty = coll.isEmpty();
                            System.out.println("集合isEmpty的结果:" + isEmpty);
    // int size(): 返回集合中元素的个数
                    int size = coll.size();
                            System.out.println("集合的元素个数:" + size);
    // Object[] toArray(): 把集合中的元素,存储到数组中
                    // 这个方法相当于间接地从集合中取出元素
                    Object[] arr = coll.toArray();
                    for (int i = 0; i < arr.length; i++) {
                              System.out.println(arr);
java.util.Collections工具类
// 静态方法
static void shuffle(List<?> list): 随机打乱集合中元素的顺序
迭代器
使用迭代器遍历集合的3步:
1. 使用集合对象的 iterator() 获取迭代器对象, 用 Iterator 接口接收.(多态)
2. 使用 Iterator 接口中的 hasNext() 方法, 判断是否有下一个元素
3. 使用 Iterator 接口中的 next() 方法, 获取下一个元素
// 使用迭代器遍历集合的标准写法:
Iterator<元素类型> iterator = 集合对象.iterator();
while (iterator.hasNext()) {
         元素类型 变量名 = iterator.next();
}
增强for
增强for格式:
                 for(元素的数据类型 变量名 : Collection集合或数组名){
            //操作代码
}
// 数组示例
         int[] arr = {1,2,3};
                  for (int i : arr) {
            System.out.println(i);
}
增强for, 普通for, 迭代器的区别:
增强for:
优点: 获取元素很方便, 格式简单
缺点: 没有普通for中的索引, 没有迭代器对象可以进行元素的增删
应用场景: 适用于遍历获取数组和集合元素的场景
普通for:
优点: 有索引可以使用, 某些方式可以在遍历过程中增删元素
缺点: 格式繁琐
应用场景: 需要用到索引的场景
迭代器:
优点: 可以使用迭代器对象的方法操作元素
缺点: 格式繁琐
应用场景: 需要在迭代过程中增删元素的场景
泛型

泛型上下限:
上限: <? extends E>  可以接收泛型为E类型或E类型的子类类型
下限: <? super E> 可以接收泛型为E类型或E类型的父类类型
泛型通配符
            <?>
<? extends E>
<? super E>

泛型的好处:
1. 避免了类型转换的麻烦
2. 将运行时的类型转换异常, 转移到了编译时期 (有利于程序员提前发现问题)

定义泛型
<泛型名>
泛型的"定义"和"使用"
泛型在"定义"时, "不能是"具体的类型, 只是一个变量名: public class ArrayList<E> {}
泛型在"使用"时, "必须是"具体的数据类型 ArrayList<Integer>
  // 带有泛型的类定义格式
          修饰符 class 类名<代表泛型的名字> {  // 泛型的变量一般用一个大写字母表示, 但也可以是                多个字母
}

类中的泛型, "在创建对象时", 确定泛型的具体类型

方法中的泛型定义位置:
修饰符 和 返回值类型 之间
// 带有泛型的方法定义格式
         修饰符 <代表泛型的名字> 返回值类型 方法名(参数){
}

方法中定义泛型后, 返回值类型和参数类型都可以使用泛型
方法泛型的使用:
"在调用方法时"确定泛型的具体类型

// 带有泛型的类定义格式
  修饰符 interface 接口名<代表泛型的变量> {
}

实现类实现了泛型接口后可以有2种选择:
1. "定义实现类时", 确定泛型的具体类型
    public class A implements GenericInterface<String> {
@Override
public void method(String i) {}  // 所有使用泛型的地方都会确定具体类型
   }
2. 定义实现类时仍然沿用泛型, 直到"创建该实现类对象时"才确定泛型的具体类型
    public class A<I> implements GenericInterface<I> {
@Override
public void method(I i) {}  // 泛型不需要确定具体类型, 当创建该类对象时再确定
   }

A<Integer> a = new A<>();
a.method(1);
A<String> a2 = new A<>();
a2.method("dsfdsaf");

泛型定义总结:
定义在类上的泛型:
有效范围: 整个类中都有效
何时确定具体类型: 创建该类对象时确定泛型的具体类型
定义在方法上的泛型:
有效范围: 方法中(包括返回值类型和参数类型)有效
何时确定具体类型: 调用方法传参时确定泛型的具体类型
定义在接口上的泛型:
有效范围: 接口中
何时确定具体类型:
1. 子接口或实现类定义时确定泛型的具体类型
2. 创建实现类对象时确定泛型的具体类型

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马