Java基础学习
day01:
1、上课学习笔记
(1)java层次结构
层次一:基本语法:
变量、运算符、流程控制、数组、
层次二:面向对象 :
层次三:高级应用:
多线程、集合、IO流、网络编程、反射、NIO等
(2)万维网、互联网、因特网
java特点:跨平台、垃圾处理
jvm:java虚拟机
jdk jre jvm 的关系:
jdk = jre + 开发工具集(例如Javac编译工具等)
jre = jvm + javaSE标准类库
1、变量:在程序的执行过程中,其值可以发生改变的量叫变量。
定义变量的格式:
1、数据类型 变量名 = 初始化值;
2、数据类型 变量名;
变量名 = 初始化值;
2、数据类型:
A:基本数据类型
byte 1个字节 -27~27-1
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
char 2个字节
boolean 1个字节
B:引用数据类型(放到后面两天和下周面向对象)
自动类型转换:
byte,short,char在参与运算的时候会自动提升到int类型
由大的数据类型接收小的数据类型,会自动转换,不会报错。
强制类型转换
由小的数据类型接收大的数据类型,会报错,接收不了,这时候需要强制类型转换
格式:目标数据类型 目标变量名 = (目标数据类型)要转换的数值/变量
3、运算符:
算术运算符:+,-,*,/,%
赋值运算符:=,+=,-=,*=,/=,%=
比较运算符:==,>,<,>=,<=,!=
逻辑运算符:&,|,^,!,&&,||
位运算符:&,|,^,~,<<,>>,>>>
三目运算符:(关系表达式)?表达式1:表达式2;
位运算符 | ||
---|---|---|
运算符 | 运算 | 范例 |
<< | 左移 | 3 << 2 = 12 --> 3*2*2=12 |
>> | 右移 | 3 >> 1 = 1 --> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 反码 | ~6 = -7 |
位运算符的细节 | |
---|---|
<< | 空位补0,被移除的高位丢弃。 |
>> | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,最高位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 任何二进制位和0进行&运算,结果是0; 和1进行&运算结果是原值。 |
| | 任何二进制位和0进行 | 运算,结果是原值; 和1进行 | 运算结果是1。 |
^ | 任何相同二进制位进行 ^ 运算,结果是0; 不相同二进制位 ^ 运算结果是1。 |
面试题
(1)请用最有效率的方式写出计算2乘以8的结果
2<<4
(2)请自己实现两个整数变量的交换
1、位异或运算
int a = 1,b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
2、第三方变量
(3)^的特点
位运算是非常迅速的,因为它直接对内存中的二进制数据进行操作
(4)^的常见用法
(1) 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110
(2) 在汇编语言中经常用于将变量置零:
xor a,a
(3) 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
10100001^00000110 = 10100111
(4)使用定理三进行编码解码
由B ^ A^ A = B,我们可以假设一聊天记录是B,密钥是A。现在B ^ A之后,成了密文了。为了解密,对密文再使用密钥A进行一次异或运算即可。也即是B ^ A^ A = B。
每日代码环节
/* byte超过范围之后,需要强制转换,但是数值会改变,130——>-126*/
byte b1=3,b2=4,b=(byte) 130;
System.out.println(b);
/* 当s的类型不是整型时:s += 1(short) 与 s = s + 1(int) 的不同*/
short s=1;
s+=1;
System.out.println(getType(s));
short s=1, s+=1;
/* 逻辑运算 ^ 两边表达式都为true时,结果为false*/
int x = 3;int y =4;
x++;
y++;
System.out.println((x >= 4) ^ (y >= 5));
/* 位运算符 << 左移 >> 右移 左乘右除*/
System.out.println(-24 >>> 2);
System.out.println(24 >>> 2);
System.out.println(6 & 3);
System.out.println();
System.out.println();
System.out.println();
// System.out.println(2<<3);
/* ^位异或运算符的常见用法:1、两个变量之间的转换。2、根据A^B^B = A 的特性,可以用在密码的密钥上 */
int a = 1,b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a="+a+"b="+b);
int a = 1,b = 2,c;
c = a ^ b; //密钥
c = c ^ b; //同时异或相同的密码
System.out.println(c);
/* 三目运算符 (关系表达式)?表达式1:表达式2;*/
/*比较两个数的大小并且选择最大的数,大数运算
* 若有三个以及 三个以上的数比较
* 则继续使用三目运算符*/
int x = 3,y = 4,z;
z = (x>y)?x:y;
System.out.println(z);
/* 比较两个数是否相等*/
int x = 3,y = 4;
boolean z = (x==y)?true:false;
System.out.println(z);
/*键盘录入数据*/
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
/*条件语句 if else 和 switch case*/
/*循环语句
* 1、计算水仙花数100-999之后*/
System.out.println("100-999水仙花数有:");
for(int i=100;i<999;i++){
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
if(ge * ge * ge + shi * shi * shi + bai * bai * bai == i){
System.out.print(i+" ");
}
}
/* 需求:请输出一个4行5列的星星(*)图案。*/
for(int i = 0;i<4;i++){
for(int j = 0;j<5;j++){
System.out.print("*");
}
System.out.println();
}
/*需求:请输出如下图形
*
**
***
****
*****
*/
for(int i = 0;i<5;i++){
for(int j = 0;j<=i;j++){
System.out.print("*");
}
System.out.println();
}