文章目录
Java跨平台原理
平台是指操作系统:
- Windows
- Mac
- Linux
JVM是运行java程序的虚拟机,其本身非跨平台,实际跨平台是java程序
Java开发环境
JVM(Java Virtual machine)
虚拟机,class文件运行所在地JRE(Java Runtime Environment)
运行环境,包括JVM与核心类库JDK(Java Development kit)
开发工具,包括JRE与编译运行工具
JDK安装目录
bin
存放JDK各种工具命令conf
存放JDK配置文件include
存放平台特定头文件jmods
存放JDK各种模块legal
存放JDK各模块授权文件lib
存放JDK工具补充的jar包
IDEA项目结构
- 层级关系:
project->module->package->class
- 每个上级可创建并管理多个下级,该结构的划分为了方便管理类文件
package包使用
作用:
- 区分相同名字的类
- 类数量多的时候,可以管理类
- 控制访问范围
基本语法:
package com.xxx
,package关键字表示包,com.xxx
包名- 只能包含数字、字母、下划线、小圆点,但不可数字开头,不为关键字和保留字
- com.公司名.项目名.业务模块名,如
com.sina.crm.user
import java.util.*;
引入java.util包下的所有类,推荐按需导包- 同一类名于两个不同包下,一个可以import导包,另一个需全类名使用
本质:创建不同的文件夹来管理类
java中常用的包:
java.lang.*
基本包,默认引入java.util.*
util包,系统提供的工具类,如Scannerjava.net.*
网络包,用于网络开发java.awt.*
java界面开发,GUI
IDEA快捷方式
alt+1
打开/隐藏工程目录结构alt+4
打开/隐藏控制台ctrl+alt+l
格式化代码alt+enter
代码修正提示ctrl+D
向下复制一行ctrl+X
剪切当前行ctrl+/
单行注释ctrl+alt+/
多行注释alt+shift+↑
上移当前行alt+shift+↓
下移当前行
Java变量及其规范
变量是在内存中开辟的存储空间,用于存放数据,一个声明的变量对应一块内存空间。
声明并赋值:
int a = 5;
变量命名规范:
- 字母、数字、_ 、$为命名,不可数字开头,可中文命名,但不推荐
- 严格区分大小写,驼峰命名(小驼峰适用于变量、方法命名,大驼峰适用于类命名)
- 不能使用关键字
变量缓存机制
java使用了中间变量缓存机制,在执行自增运算的时候,会为每个自增操作分配一个临时变量。如果是前缀加(++i)会先自加1后赋值(给临时变量),如果是后缀加(i++),就会先赋值后加1,运算最终使用的并不是变量本身,而是被赋了值的临时变量。
Java常量简介
可于Java程序中直接写出来的数据,或在程序执行过程中不可改变的值(被final关键字修饰),分为字符串常量、整数常量、小数常量、字符常量、布尔常量。
常量优化机制
在给一个变量赋值的时候,如果
=
的右边全部是常量(包括final关键字定义的常量在内),那么在编译阶段计算出结果;如果范围不超过左边的变量类型的范围,那么就会赋值成功如果超过就会赋值失败。右边如果存在变量,则不会触发常量优化机制。
byte a = 3;
byte b = 4;
byte c = 3 + 4; //触发常量优化机制,编译通过
//byte c = a + b; 两个变量转为int类型,相加后无法直接赋值给byte类型,报错
byte d = (byte)(a + b);//强转之后,不会报错
Java数据类型
基本数据类型
整数型:btye(1)、short(2)、int(4)、long(8)
- 整数运算超出范围会发生溢出(避免),BigInteger无穷类型解决
- 整数字面量默认为int,超出int类型范围会报类型错误。
- byte、short、int、long都可直接用int类型常量值创建
- long常量需要在值后面加L或l
- 运算时若可能溢出,建议第一个值加L
- byte-(-128~127)、int-21亿溢出、long-200亿溢出
浮点型:float(4)、double(8)
- 小数默认double,float类型值需加F或f
- double运算会出现舍入误差,原因是二进制转换误差
符号(字符)型:char(2)
- 采用Unicode编码(Unicode包含ASCII),字符对应码
- 表现是字符char,实际上码int,可直接用int类型常量值创建
- 字符字面值放入单引号中,且只有一个
布尔型:boolean(1)
System.currentTimeMilis()
获取1970.1.1零点到此刻的毫秒数,数据类型是longBigDecimal类可以实现精准运算
引用数据类型
- 类(class)
- 接口(interface)
- 数组([])
Java类型转换
类型容量小到大(两条线不互通):
- char、int、long、float、double
- byte、short、int、long、float、double
自动类型转换:小类型转为大类型:
- 多种类型数据混合运算,所有数据自动转换为其中最大容量的类型
- byte、short和char三者进行运算时全先转为int类型
- boolean不参与转换
强制类型转换:大类型转为小类型:
- 强转可能会发生溢出、丢失精度
- 强制转换:
long b = 10000000000L; int a = (int)b;
- 强转符只对最近的值有效,可使用小括号提高优先级
基本数据类型和String类型转换(包装类转换):String转换为基本数据类型时,要确保String类型能后转成有效数据,如"123"可转为整数,但是"hello"不可以,会抛出异常
Java运算符
优先级及其结合性
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[] | 左到右 |
2 | !、+(正)、-(负)、++、– | 右到左 |
3 | *、/、% | 左到右 |
4 | +(加)、-(减) | 左到右 |
5 | <<、>>、>>> | 左到右 |
6 | <、<=、>、>=、instanceof | 左到右 |
7 | ==、!= | 左到右 |
8 | &(按位与) | 左到右 |
9 | ^ | 左到右 |
10 | | | 左到右 |
11 | && | 左到右 |
12 | || | 左到右 |
13 | ? : | 右到左 |
14 | +=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、>>>= | 右到左 |
小括号
>单目运算符
>算数运算符
>位移运算符
>比较(关系)运算符
>逻辑运算符
>三元运算符
>赋值运算符
运算符注意事项
- % 取模运算符本质:
a - a / b * b
- 逻辑运算符最终结果为boolean值
- ^ 异或运算符,不同为真,相同为假
- 复合赋值运算符会进行类型强转,例如
byte a = 1; a += 1;
等价于a = (btye)(a + 2);
- 三元运算法问号后的两个表达式需为可直接赋值给接收变量的类型(或可自动转换)
- 自加++和自减–时会进行强制类型转换,例如
double a = 1.0; a++;
等价于a = (double)(a+1);
;并且会使用到java缓存变量机制
三目运算符解析
- 如果定义了数据类型的变量与未定义变量的数值 共同参与三元运算符的后双目运算,那么返回的结果就是范围大(精度高)类型,若两个操作数中有一个是常量数字S,另外一个是表达式,且其类型为T;若数字S在T的范围内,則转换为T类型;若S超出了T类型的范围,则T转换为S类。
- 如果两个定义了数据类型的变量共同参与三元运算符的后双目运算,那么返回的结果就是范围大(精度高)类型
- 如果直接进行数值的比较,会自动转型成为范围大(精度高)的数据类型
- 如果是两个包装类进行后双目运算,则自动拆箱为基本数据类型后,再自动转为最大精度的基本数据类型;最后根据接收变量的类型决定是否装箱。
Java分支控制
- 单分支:
if;
双分支:if-else;
多分支:if - else if - else;
- 分支可以嵌套,但建议不超过三层(可读性不好)
- switch中表达式数据类型应与case后的常量类型一致,或是可以自动转换成可比较的类型,如char表达式和int常量
- switch表达式返回值需为:
byte、short、int、char、enum、String
switch的case穿透现象
在switch语句中,如果case后的代码块不以break结束,会出现穿透现象。
现象:发生case后,后续case将不会具有匹配效果,且其内部的语句都会执行。
应用场景:当switch语句中多个case中的语句出现重复,可考虑使用case穿透现象进行代码优化。
Java循环控制
三种循环区别:
- for、while先判断后执行,do…while先执行后判断
三种循环应用场景:
- 明确循环次数,推荐for
- 不明确循环次数,根据需求选择while、do…while
- break默认终止最近的循环体,可通过标签指明终止哪一个循环体
- continue默认跳过最近的本次循环体,可通过标签指明跳过哪一个循环体
loop:while(true){ switch(a){ case 0:break loop;//指明结束的是loop标签的while循环 } }
Random类的使用
作用:根据开发者的需求产生一个随机数(伪随机数)
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。
Random r = new Random();
int a = r.nextInt(10);//产生[0,10)范围的随机Int类型
Java的进制
- 十进制:Java中的值默认十进制,无需修饰
- 二进制:数值前以
0b
修饰- 八进制:数值前以
0
开头- 十六进制:数值前以
0x
开头注意:java中任何进制的值在控制台打印时,皆以十进制展示
进制间转换
系数:每位上的数 基数:n进制的基数是n 权:从进制数右边起由0递增
n进制转十进制:
系数*基数的权次幂相加
十进制转n进制:
除基取余,余数倒置
二进制转n进制(十进制除外):
2^i=n,右边起取i位二进制数为一组转为n进制数
原码反码补码
计算机所有运算都是以二进制补码的形式进行!!!
正数的原码、反码、补码三码合一
负数的反码是其原码符号位不变,其余位取反;补码是反码加1
位运算符
- 按位与&
- 按位或|
- 按位异或^:相同为假,不同为真
(¬a∧b) ∨ (a∧¬b)
- 按位取反~:全部取反,包括符号位
- 算数右移 >> :低位溢出,符号位补高位
- 算数左移 <<:符号位不变,低位补0
- 逻辑右移 >>>:低位溢出,高位补0
- 算数左右移的本质是,左乘右除 2的n次方
异或实现数据交换:
Java数组
数组介绍与使用
数组(Array)是一种容器,用来存储同种数据类型的多个值。
数组是引用数据类型,本质是一个对象
//动态初始化数组:数据类型[] 数组名 = new 数据类型[数组长度];
//动态初始化,指定数组长度,系统会为数组容器中每个成员分配初始值
int[] arr = new int[5];
//静态初始化数组:数据类型[] 数组名 = new 数据类型[]{值1,值2,值3};
//静态初始化:指定数组要存储的元素,系统自动计算数组长度
int[] arr = new int[]{1,2,3};
int[] arr2 = {1,2,3};//静态初始化数组简化版,new的过程依旧存在
使用数组的注意事项:
- 数组下标越过指定范围就会报异常:
ArrayIndexOutOfBoundsException
- 数组创建未赋值,系统自动赋予默认值(整型为0;浮点型为0.0;字符型为\u0000;布尔型为false;引用类型为null)
- 数组变量存放于栈内存中,其保存的引用指向堆内Array对象
- 可通过
数组名.length
获取数组长度