day16-集合框架(ArrayList/泛型)

16.01_去除ArrayList中重复字符串元素方式(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
    • 思路:创建新集合方式
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
//....

//去除重复
ArrayList newList = new ArrayList();            //创建一个新集合
Iterator it = list.iterator();                  //获取迭代器
while(it.hasNext()) {                           //判断老集合中是否有元素
    String temp = (String)it.next();            //将每一个元素临时记录住
    if(!newList.contains(temp)) {               //如果新集合中不包含该元素
        newList.add(temp);                      //将该元素添加到新集合中
    }
}
System.out.println(newList);

16.02_去除ArrayList中重复自定义对象元素(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
  • B:提示: 重写自定义对象的equals()方法,如果不重写,属性值一样的对象,因为地址不一样,也会被认为不相同的对象。
ArrayList 的 contanins方法判断是否包含,底层依赖对象的equals方法
ArrayList 的 remove方法判断是否删除,底层依赖对象的equals方法

@Override
public boolean equals(Object obj) {  // 重写Person类equals方法示例
    if (this == obj) {  // 1.地址比较
        return true;
    }
    
    if (obj instanceof Person) {// 2.类型判断
        Person p = (Person)obj;  // 3.属性值判断
        if (p.name.equals(this.name)&&(p.age == this.age)) {
            return true ;
        }
    }
    return false;
}

16.03_LinkedList的特有功能(掌握)

  • A:LinkedList类概述
    public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
LinkedList list = new LinkedList<>();

list.addFirst("1");  //在集合头部添加元素
list.addLast("4");   //在集合尾部添加元素 ,效果同:add()

System.out.println(list.getFirst());  //获取头部元素
System.out.println(list.getLast());   //获取尾部元素
System.out.println(list.removeFirst());  //删除头部元素
System.out.println(list.removeLast()); //删除尾部元素
System.out.println(list.get(1)); //获取指定位置的元素,小心越界

16.04_栈和队列数据结构(掌握)

  • ---> 先进后出
  • 队列 ---> 先进先出

16.05_用LinkedList模拟栈数据结构的集合并测试(掌握)

  • 需求:请用LinkedList模拟栈数据结构的集合,并测试
  • 创建一个类将Linked中的方法封装
public class Stack { //模拟栈结构特性(先进后出)
    
    private LinkedList list = new LinkedList<>();
    
    // 进栈方法
    public void in(Object obj) {
        list.addLast(obj);
    }
    
    // 出栈方法
    public Object out() {
        return list.removeLast();
    }
    
    // 判断是否是空栈
    public boolean isEmpty() {
        return list.isEmpty();
    }
}

16.06_泛型概述和基本使用(掌握)

  • A:泛型概述: 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。
  • B:泛型好处
    • 提高安全性(将运行期的错误转换到编译期)
    • 省去强转的麻烦
  • C:泛型基本使用
    • <>中放的必须是引用数据类型
  • D:泛型使用注意事项
    • 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
ArrayList<Person> list = new ArrayList<>();  // 1.7新特性菱形泛型
list.add(new Person("a1", 10));

System.out.println(list.get(0).getName());  // 不用强转就能直接使用

// <>如果都写类型, 那么前后类型必须一致
ArrayList<Person> list2 = new ArrayList<Person>();  

16.07_ArrayList存储字符串和自定义对象并遍历泛型版(掌握)

  • ArrayList存储自定义对象并遍历泛型版
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("p1", 12));
list.add(new Person("p2", 16));

Iterator<Person> it = list.iterator();
while (it.hasNext()) {
    Person p = it.next();
    System.out.println(p.getName() + ".." + p.getAge());
}

16.08_泛型的由来(了解)

  • 泛型的由来:通过Object转型问题引入
  • 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

16.09_泛型类的概述及使用(了解)

  • A:泛型类概述<T>
    • 把泛型定义在类上
  • B:定义格式: public class 类名<泛型类型1,…>
  • C:注意事项: 泛型类型必须是引用类型
// 泛型类
public class TestClass<T> {
    private T t;

    public T getT() {   //泛型方法
        return t;
    }

    public void setT(T t) {    //泛型方法
        this.t = t;
    }
    
    public<T> void show(T t) {  //方法泛型和类的泛型不一致
        System.out.println(t);
    }
}

// 使用
TestClass<Person> t = new TestClass<Person>();
t.setT(new Person("XXOO", 20));
System.out.println(t);

16.10_泛型方法的概述和使用(了解)

  • A:泛型方法概述 : 把泛型定义在方法上
  • B:定义格式
    • public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public<T> void show(T t) {  //方法泛型和类的泛型不一致
    System.out.println(t);
}

public static <Q> void print(Q q) {  //静态方法必须声明自己的泛型
    System.out.println(q);
}

16.11_泛型接口的概述和使用(了解)

  • A:泛型接口概述: 把泛型定义在接口上
  • B:定义格式
    • public interface 接口名<泛型类型>
 interface Inter<T> { // 泛型接口
    public void show(T t);
}

class Demo implements Inter<String> {  //实现方式一,推荐这个
    @Override
    public void show(String t) {
        System.out.println(t);
    }
}

16.12_泛型高级之通配符(了解)

  • A:泛型通配符<?>
    • 任意类型,如果没有明确,那么就是Object以及任意的Java类了
  • B: ? extends E 向下限定,E及其子类
  • C: ? super E 向上限定,E及其父类 (后面再说这个)
// 泛型高级--通配符
List<?> list3 = new ArrayList<>(); //放右边的泛型不确定时,左边可以指定为?

ArrayList<Father> list = new ArrayList<>();
list.add(new Father("F1", 20));
list.add(new Father("F2", 21));

ArrayList<Son> list2 = new ArrayList<>();     //Son继承于Father
list2.add(new Son("F1", 20));
list2.add(new Son("F2", 21));

list.addAll(list2);  //没有问题。可以添加。 list2.addAll(list)就会报错,父类不能提升为子类
System.out.println(list);

16.13_增强for的概述和使用(掌握)

  • A:增强for概述: 简化数组和Collection集合的遍历
// 增强for
int[] arr = {1,2,3,4,5};
for(int i : arr){
    System.out.println(i);
}

ArrayList<String> list = new ArrayList<>();
list.add("xxoo1");
list.add("xxoo2");
for(String s: list){
    System.out.println(s);
}
增强for循环底层依赖的是迭代器Iterator
// 快捷键: fore 就能快速出来, 跟syso一样

16.15_三种迭代的能否删除(掌握)

  • 普通for循环,可以删除,但是索引要--
  • 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
  • 增强for循环不能删除
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");  
list.add("c");
list.add("b");  

for(int i = 0; i < list.size(); i++){
    if ("b".equals(list.get(i))) {
        list.remove(i--); //注意这里,是先进方法之后,再--的,这里不好理解
    }
}

// 迭代器删除   写法一
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if ("b".equals(it.next())) {
        it.remove();  //这里只能使用Iterator的删除
    }
}

// 迭代器删除   写法二
for(Iterator<String>it2 = list.iterator(); it2.hasNext();) {
    if ("b".equals(it.next())) {
        it.remove();  //这里只能使用Iterator的删除
    }
}

16.16_静态导入的概述和使用(掌握)

  • A:静态导入概述,JDK1.5的新特性
  • B:格式:
    • import static 包名….类名.方法名;
    • 可以直接导入到方法的级别
  • C:注意事项
    • 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。

16.17_可变参数的概述和使用(掌握)

  • A:可变参数概述: 定义方法的时候不知道该定义多少个参数
  • B:格式
    • 修饰符 返回值类型 方法名(数据类型… 变量名){}
  • C:注意事项:
    • 这里的变量其实是一个数组
    • 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
// 可变参数 ,可变参数其实就是一个数组:   int[] arr
public static void print(String x ,int...arr) {
    System.out.println(x);
    for (int i : arr) {
        System.out.println(i);
    }
}

// 调用
print("xxoo",2,3,45,6);
print("xxoo");         //也可以不给参数,可变参数个数:  0-无数个

16.18_数组和集合的互相转换掌握)

// 数组转集合 , 集合的好处是可变的,数组是固定的
// 数组转成集合虽然不能增加和减少元素,但是可以使用集合的其他思想方法去操作
String[] arr = {"q","xxoo","56"};
List<String> list = Arrays.asList(arr); //将数组转为集合
//list.add("我是新加的");  不能添加,会报错
System.out.println(list);

int[] arr = {2,3,5,6};
List<int[]> list = Arrays.asList(arr);
System.out.println(list); //这里会发现,基本数据类型,转为集合,是把整个数组当成一个对象了
//想要像字符串一样,转成集合之后,还是每个元素的办法:
Integer[] arr2 = {2,3,5,6};
List<Integer> list2 = Arrays.asList(arr2);
System.out.println(list2);

// 集合转数组,需要加泛型
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("xxoo");
list.add("123");

// 集合转数组时,数组的长度如果小于等于集合的size时,转后的数组的长度等于集合的size
// 如果数组的长度大于集合的size,那分配的长度就和指定的长度一样
String[] arr = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(arr));

16.19_集合嵌套之ArrayList嵌套ArrayList(掌握)

// ArrayList 嵌套 ArrayList

ArrayList<ArrayList<Person>> list = new ArrayList<>();

ArrayList<Person> a1List = new ArrayList<>();
a1List.add(new Person("我草", 30));

ArrayList<Person> a2List = new ArrayList<>();
a2List.add(new Person("你莎", 22));

list.add(a1List);
list.add(a2List);

// 遍历
for(ArrayList<Person> a: list){
    for (Person p : a) {
        System.out.println(p.getName() + "..." + p.getAge());
    }
}

END。
我是小侯爷。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,387评论 25 707
  • 我的高中生活贯穿着一个词,学习,没有让人特别惊艳的校花,也没有穿着白衬衫的帅气校草,我们把自己裹在灰色的校服中...
    小蘼阅读 357评论 0 0
  • 嗯 不喜的夏天 在阳台读书 有蚊子咬我 有文字咬我 空气如溶胶 阳光,鱼缸,水影,白墙,晃动 心里一刻为美欣喜 再...
    阿超_mama阅读 187评论 0 4
  • 舞马词/一本为人 作者:心博、图片:网络 古曾八股成文,今应一本为人。 德品先贤楷范,精神浩气乾坤。
    心博1阅读 147评论 0 0
  • ​ 真亦假时假亦真, 你眼睛看到的并非是真实存在的事实, 这是一种病态的人格分裂还是如戏生活中似演员的我们。 那么...
    闲人电影阅读 634评论 4 1