从零开始的JAVA学习笔记(一):JAVA基本数据类型、运算和基本程序结构

一.基本数据

1.八大基本数据类型

1.1 整形

类型占用范围
byte1byte字节=8二进制位-128~127
short2byte-215~215-1(3W)
int4byte-231~231-1(21E)
long8byte(需要带L)-263~263-1

当long声明不叫L时候,会默认为int并将其赋值为long

二进制第一位为符号位,0位负数,1正数

1.2 浮点型

类型占用范围
单精度float4byte-3.403E38~3.408E38
双精度double8byte-1.798E308~1.798E308

默认位double,float后需要加f/F

1.3 字符类型

1Char=2bytechar c='A' 声明方式,可以使用转义字符

\n 换行 \t 制表(tab) \为转义

在ASCII中 A65 a97

同时支持Unicode,例如'\u0043'=='C'char必须’'中由字符,空必须为空格,否则为报错

1.4 boolean类型

只能是truefalse (C类语言中0是false 非0位true)

2. 类型转换

除boolean外的7种基本数据类型可以进行类型转换

2.1 自动类型转换

  • 范围小的类型可以自动向更大范围的类型进行转换 (指定的表示数范围大小,非内存大小)

  • 整型可以自动向浮点型转换

  • byte、short、char<int<long<float<double

  • byte、short、char进行运算,或自身运算结果均为int

2.2 强制类型转换

与自动类型转换相逆的转换,其会损失精度,自动丢失大范围的存储,导致精读损失**(仅截取后面符合内存的位)**

  • 小范围类型的最大范围+1转换后为小范围最小(二进制溢出)
  • float声明必须f,否则为double强转报错
  • 单独的数字(常量),默认均为int或double

3. String字符串(不可变引用)

  • String由一组(可空)的char组成,声明使用""
  • 可以和8中基本数据类型做连接运行(+)
  • 连接运算结果均为String
  • String右边的所有+均为连接左边按照原有含有运算
  • 存储在方法区常量池中

4. 常用进制

进制表示声明
二进制(binary)0\1 满2进10b或0B开头
十进制(decimal)0-9 满10进1直接写数
八进制(octal)0-7 满7进10开头
十六进制(hex)0-9 A-F 满15进10x开头

5. 二进制原码、补码、反码

内容含义案例
十进制1414
14二进制(1byte)8位,第一位位符号位,0位正数1为负数00 00 11 10
-14二进制(1byte)-1410 00 11 10
-14原码二进制本身10 00 11 10
-14反码除了符号位全部取反(0->1,1->0)11 11 00 01
-14补码在反码的基础上加1**(反码+1)**11 11 00 10
  • 计算机底层以补码的形式存储数据
  • 补码、反码仅用于负数,正数存储的是原码
  • 基本数据类型是直接存储在栈空间中

二、基础运算

1. 算术运算符

运算运算符案例结果
正号+A+11
负号-A-1-1
A+B1+23
A-B1-2-1
A*B2*36
A/B4/22
取模A%B3%21
前自加(先自加后运算)++Aa=1;b=++aa=2;b=2
后自加(先运算后自加)A++a=1;b=a++a=2;b=1
前自减(先自减后运算)–Aa=2;b=–aa=1;b=1
后自减(先运算后自减)A–a=2;b=a–a=1;b=2
连接“A”+B“2”+5“25”

整型除法结果位整型,需要强转,若加()需要先在()中转型

++a和a++

  1. ++a 先执行 a=a+1,再执行其他;

    例如 a=1, b=0 b=++a;则b=2,a=2

  2. a++先执行其他,再执行a=a+1;

    例如 a=1, b=0 b=a++;则b=1,a=2

    自加\减法 不会改变原有类型

2. 赋值运算符

运算运算符案例结果
赋值=int A=2020
+赋值+=A+=1030
-赋值-=A-=1020
*赋值*=A*=10200
/赋值/=A/=1020
%赋值%=A%=100

基本数据类型赋值是直接将值赋值给另一个,引用数据类型地址赋值

运算赋值不会改变原有类型

short a=10;
a=a+2;  // 错误  2为int
a+=2; // 通过 不会改变原有类型

3. 比较运算符

运算运算符案例结果
相等==4==3false
不等于!=4!=3true
大于>5>6false
小于<5<6true
大于等于>=5>=6false
小于等于<=5<=6true
是否是类/子类对象instanceof“” instanceof Stringtrue

4. 逻辑运算符

逻辑运算符对boolean运算时是逻辑运算

运算运算符含义结果
逻辑与A&BAB均为true为truetrue&true=true
逻辑或A|BA或B有一个为true为truetrue|flase=true
逻辑非!AA为false为true!fasle=true
短路与A&&B同与,若A为false则不再判断Btrue&&true=true
短路或A||B同或,若A为true则不再判断Btrue||false=true
逻辑异或A^BAB不相同时为truetrue^true=false

5. 三元运算符

(boolean表达式F)?A:B ,若F为true则执行A,否则执行B

  • 三元运算符可以和if-else相互转换
  • 三元运算符冒号两边若是基本类型要一致,否则会自动类型转换

6. 位运算符

位运算符对数字运算时是位运算,否则为逻辑运算

位运算时间复杂度最低,位常量1

运算运算符含义结果
左移A<<B将A的二进制位向左移动B位,在A右边补B个0后取bit位内的数,相当于A*(2^B)2>>2=2*4=8
右移A>>B将A的二进制位向右移动B位,在A左边补B个0/1后取bit位内的数,相当于A/(2^B),最高位为0就补0否则补19<<3=9/8=1
无符号右移A>>>B将A的二进制位)向右移动B位,在A左边补B个0后取bit位内的数21<<27=负数;21<<<27=正数
按位与A&B对二进制位进行运算,运算时1=true 0=false,逐位取&6&3=2
按位或A|B对二进制位进行运算,运算时1=true 0=false,逐位取|6|3=7
异或A^B对二进制位进行运算,运算时1=true 0=false,逐位取^6^3=5
取反~A包括符号位之内,0->1,1->06=-1;-1=6

6.1 &按位与

二进制位都为1取1,否则取0

0101&1100=0100;

6.2 |按位或

二进制位有1则取1,否则取0

0101 | 1100=1101;

6.3 ^异或

二进制位相同为0,不同为1

0101 ^ 1100=1001;

6.4 ~取反

(加一取-)

-3=2;2=-3;

6.5 <<左移

二进制位整体向左行动N位,多余部分舍弃;

0011<<2=1100; 1011<<2=1100;

6.6 >>右移

二进制位整体向右移动N位,空缺部分正数填0,负数填1;

1100>>2=0011;

其中>>>是不带符号移动,都填0

7. 交互变量运算

7.1 临时变量法

引入第三方临时变量,用内存空间来交互

int a=10,b=20;
int t=a;
a=b;
b=t;

7.2 相加相减法

利用数值空间交互,节省内存空间,若数值过大有溢出风险,且只能用于数值

int a=10,b=20;
a=a+b;
b=a-b;
a=a-b;

7.3 位运算法

两个数异或以后会变为一个数K,K异或其中任意一个会变为另一个(01交互)

int a=10,b=20;
a=a^b;
b=a^b;
a=a^b;

三、程序结构

1. 分支机构

switch都可以用if-else替代,反之不可,但switch执行效率更高

1.1 if-else

if(BA){
    
}else {
    
}

if(BB){
    
}

if(BC){
    
}else if(BC2){
    
}else{
    
}

1.2 Switch-case-default

switch(X){
    case A:FA;
    case B:FB;break;
    case C:FC;break;
    default:FD;break;
}

其中X只能为如下六种数据类型:

  • byteshortint
  • charString(JDK7)
  • 枚举enum(JDK5)

Switch只是判断X和case后的ABCD是否相等(前提是类型相同,因此不能使用条件表达式,只能使用常量),同时default可以在任意位置,不一定在最后

2. 循环结构

循环结构四要素

  • ①初始条件
  • ②循环条件
  • ③迭代条件
  • ④循环体

其中只有②循环条件是必须的

2.1 for

for(;;){;
}

①->②true->④->③->②true->④->③->②true->…

①->②false->break;

2.2 while

;
while(){;;
}

①->②true->④->③->②true->④->③->②true->…

①->②false->break;

for和while可以相互转换,执行顺序完全等价,区别为for中的①只在for内生效

2.3 do-while

①;
do{;
    ③;
}while()

①->④->③->②true->④->③->②true->…

①->④->③->②false->break;

do-while至少会执行一次循环

3. 嵌套循环

一般情况下嵌套循环不会超过三层,此时时间复杂度已经变成o立方

4. 跳出结构

breakcontinue后不可以有其他语句,默认跳出最近的包裹循环

4.1 break

结束当前循环,直接跳出当前的循环

4.2 continue

结束当前循环,仅跳过当前的这一次循环体

4.3 标签跳出

在循环结构前加上自定义标签,在跳出关键字前加上相应的标签,可以跳出指定循环,如下使用标签求质数。

public class Label{
	public static void main(String... args){
		int count=0;
		out: for(int i=2;i<=100000;i++){
			for(int j=2;j<=Math.sqrt(i);j++){
				if(i%j==0)
					continue out;
				count++;
			}
		}
		System.out.println("sum="+count);
	}
}

四、引用/对象类型

1. 数组

声明方式声明
声明X[] x;
动态初始化(声明并初始化)X[] x=new X[n]
静态初始化(声明并赋值)X[] x=new X[]{A,B,C,D}
X[] x={A,B,C,D}
  1. 数组一经初始化,大小就无法改变,若需改变只能重新声明
  2. 数组是内存中的一段连续空间(1的原因)
  3. 脚标从X[0]开始,X[n-1]结束
  4. 打印输出Char[]数组时,会自动组合成一个String输出,其他会输出地址。

1.1 数组默认初始化值

  • 整型默认为0(byte、short、int、long)
  • 浮点型默认为0.0(float、double)
  • Char默认为ASCII为0(char a=0;非’0’,显示为’ '但非空格)
  • boolaen为false(二进制0)
  • 引用类型(对象)默认为null

1.2 数组内存分析

内存分析

1.3 多维数组

多维数组就是在数组的每一个元素也是数组

声明方式声明
声明X[][]
动态初始化(声明并初始化)X[][] x=new X[n][]
X[][] x=new X[n][m]
静态初始化(声明并赋值)X[][] x=new X[][]{{A,B,C},{D,E},{F}}
X[][] x={{A,B,C},{D,E},{F}}

1.4 数组常用方法

N. 数组复制

使用new进行复制

X[] x=new X[old.length];
for(int i=0;i<old.length;i++){
	 x[i]=old[i];
}

使用取反进行交互

 for(int i=0;i<old.length/2;i++){
           X temp=old[i]; 
     old[i]=old[old.length-1-i];
     old[old.length-1-i]=temp;
        }
1.equals 比较相等

Arrays.equals(X[],Y[])长度和内容包括顺序完全一样

底层其规则为先比较长度,再逐个比较

2. toString 逐个输出

Arrays.toString(X[])将数组逐个输出,并加上[]

3.fill 填充

Arrays.fill(X[],N)将数组全部填充为指定的N

4.sort排序

Arrays.sort(X[]) 对X进行排序,将调用Comparator接口

底层为快速排序DualPivotQuicksort

5.binarySearch查找

Arrays.binarySearch(X[],K)在数组X中查找K的位置,不存在返回负数。

底层为二分查找

6.arraycopy 复制

​ 在System.arraycopy包下

参数为(源,源起始下标,目标,目标起始下标,长度)

2. 类

参见第二篇:面向对象

3. 接口

参见第二篇:面向对象

五、Main方法

1、main()是程序的入口

2、main()也是一个普通的静态方法,没有返回值

3、该方法作为入口时,是JVM虚拟机调用,因此必须是public

4、main()方法也可以使用参数与程序进行交互,可以使用参数对其进行赋值

1. Main 交互

java (主类名) 运行**(注意没有.class后缀名)**

在主类名后空格可以加入多个参数(可省""),将赋值给main()方法

java MainDome "2" "22" "dome"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值