Java语言基础
基础
关键字
标识符:
- 英文大小写字母、数字、下划线、$
- 不能以数字开头
- 不能是java中的关键字
- Java严格区分大小写
注释:
- 单行 //
- 多行 /* */
- 文档注释 /** */
Java语言是强类型语言
基本数据类型:byte(1)、short(2)、int(4)、long(8)、float(4)、double(8)、char(2)、boolean(1)
引用数据类型:class、interface、[]
整数默认是int类型
Java语言整型常量的四种表示形式
- 十进制整数,如:99, -500, 0
- 八进制整数,要求以 0 开头,如:015
- 十六进制数,要求 0x 或 0X 开头,如:0x15
- 二进制数,要求0b或0B开头,如:0b01110011
十进制转二进制
一般算比较小的数字的话,就先找小于并且临这个数最近的2的N次方。然后依次。 比如 37 32 + 4 + 1 对应的就是 100101(32 16 8 4 2 1 有的写1,反之写0)
浮点数使用总结
- 默认是double类型
- 如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类
- 避免比较中使用浮点数(0.1+0.2 == 0.3),需要比较请使用BigDecimal类
// 只有构造参数为String类型时才能保证不丢失精度,因为double类型本身就是不完全精确的。
//正确的姿势:
System.out.println(new BigDecimal("0.1").add(new BigDecimal("0.2")));//输出:0.3
//错误的姿势:
System.out.println(new BigDecimal(0.1).add(new BigDecimal(0.2))); //输出:0.3000000000000000166533453693773481063544750213623046875
这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。
就好像十进制无法精确地表示分数 1/3一样。
长整型用L或者l标记,建议使用L
单精度浮点数用F或者f标记,建议使用F
运算符
int x = 3; // 把3赋值给int类型的变量;
整数/浮点数运算:
- 如果两个操作数有一个为Long, 则结果也为long。
- 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
- 如果两个操作数有一个为double,则结果为double。
- 只有两个操作数都是float,则结果才为float。
--、++ 数字打头,先使用再计算。符号打头先计算再使用。
a++是先办事(进行相关运算),后给钱(然后再将a加1)
++a是先给钱(先给a加1),后办事(然后参与运算)
对于整数a,b来说,取模运算或者求余运算的方法要分如下两步:
1.求整数商:c=a/b
2.计算模或者余数:r=a-(c*b)
求模运算和求余运算在第一步不同
取余运算在计算商值向0方向舍弃小数位
取模运算在计算商值向负无穷方向舍弃小数位
例如:4/(-3)约等于-1.3
在取余运算时候商值向0方向舍弃小数位为-1
在取模运算时商值向负无穷方向舍弃小数位为-2
所以
4rem(-3)= 4-(-1 * -3) =1
4mod(-3)= 4- (-2 * -3) = -2
整数相除只能得到整数,如果想得到小数,必须把数据转化为浮点数。x * 1.0 / y
面试题:
short s = 1; s = s + 1; // 编译不通过的,提示损失精度
隐式类型转换可以从小到大自动转换,即byte→short→int→long;反过来会丢失精度,必须进行显示类型转换;
s = s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int,编译器自动进行了隐式类型转换;所以将一个int类型赋给short就会出错。
short s = 1; s += 1;
s += 1; // 不是等价于 s = s + 1; 而是等价于 s = (s的数据类型)(s + 1);
java 基本数据类型int 和 Integer 有什么区别,阿里编程规范为什么推荐使用Integer?
本质不同:int 是 Java8 大基本数据类型之一,直接存储数值,无对象特性;Integer 是 int 的包装类,属于引用类型(Object 子类),封装了 int 值并提供对象特性。
值与存储:int 默认值 0,存储在栈(局部变量);Integer 默认值 null,对象存堆、引用存栈,可表达 “无值” 语义。
功能限制:int 仅支持基础数值运算,不能调用方法;Integer 可调用 parseInt()/compare() 等工具方法,且支持集合、泛型、序列化(基本类型不支持)。
装箱拆箱:Java5 后支持自动转换(int→Integer 装箱,Integer→int 拆箱),但 Integer 为 null 时拆箱会抛 NPE。
阿里规范: 语义清晰:Integer 的 null 可表达 “未赋值 / 无数据”,而 int 默认 0 易混淆业务含义(如 0 可能是有效数值,也可能是未填写)。
适配场景:集合、泛型、序列化等核心场景仅支持引用类型,必须用 Integer。
总之就是int 是高效的基本数值类型,适合纯数值计算;Integer 是对象类型,阿里规范推荐用它是因为能清晰表达 null 语义、适配集合 / 泛型等面向对象场景,仅局部变量优先用 int。
逻辑运算符:&&(短路与),&(与),|(或),||(短路或),!(逻辑非)
&&和&都是表示“与”,区别是&&只要第一个条件为false,则后面条件就不再判断。而&要对所有的条件都进行判断。||(短路或)和|(或)都是表示“或”,区别是||只要第一个条件为true,则后面的条件不再判断 ,而|要对所有的条件进行判断。
三目运算符:其中"(a<b)?a:b"是一个"条件表达式",它是这样执行的:如果a<b为真,则表达式取a值,否则取b值.
键盘录入?
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
if语句、switch语句、for循环语句、while循环语句、do...while循环语句
switch 语句中的变量类型可以是: byte、short、int 或者 char。JDK5以后可以是枚举,从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
for适合于一个范围的判断 while适合次数不明确的
do...while循环至少执行一次循环体 for和while必须先判断条件是否是true,然后后才能决定是否执行循环体
练习题:
1.在控制台输出所有水仙花数、九九乘法表
2.小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会 花去6元钱,请问,经过多少天,小芳才可以存到100元钱?
break:在循环结构终止本层循环体,从而提前结束本层循环。
continue:跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。
return
方法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
void
方法重载:在同一个类中,方法名相同,参数列表(参数个数不同或者参数类型不同)不同,与返回值类型无关。
数组:用来存储固定大小的同类型元素。数组的length属性用于获取数组长度。
声明数组:
数据类型[] 数组名; // 首选的方法
或
数据类型 数组名[]; // 效果相同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
数组名 = new 数据类型[arraySize];
数组变量的声明,和创建数组可以用一条语句完成,如下所示:
数据类型[] 数组名 = new 数据类型[arraySize];
或
数据类型[] 数组名 = {value0, value1, ..., valuek};
数组的元素是通过索引访问的。数组索引从0开始,所以索引值从0到数组名.length-1。
多维数组:double[] [] balances = new double[10][3];
练习题:
打印输出杨辉三角数
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
练习题:
某个公司采用公用电话网络传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。(提示:使用数组存储)
练习题:
打印当前日期的日历(LocalDate)
冒泡排序
二分查找