【Java学习日记】学习Java的一篇记录博客

Java

java简介

共分出三个版本:JavaSE (标准版)、JavaEE(企业版) 、JavaME(瘦身版)

Java程序基础

程序基本结构

一个Java程序:

public class Hello {
​
•       public static void main(String[] arge){
​
•           System. out. println("Hello,world");
​
•       }
​
•   }

在Java中,在总能找到类似下面的定义:

    public class Hello {
​
•       ...
​
•   }

这个定义被称为class(类),Hello为类名(大小写注意),public则表示这个类是公开的,{ }中间的为类的定义( 类的定义中可以定义方法 )。

  • 一个程序的基本单位是class,class是关键字,用来定义一个类。

  • Hello是类名,区分大小写,类名要求:以英文字母开头,后接字母、数字、下划线,且习惯以大写字母开头。

  • public是访问修饰符,表示改class公开的,不写也可以编译,但这个类无法从命令行执行。

  • calss内部可以定义若干个方法

public class Hello {
​
•       public static void main(String[] arge){
​
•           ...
​
•       }
​
•   }

其中方法名为main,返回值为void,表示没有任何返回值

  • 方法定义了一组执行语句,会被依次执行。

  • public也可以修饰方法

  • static也是修饰符,表示静态方法;Java入口规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是String数组

  • 方法名命名和class一样,但首字母小写

  • 方法内部的语句才是真正的执行代码

  • Java的每一行语句必须以分号结束

注释以/*开头 ; */结尾;多行注释则只改变开头为/**

变量

变量分为基本类型的变量和引用类型的变量。

变量的作用范围:只作用于定义它的语句块,而语句块由花括号切割;同名的变量由于作用域不同,所以是两个不同的变量。

(感觉和c语言一样,不多说)

基本数据类型

数据类型是CPU可以直接进行运算的类型。

Java定义的几种基本数据类型:

  • 整型:byte、short、int、long

  • 浮点型:float、double(浮点型数据加f后缀)

  • 字符型:char(除了可以表示标准的ASCll外,还可以表示Unicode字符 另:char类型需要使用单引号且只有一个字符,而双引号则是字符串)

  • 布尔类型:boolean

前三个基本和c一样。

一个字节是1byte,1024字节是1K,1024K是1M,1024M是1G,1024G是1T;

计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000~11111111,换算成十进制是0~255,换算成十六进制是00~ff

  • byte占一个字节

  • short占两个字节

  • int占四个字节

  • long占八个字节

  • float占四个字节

  • double占八个字节

  • char占两个字节

布尔类型:

布尔类型boolean只要true和false两个值

boolean b1 = true;
boolean b2 = false;
boolean isGreater = 5 > 3;
int age = 12;
boolean isAdult = age >= 18;

理论上boolean占一个字节,但JVM内部会表示为四个字节整数。

引用类型

除上面的基本类型之外剩下的都是引用类型,例如最常引用的就是string字符串。

常量

定义变量时,若加上final修饰符,这个变量就成了常量,常量不可再次赋值,且常量名通常大写。

var关键字

有时候类型名字太长写起来麻烦,则可以使用var关键字。

整数运算

运算法则:遵循四则运算,另:%表示求余

溢出:整数存在范围限制,计算结果超出范围会产生溢出,但溢出不会出错,只会得到一个奇怪的结果。

n += 100 相当于 n=n+100;

n -= 100 相当于 n=n -100;

++:自增 n++ 相当于 n=n+1;

-- :自减 n-- 同上

移位运算:

左移:<< (将整数转换为二进制然后非0数依次向左移位)

右移:>> (同时但向右移且最高位始终为1)

无符号右移:>>> (向右移同时最高位补0)

位运算:

与:&& 两者都1

或:| 两者任意一个1

非:~ 0和1互换

异或:^ 两者不同则为1,否则为0

另:对两个整数进行位运算,转换成二进制并按位对齐,然后依次对每一位进行运算

运算优先级

  • ()

  • ! ~ ++ --

  • * / %

  • + -

  • << >> >>>

  • &

  • |

  • += -= *= /=

类型自动提升:

在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。

强制类型转换: (类型)

但是超出范围的强制类型转换会得到错误的结果(高位字节可能会被丢掉)。

浮点数运算

和整数一样,但不能作位运算和移位运算。

由于浮点数无法在计算机中精确表示,计算时会产生误差,所以两个浮点数相比较常常采用绝对值之差是否小于一个很小的数

另:Java的浮点数完全遵循IEEE-754标准

类型提升:如果参与运算的两个数其中一个是整型,则整型可以自动提升到浮点型;但整型计算结果出现了 浮点数最后结果却依然显示整型。

溢出:整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:

  • NaN表示Not a Number

  • Infinity表示无穷大

  • -Infinity表示负无穷大

double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity

强制类型转换:浮点数可以强制类型转换为整型,但小数部分会被丢掉;若转型后超出整型的最大范围,将返回整型最大值。

布尔运算

布尔运算只有true和false两个值

关系运算

  • 比较运算符:>>=<<===!=

  • 与运算 &&

  • 或运算 ||

  • 非运算 !

示例:

boolean isGreater = 5 > 3; // true
int age = 12;
boolean isZero = age == 0; // false
boolean isNonZero = !isZero; // true
boolean isAdult = age >= 18; // false
boolean isTeenager = age >6 && age <18; // true

优先级:(高到低)

  • !

  • >>=<<=

  • ==!=

  • &&

  • ||

短路运算:若布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。

三元运算符:b ? x : y (x y类型必须相同)

b为1则计算x,b为0则计算y

字符类型

字符类型

一个char保存一个Unicode字符,故一个英文字符和一个中文字符都可以用char类型表示,占两个字节。

另:将char类型字符赋值给int类型,可以显示该字符的Unicode编码,还可以用、u+Unicode编码来表示一个字符。

字符串类型

字符串类型string是引用类型。

其余用法和c语言一样,不多说。

字符串连接:可以使用+连接字符串和其他类型数据(其他数据类型会先转换成字符串类型)。

如:string s = “I”+"LOVE"+"YOU";

另:字符串可以使用

"""
​
...//具体字符串
​
"""

表示多行字符串

字符串还有不可变特性。

数组类型

1.数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false

2.数组一旦创建后,大小就不可改变。

3.数组也是引用类型,具有不可变特性

4.字符串数组即数组每个元素都是字符串。

5.基本与c言一样,不多说。

具体循环结构

输入输出

输出:一般使用System.out.println()向屏幕输出。(其他与c相同)

输入:

创建Scanner对象并传入System.in,System.in代表标准输入流(System.out代表标准输出流)。

有了Scanner对象后,要读取用户输入的字符串,使用scanner.nextLine(),要读取用户输入的整数,使用scanner.nextInt()Scanner会自动转换数据类型,也不必手动转换。

if

用法同c

switch

用法也基本同c,但多了一个option

public class Main {
    public static void main(String[] args) {
        int option = 99;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
            break;
        case 2:
            System.out.println("Selected 2");
            break;
        case 3:
            System.out.println("Selected 3");
            break;
        default:
            System.out.println("Not selected");
            break;
        }
    }
}

其中option的值代表着下面的case后面的1 2 3,若option的值不是case后面的任意一个,则执行default;

另:swich还可以匹配字符串,将option换成字符串即可。

swich新语法:

->:

public class Main {
    public static void main(String[] args) {
        String fruit = "apple";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> 0;
        }; // 注意赋值语句要以;结束
        System.out.println("opt = " + opt);
    }
}

用法更简洁。

yield:可以表示switch语句的返回值。

while

和c相同,没啥好说的。

另:

while先判断再执行循环。

do-while先执行再判断,即最少执行一次。

for

同c,多了个for each循环。

for each:for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

例:

int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i 
  

但除了数组外,for each循环可以遍历所有“可迭代”的数据类型,包括ListMap等。

break和continue

都同c

break:跳出当前循环,整个循环都不执行了。

continue:提前结束本次循环,直接继续执行下次循环。

数组操作

遍历数组

顾名思义,依次访问数组的元素。

一般用for或for each。

数组排序

常用的排序:冒泡排序、插入排序、快速排序。

多维数组

二维数组:数组的元素还是数组(数组元素的长度可以不同)。

打印二维数组可以使用Arrays.deepToString()函数。

三维数组:数组的元素是二维数组。

高维数组用的少,二维数组用的多。

命令行参数

Java的程序入口的main方法,而main方法可以接受一个命令行参数,他是一个String[]数组。

你可能感兴趣的:(java,经验分享,其他)