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代表不同的数据类型。
没有写完,这个程序还需要继续完善!!!