概述
编译运行过程
- 编译期:.java源文件,经过编译,生成.class字节码文件
- 运行期:JVM加载.class并运行.class
名词解释:
- JVM:java虚拟机。加载.class文件并运行
- JRE:java运行环境。JVM + java类库
- JDK:java开发工具包。JRE+编译、运行等命令工具
运行java程序的最小环境JRE
开发java程序的最小环境JDK
变量
变量是指代在内存中开辟的用于存储运算过程中所需数据的存储空间
声明
int b,c,d; //声明三个整型的变量,名为b,c,d
命名
- 只能包含字母、数字、_和$符,并且不能以数字开头
- 严格区分大小写
- 不能使用关键字,保留字
- 可以中文命名,但规范不允许
- 初始化:第一次赋值
- 声明的同时初始化
- 先声明后初始化
使用
- 对变量的使用就是对它所存的那个数的使用
int a = 5; //声明整型变量a并赋值为5
int b = a+10; //取出a的值5,加10后,再赋值给b
System.out.println(b); //输出变量b的值15
- 变量的使用必须与数据类型匹配
int a = 3.14; //编译错误,数据类型不匹配
- 变量在用之前必须声明并初始化
System.out.println(m); //编译错误,m未声明
基本数据类型
int:整型,4个字节,-21个多亿到21个多亿
- 整数直接量默认为int型,但不能超出范围,超范围则编译错误
- 两个整数相除,结果还是整数,小数位无条件舍弃
- 整数运算时超出范围,则发生溢出,溢出是需要避免的
long:长整型,8个字节
- 长整型直接量需在数字后加L或l
- 运算时或有可能发生溢出,建议在第1个数字后加L
- System.currentTimeMillis()用于获取自1970.1.1零时到此时此刻的毫秒数
double:浮点型,8个字节
- 浮点数直接量默认为double型,表示float需在数字后加F或f
- double型数据参与运算时,有可能会出现舍入误差
boolean:布尔型,1个字节
- 只能取值为true和false
char:字符型,2个字节
- 采用Unicode编码格式,一个字符对应一个码(0到65535)表现形式的是char字符,但实质上存储的是int码,ASCII码(‘a’–97 ‘A’–65 ‘0’–48)
- 字符必须放在单引号中,有且仅有一个
- Unicode是通用的定长字符集,所有字符都是16位
byte:1字节(8位)
short:2字节(16位)
float:4字节(32位)
转义字符
\n 表示换行符,换行是光标移到下一行同样位置。
\r表示回车符,回车是光标移到本行行首。
基本数据类型的转换
两种方式
- 自动类型转换:小类型到大类型
- 强制类型转换:大类型到小类型,例如:(int)doubleNum。强转有可能会发生溢出或精度的丢失
两点规则:
- 整数直接量可以直接赋值给byte,short,char,但不能超范围
- byte,short,char型数据参与运算时,先一律转换为int再运算
运算符与程序的逻辑结构
运算符
- 算术运算符:+ - * / % ++ –
- 自增++,自减–
- 关系运算符: > < >= <= == != boolean
- 逻辑运算符: && || !
- Java逻辑运算遵循“短路逻辑”原则
- &称为不短路与,|称为不短路或
- 赋值运算符:= += -= *= /= %=
- 字符串连接运算符:+
- 三目/条件运算符:boolean?数1:数2
程序逻辑结构
- 顺序结构:从上往下逐行执行,每句必走
- 分支结构:有条件的执行某语句
- 循环结构
分支结构:
- if结构:1条路
- if…else结构:2条路
- if…else if结构:多条路
- switch…case结构:多条路。case1,case2,…是入口,进入以后则不再判断,运行直到switch语句结束因此,由于case块中往往是不同的操作,每次只需执行某个块,需与break配合使用。相比if else语句,switch结构的效率更高,结构更清晰。JDK7.0开始,switch case开始支持字符串表达式
循环结构:
- while:先判断后执行,有可能一次都不执行
- do…while:先执行后判断,至少执行一次
要素1与要素3相同时,首选do…while - for:应用率最高,固定次数循环
循环中关键字
- break:跳出循环,常常与条件语句一起使用
- continue:跳过循环体中剩余语句而进入下一次循环
方法
封装一段特定的业务逻辑功能,方法尽可能的独立,一个方法只干一件事,方法可以被反复调用多次
优点:结构清晰,便于维护,便于合作开发
方法的定义:
修饰词 返回值类型 方法名(参数列表) {
方法体
}
方法的调用
- 无返回值: 方法名(有参传参);
- 有返回值: 数据类型 变量 = 方法名(有参传参)
数组中常用的方法
System.arraycopy方法用于数组复制
public static void arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
参数的意义
src:源数组
srcPos:源数组中的起始位置
dest:目标数组
destPos : 目标数组中的起始位置
length:要复制的数组元素的数量
例如
int[] a = { 10 ,20 ,30 ,40 ,50 };
int[] a1 = new int[6] ;
// 结果:20,30,40,50
System.arraycopy( a , 1 , a1 , 0 , 4 );
Arrays.copyOf方法用于数组复制
类型[ ] newArray = Arrays.copyOf ( 类型[ ] original , int newLength )
例如
int [ ] a = { 10,20,30,40,50 } ;
// 10 20 30 40 50 0
int [ ] a1 = Arrays.copyOf ( a, 6 );
System.arraycopy()效率更高
因为Arrays.copyOf()内部调用的System.arraycopy()
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
程序=算法+数据结构
- 算法:解决问题的流程/步骤(顺序、分支、循环)
- 数据结构:将数据按照某种特定的结构来保存数怎么存