java语言学习(8)

第十二章

  • 集合框架体系

  • Collection

    • List

      • ArrayList

      • LinkedList

      • Vector

    • Set

      • HashSet

      • LinkedHashSet

      • TreeSet

  • Map

    • HashMap

      • LinkedHashMap
    • Hashtable

      • Properties
    • TreeMap

集合的理解和好处

数组

  • 长度开始时必须指定,而且一旦指定,不能更改

  • 保存的必须为同一类型的元素

  • 使用数组进行增加/删除元素比较麻烦

集合

  • 可以动态保存任意多个对象,使用比较方便

  • 提供了一系列方便的操作对象的方法:

    • add

    • remove

    • set

    • get(index)

  • 使用集合添加,删除新元素的代码简洁

补充:集合可分为两类,单列集合和双列集合

  • Collection接口有两个重要的子接口 List Set,他们实现子类都是单列集合

  • Map接口的实现子类,存放的K-V

Collection接口

  • Collection实现子类可以存放多个元素,每一个元素可以是Object

  • 有些Collection的实现类,可以存放重复的元素,有些不可以

  • 有些Collection的实现类,有些是有序的(List),有些是没序的(Set)

  • Collection接口没有直接的实现子类,是通过他的接口Set和List来实现的

常用方法

  • add (Object) 添加单个元素

  • remove(Object / or) 删除指定元素

  • contains 查找元素是否存在

  • size 获取元素个数

  • isEmpty 判断是否为空

  • clear 清空

  • addAll(Collection ) 添加多个元素

  • containsAll(Collection) 查找多个元素是否都存在

  • removeAll(Collection) 删除多个元素

Collection接口遍历元素的方式

方式一:使用Iterator (迭代器)

  • Iterator对象称为迭代器,主要用于遍历Collection集合中的元素

  • 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口对象,即可以返回一个迭代器

  • Iterator 仅用于遍历集合,Iterator本身不存放对象

  • 在调用next()方法之前必须要调用hasNext()进行检测,否则会抛出NoSuchElementException异常

  • 当退出while循环后,这时iterator迭代器,指向最后一个元素

  • 如果想再次使用该迭代器遍历,需要重置迭代器

  • iterator = col.iterator();

    public class data01{
        @SuppressWarnings({"all"})
        //忽略所有的警告
        public static void main(String[] args) {
            Collection arrayList = new ArrayList();
            arrayList.add("Dog");
            arrayList.add("Cat");
            Iterator iterator = arrayList.iterator();
            //首先需要先得到这个迭代器
            //这里while的快速生成 itit
            while (iterator.hasNext()) {
                Object obj =  iterator.next();
                System.out.println(obj);
            }
        }
    }

补充:ctrl + j 显示快捷键

方式二:for循环增强(底层仍然是迭代器)

List接口

List接口是Collection接口的子接口

  • List集合类中元素有序(即添加顺序和取出顺序一致)

  • List集合中的每个元素都有其对应的顺序索引,即支持索引

  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

  • 常用的接口实现类

    • ArrayList

    • LinkedList

    • Vector

方法

  • add(index,obj)

    • 在index中插入

    • 无index,默认为最后面

  • addAll(index,collection)

  • get(index) 获取index位置的元素

  • indexOf(obj) 返回当前集合中第一次出现的位置

  • lastIndexOf(obj) 返回当前集合中最后一次出现的位置

  • remove(index) 移除指定index位置的元素,并返回该元素

  • set(index,obj)将index位置的元素替换成obj

  • subList(fromIndex,toIndex)返回从fromIndex 到 toIndex位置的子集合(左闭右开)

补充:List接口下面的类,可以用普通for循环

注意事项

  • ArrayList可以加入null,并且多个

  • ArrayList是由数组来实现数据存储的

  • ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList

ArrayList底层结构和源码分析

  • ArrayList中维护了一个Object类型的数组elementData

    • transient Object[] elementData;

    • transient 表示瞬间,短暂,表示该属性不会被序列化

  • 当后创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,入需要再次扩容,则扩容elementData为1.5倍

  • 如果使用的是指定大小的构造器,则初始ekementData容量为指定大小,如果需要扩容,则直接扩容elementData的1.5倍

Vector

  • Vector底层也是一个对象数组

    • protected Object[] elementData
  • Vector 是线程同步的,即线程安全,Vector类的操作方法带有synchrinized

  • 在开发中,需要线程同步安全时,考虑使用Vector

LinkedList

  • 底层实现了双向链表和双端队列

  • 可以添加任意元素(元素可以重复)

  • 线程不安全,没有实现同步

泛型

使用传统的方法的缺点:

  • 不能对加入到集合中的数据类型进行约束(不安全)

  • 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响

    ArrayList arryList = new ArrayList();

说明:

  • ArrayList 表示放到ArrayList 集合中的元素都是Dog类型

  • 如果编译器发现添加的类型不满足要求,就会报错

  • 在遍历的是,可以直接去除Dog类型,而不是Object

泛型的好处

  • 编译时,检查添加的元素类型,提高了安全性

  • 减少了类型转换的次数,提高了效率

泛型介绍

  • 泛型又称参数化类型,是JDK5.0 出现的新特性,解决数据类型的安全性问题

  • 在类声明或实例化时子只要指定好需要的具体的类型即可

  • Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁,健壮

  • 泛型的作用是:可以在类声明时通过一个标识表示类中某个元素的类型,或者是某个方法的返回值的类型,或者是参数的类型

    //E 表示 s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定E是什么类型

    class Person<E>{
        E s;
        public Person(E s){
            this.s = s;    
        }
        public E f(){
            return s;
        }
    }

泛型语法

  • 泛型的声明

    • interface 接口 {}

    • class 类<K,V>{}

    • 其中,T,K,V不代表值,而是表示类型

    • 任意字母都可以。常用T表示,是Type的缩写

  • 泛型的实例化

注意细节

  • <>里面只能是引用类型

  • 在指定泛型具体类型后,可以传入该类型或者其子类型

  • 实际开发中

    • ArrayList a = new ArrayList<>();

    • 后面会把<>里面的内容省略

自定义泛型

class Tiger<T,R,M>{

}
  • Tiger 后面泛型,所以我们把Tiger就称为自定义泛型类

  • 范式的标识符,一般都是大写字母

  • 泛型标识符可以有多个

  • 普通成员可以使用泛型(属性,方法)

  • 使用泛型的数组不能初始化

    • 类型没有确定下来,编译器不知道开多大空间
  • 静态方法不能使用泛型

    • 因为静态是和类相关的,在类加载时,对象还没创建

自定义泛型接口

  • 接口中,静态成员也不能使用泛型

  • 泛型接口的类型在继承接口或者实现接口时确定

  • 没有指定类型,默认Objec

自定义泛型方法

  • 基本语法

    • 修饰符 <T,R> 返回类型 方法名(参数列表){}
  • 泛型方法,可以定义在普通类中,也可以定义在泛型类中

  • 当泛型方法被调用时,类型会确定

  • public void eat(E e){}

    • 修饰符后面没有<>

    • 该方法不是泛型方法,而是使用了泛型

泛型的继承和通配符

//不允许这样写
List<Object> list = new ArrayList<String>();

通配符

  • <?> 支持仍以泛型类型
  • <? extend A> 支持A类以及A类的子类,规定了泛型的上限
  • <? super A>支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

栈和队列

基本理解:Stack 是一个类,可以直接创建对象

Queue

基本理解:Queue是一个接口,不能直接实现

  • 访问第一个元素

    • peek (安全)

    • element(不安全)

  • 出队

    • poll(安全)

    • remove(不安全)

  • 入队

    • offer(安全)

    • add(不安全)

内部类

内部类表示的事物是外部类的一部分

内部类单独出现没有任何意义

比如说:迭代器

内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有

  • 外部类要访问内部类的成员,必须创建对象

匿名内部类

本质:隐藏了名字的内部类
在这里插入图片描述

使用场景:当方法的参数是接口或者类时,并且这个接口或者是对象只使用一次,就可以用匿名内部类

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值