来看看java中的集合和一些API

一、什么是java中的集合,什么是API

1.先谈谈数据结构

在计算机科学中有一个非常重要的基础知识,或者说是学科 —— 数据结构和算法

什么是数据结构,在很多书上都有不太相同的定义,但是说白了就是计算机组织一些数据的方式,

这些特殊的结构是非常有用的,可以说是算法的基础吧,想要在算法这块学得深入基本上离不开这门课,或者里面的知识,有的课程也是将他直接作为语法的应用进行讲解的,这块知识非常重要,想要在以后求职的时候面试官问道实现某种数据结构或者什么和什么有什么区别的时候答上来,就扎扎实实学,学完之后开始去刷题也会得心应手,特别痛快。

数据结构有一张总表,这就是整个框架,学完这个,数据结构也就结束了

这里就是那个框架,其中有一些是接口,一些是java中提供的类,我们以后慢慢一个个讲

2.集合(colloction)是一种用于存储和操作一组对象的数据结构

存储:存储就是在计算机的内存中存储的形式,比如数组就是一块连续的空间,而链表就是一块不连续随机的相连的节点组成的

操作:增删查改。只要是数据,那就离不开如何进行操作,也有很多具体的各个不同的特殊操作,可以查表,也可以看看我怎么讲的,仅供参考(虽然也没人看)

对象:这里的对象肯定是能够接收所有类型的对象, 否则不可能具备强大的功能,这里又要引申出一个泛型类的知识点,可以适当理解为模板吧,这个就随缘了,有时间拿出来,还是比较复杂的

3.API

所谓的API,就是java提供的很多的好用的类罢了,也是要一点一点积累起来的

二、Colloction接口

在这张总表中,colloction接口是在iterator下的第一个,那就代表他是一个最为简单的接口,因为下面的任何一个都是他的子类(这里是学习了java语法,或者面向对象的语言特点有深入了解的同学可以清楚得知道),那么,这个接口为什么要有他的存在呢,他又是有什么含义呢,有什么用呢,为什么一定要学他呢?

一切的一切都要从概念出发:存储和操作对象的数据结构。这里的colloction是一个接口,而在java中接口的作用通常是为了实现某一个功能而存在的,为了解决java当中的多继承问题,既然如此,这个接口我们就不需要在意他的内部存储了,本身不是为了存储而存在的,那他有哪些功能呢?colloction作为一个基本,有的也是最基本的操作手段,我们要了解重要的其中一些即可

1.内部方法

1.add方法:返回值为布尔类型,判断返回是否成功,这里需要注意的是,再list接口下返回一直都是true,而再set接口下不一定,set接口下是不允许出现重复数据的,他就会判断是否存在,存在则返回false,添加失败,那这里还有一个细节:


List:有序,可重复,有索引

Set:无序,不可重复,无索引


由于这些接口特有的特点让add出现了返回值为布尔类型,至于这些特点究竟咋回事之后讲

2:clear()很简单就是清空

3.remove()移除指定的数据,注意这里的是移除数据,而且是顺序查找下移除第一次出现的目标数据,在List接口中,同样存在remove,不过是移除索引指向的数据,他的接收值是index,返回值都是布尔类型判断是否移除成功,那为什么移除还会失败呢?没有这个数据呗

4.查找contains():这个还是很有用的一个方法,传入的是参数,返回布尔判断是否找到

5.判空:isEmpty(),就是数据是否为空的判断,没啥好讲的

6.sort排序,这块所有的排序都归这老哥管了,可以直接使用默认的排序,同时也可以自己实现排序的方法和接口来给到比较规则

public static void main(String[] args) {
        Collection<Integer> coll = new ArrayList<>();
        coll.add(5);
        coll.add(8);
        coll.add(5);
        coll.add(4);//使用add方法

        System.out.println(coll.contains(5));
        coll.remove(5);//remove,移除
        coll.forEach((Integer integer) -> {
                System.out.println(integer);
            }
            );
        System.out.println(coll.contains(7));//查找
        coll.clear();
        System.out.println(coll.isEmpty());//判空
    }

这里是基本的用法,具体的执行之后的结果是:(这里用到的遍历方法是lambda表达式,在后面讲解)

2.遍历的三种通用方法

2.1迭代器遍历

先看如何使用,再来一点点剖析:

Iterator<Integer> it = coll.iterator();
        while(it.hasNext()){
            int i = it.next;//如果使用数据的情况下,通过创建中间变量即可
            System.out.println(it.next());
        }

这是一个最常用的迭代器使用的形式

2.1.1 迭代器是什么?一种接口的实现,内部含有几个方法,普通的接口,在colloction内部也有迭代器方法

2.1.2 迭代器有什么用?有了迭代器,就能逐个获取集合内部的数据,同时可以进行一些操作

2.1.3 迭代器如何使用?要想使用迭代器接口,就要了解内部方法有什么,以及如何使用,使用的时候需要注意什么

几个重要的内部方法:


方法功能
hasNext():bool判断这个位置是否有数据
next():E

返回此位置数据并且指针向下移动一位


具体的使用方式就是上面的代码提到的,同时会发现这里有一个指针,那就是说迭代器内部其实是通过移动指针来遍历的

工作原理:创建指针,判断是否有元素,获取元素,移动指针

2.1.4 迭代器使用的时候有哪些注意事项?

要知道内部方法具体细节的最直接手段就是自己手敲,一步步实现方法的过程中,每个细节也能了然于胸,以后用起来也会更有底气,否则就是云里雾里,这不是我们想要的,也不是面试官想看到的

迭代器的特点:不依赖索引,刚创建的时候指向0索引,结束之后指向不会复原

注意:

  • 报错NoSuchElement(指向无数据位置时强行调用的结果)
  • 遍历完毕,指针不会复原  //要想二次遍历最好重新创建,当重新创建的时候指针就会回到默认位置
  • 循环中只能使用1次next,如果使用多个可能会造成强行调用报错
  • 遍历时,不能使用集合方法删除,会报错,集合不匹配 //可以使用迭代器内部方法remove删除,但是不能增加,暂时没有方法
  • Iterator<Integer> it = coll.iterator();
            while(it.hasNext()){
                int i = it.next();
                if(i == 5){
                    it.remove(i);//可以调用迭代器删除
                }
                System.out.println(it.next());
            }

2.1.5 为什么要用到迭代器?迭代器是所有的colloction集合下的数据结构都能使用的遍历方式,也是java提供的一种内部方法,用起来方便,通用性强

2.2 增强for遍历

在java中提供了一种foreach的循环结构,直接看案例

 for (Integer integer : coll) {
            System.out.println(integer);
        }

还是上面创建的集合,java这里有两个创建的快捷方式:

  • coll.for + enter
  • foreach + enter

第一个是方法内部的,可以直接传参,第二个是更为通用的,需要手动传参

工作原理:其实就可以理解为不能依赖索引的普通for循环

语法解读:“:”左边是变量类型,右边是需要遍历的集合

相当于是从右边拿数据放到左边创建的容器中,然后对这个数据进行操作

注意细节

1.只能用来遍历集合或者数据

2.无法对原始值进行修改

具体的原理可以画图理解是:

就是一个创建的临时变量,然后会往后走

2.3lambda表达式

coll.forEach((Integer integer) -> {
                System.out.println(integer);
            }
            );

2.3.1 为什么使用?在java中含有一个匿名内部类的语法,简单说就是一个只能使用一次的实例化对象,但是没有名字,这个内部类可以最为形参传入到方法中,节省创建子类的代码量,具体的就是下面的格式:

interface Swim{
    void swim();
}

public static void method(Swim s){
        s.swim();
    }

method(new Swim() {
            @Override
            public void swim() {
                System.out.println("在游泳");   
            }
        });

在方法中new Swim{}就是一个匿名内部类,{}是内部类的主体,new 代表创建一个新的对象,Swim代表创建的是接口下实现的方法对象,()就是创建的时候调用类中的无参构造方法

这个就是为了省略创建一个只使用一次的子类的写法,而lambda表达式就是对他的缩减,内部方法只要留下(),同时在()与{}之间加上 ->固定格式就是一个lambda表达式了

2.3.2 什么是?这个表达式其实是一种函数表达式,具体的格式就是() -> {};

method(() ->{
                System.out.println("在游泳");
            }
        );

含义分别是:方法形参、固定语法格式、内部类
2.3.3 如何使用?注意事项?

使用事例如上

注意:

  • 使用前提:只能用在函数式接口的匿名内部类中
  • 函数式接口:只有一个方法的接口
  • 省略写法:可推导,可省略
    • 参数类型可以省略
    • 如果只有一个参数类型,()可以省略
    • lambda表达式执行只有一行,则{},;,return可以省略,但是必须同时省略

极简写法:

method(() ->System.out.println("在游泳"));//一行搞定

至于一些API的具体实现就以后再见吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值