JAVA学习记录2——Java基础
一、Java数据类型
1.基本数据类型
- Java基本类型有固定的范围和字段长度,不受操作系统影响,保证了Java程序的可移植性
- Java整形常量数值默认int型,声明long型常量在后面加l或L以区分
- Java浮点形常量数值默认double型,声明float型常量在后面加f或F以区分
float num = 1.1
错误。通常情况下使用double - Java浮点型0.xxx中0可省略,表示为
.xxx
123e2
表示123的2次方 - 浮点数=符号位+指数位+尾数位
尾数位部分可能丢失,造成精度损失 - 浮点数的使用陷阱
double num1 = 2.7
double num2 = 8.1/3;
System.out.println("num1="+num1);
输出不是2.7,是接近2.7的小数
if (num1 == num2)//判断不相等
PS:当我们对运算结果是小数进行相等判断时,应该以两个数的差值的绝对值在某个精度范围内判断
if (Math.abs(num1 - num2)<0.00001) {
System.out.println(Math.abs(num1 - num2));
}
-
Java中char2个字节(可存放汉字)
char本质为一个整数,输出时unicode码对应字符
存储时’a’ -> 码值97 -> 二进制 -> 存储
Unicode(兼容ASCII码)字母汉字都2字节,UTF-8字母1字节汉字3字节,GBK字母1字节汉字2字节 -
Java中的布尔类型boolean只能为true或false,不能为null,也不能像C语言用0或非0整数代替
-
Java中没有无符号数,都是有符号的
-
Java中null必须小写
2.引用数据类型
类class
接口interface
数组[ ]
3.基本数据类型转换
1.自动类型转换
进行赋值或运算时,精度小的类型可自动转换为精度大的类型
注意:
表达式结果类型会自动提生为操作数中最大的类型
byte、short、char三者可以进行计算,计算时会首先转换为int类型
2.强制类型转换
自动类型转换的逆过程(int) n
将精度大的类型转换为精度小的类型
注意精度降低或溢出
3.基本数据类型和String类型的转换
- 基本数据类型转String
基本类型值+""
int n = 1;
String str = n + "";
- String转基本数据类型
通过基本类型的包装类调用parseXX方法
PS:要确保String能转换成有效数据
Integer.parseInt("123");//Integer为int的包装类
Boolean.parseBoolean("true");
String转char,就是取字符串的第一个字符
String str = "53";
System.out.println(str.charAt(0));
输出'5'
二、Java运算符
只整理新了解的特点
1.关系运算符:
instanceof
作用:检查是否是类的对象,判断对象的类型是否为XX类型或XX类型的子类
"java" instanceof String;
结果true
String instanceof Object;
结果true
2.逻辑运算符:
&&、||是短路逻辑运算符
&、|既是逻辑运算符,又是位运算符
短路与&&和逻辑与&区别:
- &&如果第一个条件为false,则第二个条件不会判断,直接判定结果false,效率高
- &不管第一个条件是否为false,第二个条件都要判断,效率低
- 开发中,多使用短路与&&,效率高
短路或 || 和逻辑或 |:
- ||如果第一个条件为true,则第二个条件不会判断,直接判定结果true,效率高
- |不管第一个条件是否为true,第二个条件都要判断,效率低
- 开发中,多使用短路或||,效率高
逻辑异或^:不同为true,否则为false
3.赋值运算符
复合赋值运算符( +=、++)会进行类型转换
byte b = 2;
b += 2; //等价 b = (byte)(b+2)
b++; // b = (byte)(b+1)
4.位运算符
算数右移:>>
低位溢出,符号位不变,并用符号位补溢出的高位(本质是每右移一位/2)
算数左移:<<
符号位不变,低位补0(本质是每左移一位*2)
逻辑右移(无符号右移):>>>
低位溢出,高位补0
以0b或0B开头可以表示二进制数
5.运算符优先级
从高到低优先级递减
三、常用语句
1.输入语句
Java中接收用户输入需要一个扫描器(对象)Scanner
步骤:
- 导入该类所在的包,java.util
- 创建该类对象(声明变量)
- 调用里面的功能
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //创建对象
String name = scanner.next();
int age = scanner.nextInt(); //nextInt()表示接收int类型,其他类型同理
}
}
2.获得随机数
🌰
System.out.println((int)(Math.random()*100)+1);
//随机获得1~100的数,即[1,101)
import java.util.Random;
Random r = new Random();
int type = r.nextint(3);
//随机生成0,1,2中的一个整数
3.break、continue
break、continue语句出现在多层嵌套的语句块中时,可通过标签指明要终止哪一层。
标签自己指定名称,实际开发中尽量不要使用
label1:
for (int i = 0;i<4;i++) {
label2:
for (int j = 0;j<10;j++) {
if (j == 2){
break lable1; //跳出到lable1,跳出外层循环
}
System.out.println(j);
}
}
4.增强for循环
int[] nums = {1,2,3,4};
for (int i : nums) {//从nums数组依次取值赋给i
System.out.println(i);
}//nums全部取完则退出
四、数组
1.Java中数组的定义与使用
数组的静态初始化:
中括号[ ]写在数组名前或后都可。
double[] score = {10,9,8,7,6};
System.out.println(score.length); //数组长度,数组名.length
数组的动态初始化:
数据类型 数组名[] = new 数据类型[空间大小]
double score[] = new double[5];
a[0] = 10;
a[1] = 9;
……
int[] a[] = new int[2][3];//二维数组
数组属于引用类型,数组型数据是对象(object)
2.数组的赋值机制
1)基本数据类型赋值,这个值就是具体的数据,相互不影响int n1 = 1;
;int n2 = 2;
2)数组在默认情况下是引用传递,赋的值是地址
int[] arr1 = {1,2,3};
int[] arr2 = arr1; //相当于让arr2指向arr1地址
改变arr2会影响arr1
数组的拷贝(开辟新的空间):
int[] arr1 = {1,2,3};
int[] arr2 = new int[arr1.length];
for (int i=0;i<arr1.length;i++) {
arr2[i] = arr1[i];
}
3.数组的添加
- 定义初始数组
- 定义一个新数组
- 遍历初始数组,将其元素拷贝到新数组
- 把要添加的值赋给空余的元素
- 让初始数组指向新数组,初始数组的原有空间会被自动销毁
动态添加:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
int[] arr = {1,2,3};
do {
int[] arrNew = new int[arr.length + 1];//比原数组多一个空间
for (int i = 0; i < arr.length; i++) {
arrNew[i] = arr[i];
}
System.out.println("请输入添加的元素:");
int addNum = myScanner.nextInt();
arrNew[arrNew.length - 1] = addNum;
arr = arrNew;
for (int i = 0;i<arr.length;i++) {
System.out.print(arr[i]+"\t");
}
System.out.println("是否继续添加? y/n");
char key = myScanner.next().charAt(0);
if (key == 'n') {
break;
}
}while(true);
}
}
4.Java中二维数组
1)Java中二维数组的存储形式:
2)Java中二维数组列数不确定:
int [][] arr = new int [3][]; //创建二维数组,只是确定了一维数组的个数,一维数组为空
for (int i = 0;i<arr.length;i++) {
arr[i] = new int [i+1]; //给每个一维数组开空间
//没开辟的则是NULL
for (int j = 0;j<arr[i].length;j++) {
arr[i][j] = i + 1; //逐个赋值
}
}