• java理论之java数组和集合


    我们先来谈谈数组:

      一 数组的常识:

        数组的本质---数组本质上并不是指里面保存的数据,而是保存这些数据的的位置,也就是保存这些数据的内存空间

        数组封装---字面量,变量,常量

        数组的目的就是对数据快速的增删改查

        数组的内存内部结构 :  物理空间上是一段连续挨着的内存空间,同时给他们的标号也是从0开始的自然数

        数组的数据类型 : 应用数据类型

        数组是Java内置的对象,而Array和Collection只是工具对象,用来方便操作数组和集合的

        特殊的数据类型,没有在任何包中,所以不需要导包.,java.util.Arrays只是一个操作类,是操作数组的工具类,使用工具类中工具的时候,需要导包.

        


      1 数组是一种引用数据类型
      2 数组也是一种线性的数据结构(对应的就是表)
      3 数组是一个容器(后面会专门学到容器),用来存储其他的元素
      数据可以存储任意类型的元素
       4 数组按照层数分类:一维数组,二维数组,三维数组,多维数组......;(,每个都是不同的数据类型)
       5 单个数组中,存储的元素的数据类型必须是同一种类型
       6 数组的长度不能直接改变,也就是说,数组里面元素的个数是不能再原数组上直接改变的:数组为保存数据划分的内存空间个数和每个空间的长度不能改变

      二 数据的基本理论

          创建数组的三个步骤---声明,初始化,赋值

          数组里面的的内存空间怎么访问的?是通过下标访问的

          

        数组的特性:
          1 每个单独数组中的元素的数据类型必须是统一的,数据类型统一,也就意味着每个数据在内存中占据的空间大小是一样
          2 数组是引用数据类型,在栈内存中,索引保存的是数组对象第一个元素的内存地址,数组用第一个元素的地址作为数组对象的内存地址.同时在数组声明的时候,会有一个length的默认元素用来保存数组元素的个数.要查找某个元素,只需要首内存地址加上偏移量即可(通过首内存地址,加上偏移量,快速计算出要查找元素的内存地址,从而取得元素).通过内存地址直接查找,所以效率比较高
          3 数组对于数据处理:查找,更改,效率较高,但是增删效率较低;因为增删要保证元素的有序,该元素以后的都要进行向前移位或者向后移位操作

      三 数组排序 ---系统方法排序

            ---冒泡排序:

                 1 参与运算的元素: 两个元素,及其下标,一个临时变量,5个
                  2 外层循环定位第一个元素,然后在内层循环分别和第一个元素后面的每个进行比较一遍,然后小的和第一个元素进行交换,当交换完以后,循环结束(重点:并没有循环到最后一个元素,只是循环到了,满足条件的地方);这个元素就变成了a[i],也就是变成了第一个元素,然后进行第二次内层循环,但是这次会从那个交换位置的下标加一的位置开始匹配(因为交换完,j进行了加一),匹配完,再从第二位开始挨个匹配,依次类推;

           ---选择排序:

                每次都把集合内最小元素放到最左边

                参与运算的元素:两个元素,及其下标,一个临时变量,一个下标临时变量
                步骤:声明一个临时下标变量,先把最左边下标赋值给他,然后在剩下的元素中找最小值元素的下标,把这个下标赋值给那个临时下标变量
                然后,把最左边的元素和这个临时下标变量对应的元素交换位置;依次类推
                相对于冒泡的优点:内层查找一遍完成后,在交换依次
                冒泡是:查找一次,交换一次
                节省了交换效率

              ---相对冒泡的优点:内层查找一篇完成后,在交换依次冒泡是:查找依次,交换依次

        四 数组遍历:   

            for(int i=0;i lt length-1;i++)
            for(数据类型 e : 数组索引变量);

        五 二分查找

            1 二分法查找是建立在已经排序的基础之上的
            2 数据里面没有重复的元素

          

          二分查找算法实现:
            1 确定数据的开始位置和结束位置
            2 然后确定数据的中间位置数据,判断中间位置数据是否为目标数据,如果是,直接返回该数据
            3 如果不是:看数据和中间位置数据的大小,如果大于,则一中间数据位置加一为界,查找后半段中间位置数据是否为目标数据
            4 以此为界,递归或者循环

        六:二维数组

            

            1 二维数组,是特殊的一维数组;每个元素都是个一维数组而已
            2 二维数组的初始化
              静态初始化 int[][] 变量名 = {}
              动态初始化 int[][] 变量名 = new int[3][4]
            3 获取二维数组的元素:先定位外层下标,再定位内层下标,层层递进
            4 遍历二维数组,双层for循环
            5 函数调用 二维数组的传递
              传引用或直接在实参处声

        七 数组模拟栈

                栈的特点:后进先出,压,弹,像弹夹一样

                一个压栈方法:push

                  一个弹栈方法:pop

    索引数组与关联数组图

    ----------------------------------

      

    下面我们来谈谈集合:

        一 集合的原理:

            对象:数据和逻辑封装的一种形式

            程序就两种组成元素:数据和逻辑

            容器:本质是抽象数据在内存中的管理方式

            对象:每个对象都有hashCode()方法,这个方法用于生成对象在内存中的逻辑地址,这就相当于对象的索引,每个对象也有equals方法;对象相等要每次生成的hash码必须相等

            什么是容器:javaAPI提供的一系列的类的实例,用于在程序中存放对象;大小不固定的类;1136(一个图,一个类,三个知识点,6个接口)

        二 集合在java.util包:

            多态的密集应用;最大的灵活性:指针,一用用上级接口,对象用最下面的对象;调用的方法,还是上级的方法;指向的对象就可以随便换

            只能添加对象;不能添加基本数据类型;栈里面的会随时被清空

        三 Collection(集合)

           1:只装值,不需要小标,小标默认,equals()

           2:Collection c = new HashSet();

           3:方法();

            boolean isEmpty():是否为空
            int size():元素个数
            boolean contains(Object element):是否包含某对象
            void clear():清空
            boolean add(Object element):添加厶对象
            boolean remove(Object element):删除某元素
            Iterator iterator():迭代器,遍历出所有的元素
            boolean containAll(Collection c):两个结合元素是否一样
            boolean addAll(Collection c):同时忘集合中添加多个对象
            boolean remove(Collection c):同时删除多个元素
            boolean retainAll(Collection c):两个集中都有的对象
            Object[] toArray():集合变成数组

           4:集合set(无序,不重复,没有默认下标)HashSet:塑料袋,(hashcode下标),本质是hashMap,没有了key

           5:集合list(有序,可重复,有默认下标)

              它的方法():  

                Object get(int index);
                Object get(int index, Pbject element);返回旧元素
                Void add(int index, Object element);
                Object remove(int index);
                int indexOf(Object o);
                int lastIndexOf(Object o);'

           6:集合Map---自定义下标,自定义值:key=>value(键也是一个对象)

                ---HashMap/TreeMap:就相当于中药柜子

                             键不能重复;具体操作是挨个的equals,但是这样太慢,所以Map给每个键生成了一个HashCode存放在HashTable中,每次比较的是hash码,把比较对象的键调用HashCode()函数生成HashCode,再去HashTable中比较就快多了;本质就是缓存的思想

                ---Map方法()            

                    Object put(Object key, Object Value);
                    Object get(Object key);
                    Object remove(Object key);
                    Object containsKey(Object key);
                    Object ContainsValue(Object Value);
                    int size()
                    boolean isEmpty()
                    void putAll(Map t);
                    void clear()

           7:集合操作---普通迭代遍历:for/while

                ---Iterator          

                    迭代器:用于挨个取出容器中的元素,每个集合都是先了这个,都有iterator()方法,就认为是一个指针,游标.
                    hasNext():是否有下一个元素
                    next():拿出下一个元素
                    remove():删除元素

                ---增强for循环  

                    for(集合中元素的类型 对象变量 : 集合)

                    其内部调用的还是Iterator;删除还是要用Iterator的删除

            8:泛型---泛型是个继承体系,和异常差不多,如果父类,系统类打了标签,你就必须打标签(接口)

               ---泛型的本质还是数据类型         

                      基础数据类型自动转换
                      基础数据类型强制转换
                      自动数据类型转换
                      强制数据类型转换
                      装箱/拆箱

    集合总结:可以用1136来表示---一个图

                 ---一个类:Collections

                 ---三个知识点:For,Generic,boxing

                 ---六个接口              

                      Collection
                      Map
                      Set
                      List
                      Iterator
                      Compare

  • 相关阅读:
    随机数
    质数
    猜数
    失败
    判断质数
    2019.7.21记录
    9*9乘法表
    小人
    奔跑的字母

  • 原文地址:https://www.cnblogs.com/xcxcxc/p/4666136.html
Copyright © 2020-2023  润新知