Java语言基础

25 阅读7分钟

Java语言基础

基础

关键字

标识符:

  • 英文大小写字母、数字、下划线、$
  • 不能以数字开头
  • 不能是java中的关键字
  • Java严格区分大小写

注释:

  • 单行 //
  • 多行 /* */
  • 文档注释 /** */

Java语言是强类型语言

基本数据类型:byte(1)、short(2)、int(4)、long(8)、float(4)、double(8)、char(2)、boolean(1)

java_data_type.png

引用数据类型: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类型的变量;

整数/浮点数运算:

  1. 如果两个操作数有一个为Long, 则结果也为long。
  2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
  3. 如果两个操作数有一个为double,则结果为double。
  4. 只有两个操作数都是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];

double_dimensional_array.png

练习题:
	打印输出杨辉三角数
		     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)
	冒泡排序
	二分查找