流程语句及方法和数组
流程语句
Switch
switch语句选择的基本数据类型只有byte,short,char,int。没有long并且支持的引用类型都是以上四个基本数据类型的包装类,
java5和7后支持枚举和String类。注意:只要进入一个case后其它的case都会忽略,所以如果没有break则会一直向下执行(穿透)。case后面不能有{}
循环
for循环中,循环迭代变量一般起名为:i,j,k,m,n
for循环的优化问题
由以上可知
方案1:将次数小的放到外层循环,减少内层循环实例化,初始化等次数。
方案2:同时,可以讲for循环内实例化循环变量提取出来。减少实例化次数。循环次数越大,优化越明显
System.out.println(); 换行
System.out.println(); 结尾会多打印一个换行
System.out.print(); 不会打印换行
System.out.printf("%d",a); 格式化打印
return
return直接跳出当前方法,注意其和break的区别。
控制外层循环
在外层循环前面加上标签(要符合标识符规范) 然后用break <标签>控制
方法和数组
DRY原则
开发原则:Don’t Repeat Yourself(不重复自己的代码)。
原因:维护成本大
方法
方法是依赖于对象的,而函数可以独立存在,所以在Java中函数其实是和方法一样(Method)
方法格式:
//方法签名
[修饰符] 返回值的类型 方法名称(形式参数,..,)
{
方法体;
}
方法定义的位置:
在类中定义(在java中最小的程序单元是类)
方法定义在其它方法之外,方法和方法之间是平行关系
Main方法专门由JVM调用
方法名称:遵循标识符规范,使用动词表示,首字母小写,驼峰表示法
参数列表:参数类型 + 参数个数 + 参数的顺序
在同一个类中,方法签名是唯一的
方法重载设计
重载方法的定义:在同一个类中,某方法允许一个以上的同名方法,但是参数列表不同即可。
原则:”两同一不同“:
两同:同类中,方法名相同;
一不同:方法参数列表不同
返回类型无关但是一般要求了返回类型相同
JVM内存模型
JVM内存划分(人为根据不同内存空间的存储特点以及存储数据):
程序计数器:当前线程执行的字节码的行号指示器
本地方法栈:为虚拟机使用的native方法服务
java虚拟机栈(简称栈内存Stack):栈是一种数据结构(Last In First Out)即LIFO,后进先出。同时栈中由栈帧(即栈中一块小空间。main方法就是一个栈帧)
堆(Heap):所有线程共享的一块内存区域,在虚拟机启动时创建,所有对象实例以及数组都要在堆上分配。(new关键字,)
方法区:线程共享的内存区域,存储被虚拟机加载的类信息,常量,静态变量即时编译器编译后的代码数据等
GC(Garbage Collection):垃圾回收器
Java的自动垃圾回收机制:
程序员不需要手动控制内存释放,当JVM发现内存资源紧张的时候,会自动清理无用对象(未被引用的对象)
数组定义
数组定义
方式一:数组元素的类型[] 数组名; int[] age (推荐)
方式二:素组元素的类型 数组名[]: int age[]
数组要初始化才能使用,因为要先为数组分配内存。
数组初始化
静态初始化:由我们自己为每个数组元素设置初始化,而数组长度由系统决定。
语法:数组元素类型[] 数组名 = new 数组元素类型[](元素1,元素2.元素3,…)int[] nums = new int[]{1,3,5};
简单方式:int[] nums = {1,3,5,7};(此种方式声明后一定要先初始化)
本质:数组的初始化,即int[]{1,3,5}其本质是在Heap中创建一个连续的内存空间,再讲其首地址赋值的声明的nums数组变量.
类比于:C语言中malloc()函数在堆空间创建连续内存返回地址。
所以可以得出,num=null;即为空指针,也理解未引用任何空间。
堆中内存空间没有被使用是等着GC回收
动态初始化:由我们来设置数组元素个数,每个数组元素的初始值由系统决定。
语法:数组元素类型[] 数组名= new 数组元素类型[length];
int[] ages = new int[100];
本质:声明时数组nums的值就为null
注意:无论那种初始化,一旦完成就不能改变,除非重新初始化,所以数组时定长的。
不能同时使用静态初始化和动态初始化
数组的基本操作
- array.length求数组的长度
- 索引范围:[0,length-1]
- 获取:array[index] ;设置:array[index] = 值
操作数组的常见异常
NullPointer Exception:空指针异常(空引用)
为初始化直接操作
ArrayIndexOutOfBoundsException:数组索引越界异常
打印数组元素:
直接打印数组的时候,打印出来的是hashCode值。
可以写出一个打印字符串的方法
元素出现索引(线性搜索)
int[] arr = {10,20,30,40,10};
获取元素10在arr数组中第一次出现的索引(indexOf)
获取元素10在arr数组中最后一次出现的索引(lastindexOf)
缺点:数组数据量大,效率低