java4

switch-case

switch语句后的表达式的数据类型只能是byte,short,char,int四种数据类型,String(java.lang.String类型,不能是StringBuffer和StringBuilder类型)和枚举类型

结束循环
  • break

    • 结束其所在的循环

    在这里插入图片描述

    在这里插入图片描述

    • 直接结束其外层循环

      • break后面紧跟一个标签,这个标签用于表示一个外层循环

      • 标签是一个紧跟英文冒号的标识符,只有放在循环语句之前才有作用

        在这里插入图片描述
        在这里插入图片描述

  • continue

    • 忽略本次循环剩下的语句

    • 紧跟一个标签,直接跳过标签所标识循环的当次循环的剩下语句,重新开始下一次循环。
      在这里插入图片描述

      在这里插入图片描述

  • return

    • 结束方法

      在这里插入图片描述

关于数组

理解什么是数组?

  • 数组是一种引用类型
    • int是一种基本类型,但是int[]是一种引用类型
    • 数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效的内存,因此
      • 定义数组时不能指定数组的长度。
      • 没有内存空间内来存储数组元素,这个数组不能使用,只有对数组进行初始化后才可以使用
  • 所有的数组元素具有相同的数据类型
    • 因为java是面向对象的,类与类之间可以支持继承关系,这样可以产生一个数组里可以存放多种数据类型的假象。
    • 一个水果数组,实际上数组元素既可以是水果,也可以是香蕉,苹果等(苹果,香蕉都继承了水果,都是一种特殊的水果),但这个数组的数组元素的类型还是唯一的,只能是水果类型。
  • 一旦数组的初始化完成,数组在内存中所占用的空间将被固定下来。数组的长度不可以改变。

定义数组

  • 格式:type[] arrayName;
  • 注意:定义数组时不能指定数组长度

数组的初始化

  • 数组必须先初始化后才能使用

  • 初始化就是:为数组的数组元素分配内存空间,并为每个数组元素赋初始值

    • 可以只分配空间不赋值?
      • 不可以!一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是该元素的值。即使这个内存空间里存储的内容是空,这个空也是一个值(null)。
  • 数组的初始化有两个方式:

    • 静态初始化:

      • 由程序员指定每个数组元素的初始值,由系统决定初始长度
      • 格式:
        • arrayName = new type[]{element1,element2...}
        • 定义过程中并初始化:type[] arryName = {element1,element2...}
          • type:必须与定义数组变量时使用的type相同,也可以是定义数组时所指定的type的子类。
      int[] intArr;//定义了一个int数组类型的变量
      intArr = new int[]{5,6};
      Object[] objArr;
      objArr = new String[]{"Java","李刚"};//定义数组时所指定的数组元素类型的子类
      //String类型是Object类型的子类,即字符串是一种特殊的Object实例
      int[] a = {2,3,4};//定义的过程中并完成初始化
      
    • 动态初始化:

      • 程序员只指定数组长度,由系统为数组元素分配初始值
      • 格式:arrayName = new type[length];
      int[] prices = new int[5];
      Object[] books = new String[4];
      
      类型 初始值
      整数类型(byte,short,int,long) 0
      浮点类型(float,double) 0.0
      字符类型(char) ‘\u0000’
      布尔类型(boolean) false
      引用类型(类,接口,数组) null

使用数组

在这里插入图片描述

foreach循环

  • 这种循环遍历数组和集合,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素

  • 格式

    for(type vaName : array | collection)
    {
        //vaName自动迭代访问每个元素...
    }
    //type是数组元素或集合元素的类型,vaName是一个形参名,foreach循环自动将数组元素,集合元素依次赋给该变量。
    
  • 例子

在这里插入图片描述

在这里插入图片描述

深入数组

内存中的数组

在这里插入图片描述

  • 数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存时,才可以通过该数组变量来访问数组元素。
  • 实际的数组对象被存储在堆内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么它将存储在栈内存中。
  • 如果想要访问堆内存中的数组元素,程序只能通过p[index]的形式来实现。数组引用变量是访问堆内存中数组元素的根本方式。

关于堆栈的一系列问题

为什么会有堆内存和栈内存之分?
  • 当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此在所有方法中定义的局部变量都是放在栈内存中的。
  • 在程序中创建一个对象时,这个对象将会保存到运行时数据区中,以便反复利用(对象的创建成本比较大),这个运行时数据区就是堆内存。堆内存中的对象不会随的方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。
    • 因此,让垃圾回收机制回收一个数组所占用的内存空间,可以将该数组变量赋值为null,也就切断了数组引用变量和实际数组之间的引用关系,实际的数组也就变成了垃圾。

只要类型相互兼容,就可以让一个数组变量指向另一个实际的数组。这种操作会让人产生数组的长度可变的错觉。

在这里插入图片描述

  • 定义并初始化一个数组后,在内存中分配了两个空间,一个是用于存放数组的引用变量,一个是存放数组本身。

在这里插入图片描述

在这里插入图片描述

  • 一定要把数组看成两个部分:
  • 数组引用
    • 在代码中定义的数组引用变量
  • 实际的数组对象
    • 在堆内存里运行的,通常无法直接访问它,只能通过数组引用变量来访问。
数组的初始化:基本类型数组的初始化,引用类型数组的初始化

基本类型数组的初始化

数组元素的值直接存储在对应的数组元素中。初始化数组时,先为该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。操作基本类型数组的数组元素时,实际上相当于操作基本类型的变量。

在这里插入图片描述

在这里插入图片描述

引用类型数组的初始化

引用类型数组的数组元素是引用。每个数组元素里存储的还是引用,它指向另一个块内存,这块内存里存储了有效数据。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

java中由多维数组吗?

java语言提供了支持多维数组的语法。但是如果从数组底层的运行机制上来看,没有多维数组。

二维数组:

  • 格式:

    • type[][] arrName;
  • 解释:

    • 实质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。
  • 初始化:(动态)

    • 多次:
      • arrName = new type[length][];
      • 元素的类型是type[]
      • new type[length];初始化一维数组后,相当于定义了length个type类型的变量
      • new type[length][];初始化后,相当于定义了length个type[]类型的变量 。之后还要再次初始化这些(一维)数组

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 一次:

    • 从上面可以看出来,初始化多维数组的时候可以只指定最左边维的大小;当然,也可以一次指定每一维的大小。
    • int[][] b = new int[3][4];
    • 执行后的存储示意图:

在这里插入图片描述

  • 初始化(静态):

    String[][] str1 = new String[][]{new String[3], new String[]{"Hello"}};
    String[][] str2 = {new String[3], new String[]{"Hello"}};
    

在这里插入图片描述

如果想在Java中实现可无限扩展的数组,可以定义一个Object[]类型的数组,这个数组的元素是Object类型,因此可以再次指向一个Object[]类型的数组,这样就可以从一维数组扩展到二维数组,三维数组…

Arrays

Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组,这个Arrays类里包含了如下几个static修饰的方法(static修饰的方法可以直接通过类名调用)

  • 查找
    • int binarySearch(type[] a, type key);
      • 使用二分法查询key元素值在a数组中出现的索引
      • 如果a数组不包含key元素值,则返回负数。
      • 调用该方法时要求数组中的元素已经按照升序排列,这样才能得到正确的结果。
    • int binarySearch(type[] a, int fromIndex, int toIndex, type key);
      • 在a数组从fromIndex到toIndex索引中,使用二分法查询key元素值出现的索引
      • 如果a数组不包含key元素值,则返回负数。
      • 调用该方法时要求数组中的元素已经按照升序排列,这样才能得到正确的结果。
  • 复制
    • type[] copyOf(type[] original, int length);
      • 这个方法将会把original数组复制成一个新数组,其中length是新数组的长度。
      • 如果length小于original数组的长度,则新数组就是原数组的前面length个元素。
      • 如果length大于original数组的长度,则新数组的前面元素就是原数组的所有元素,后面补充0(数值类型),false(布尔类型),null(引用类型)。
    • type[] copyOfRange(type[] original, int from, int to);
      • 这个与前面类似,但是这个只复制original数组的from索引到to索引的元素。
  • 比较
    • boolean equals(type[] a, type[]a2);
      • 如果a数组和a2数组的长度相等,而且a数组和a2数组的数组元素也一一相同,该方法返回true。
  • 赋值
    • void fill(type[] a, type val);
      • 将把a数组的所有元素都赋值为val
    • void fill(type[] a, int fromIndex, int toIndex, type val);
      • 与前面一样。区别是仅仅将a数组的fromIndex到toIndex索引的数组元素赋值为val
  • 排序:
    • void sort(type[] a);
      • 对a数组的数组元素进行排序
    • void sort(type[] a, int fromIndex, int toIndex);
      • 与前面类似。区别就是仅仅对fromIndex到toIndex索引的元素进行排序
  • 转换字符串:
    • String toString(type[] a);
      • 将一个数组转换为一个字符串。
      • 按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号(,)和空格隔开。

在这里插入图片描述
在这里插入图片描述

Arrays类处于java.util包下,为了在程序中使用Arrays类,必须在程序中导入java.util.Arrays类。import语句。

其中System类里也包含了一个static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 该方法可以将src数组里的元素赋值给dest数组的元素,其中srcPos指定从src数组的第几个元素开始赋值,length参数指定将src数组的多少个元素赋值给dest数组的元素。

下面的一些是Java8增强了Arrays类的功能,为Arrays类增加了一些工具方法,这些工具方法可以充分利用CPU并行的能力来提高设值,排序的性能。Java8增加了并发支持,并发支持可以充分利用硬件设备来提高程序的运行功能。

  • 计算:
    • void parallelPrefix(xxx[] array, XxxBinaryOperator op);
      • 该方法使用op参数指定的计算公式计算得到的结果作为新的元素。
      • op计算公式包括left,right两个形参。left代表数组中前一个索引处的元素,right代表数组中当前索引处的元素。
      • 当计算第一个新数组元素时,left的值默认为1
    • void parallelPrefix(xxx[] array, int fromIndex, toIndex, XxxBinaryOperator op);
      • 与上面一样,区别是该方法仅重新计算fromIndex到toIndex索引的元素
  • 。。
    • void setAll(xxx[] array, IntToXxxFunction generator);
      • 该方法使用指定的生成器(generator)为所有数组元素设置值,该生成器控制数组元素的值的生成算法
    • void parallelSetAll(xxx[] array, IntToXxxFunction generator);
      • 与上一个相同,只是该方法增加了并行能力,可以利用多CPU并行来提高性能
  • 排序
    • void parallelSort(xxx[] a);
      • 该方法的功能与Arrays类以前就有的sort()方法相似,只是该方法增加了并行能力,可以利用多CPU并行来提高性能。
    • void parallelSort(xxx[] a, int fromIndex, int toIndex);
      • 与上一个类似,区别是该方法仅仅对fromIndex到toIndex索引的元素进行排序。
  • 。。
    • Spliterator.OfXxx spliterator(xxx[] array);
      • 将该数组的所有元素转换为对应的Spliterator对象
    • Spliterator.OfXxx spliterator(xxx[] array, int startInclusive, int endExclusive);
      • 与上一个类似,只是该方法仅转换startInclusive到endExclusive索引的元素。
  • 。。
    • XxxStream stream(xxx[] array);
      • 将该数组的所有元素转换为Stream,Stream是Java8新增的流式编程的API
    • XxxStream stream(xxx[] array, int startInclusive, int endExclusive);
      • 相类似,区别是仅将fromIndex到toIndex索引的元素转换为Stream

上面所有以parallel开头的方法都表示该方法可利用CPU并行的能力来提高性能。xxx代表不同的数据类型。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

没有写完,这个程序还需要继续完善!!!

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页