Java自学 --换车重启
约莫有10天没有更新自己的学习进度了,因为学习遇到了问题,这边首先说一下我自学的开始是跟着秦疆老师的视频进行的,在B站看的视频,秦疆老师B站的网名叫遇见狂神说,秦老师做了一个自学的网站供网友学习KungStudy,但是我个人是在B站看的,因为B站手机电脑端都有历史记录,比较适合我在公司,在家,在外随时学习观看视频,十分感谢秦老师带我入门。
我是跟着秦老师B站【狂神说Java】Java零基础学习视频通俗易懂这个视频学习的,基础篇总共有80集视频,10天前我学到了最后一集老师对Java基础的总结,总结视频总共2个小时19分钟,然而我前面学习的79集的基础,老师讲到1小时的时候就完了,剩下一小时讲的常用类、集合框架、I/O整个系列都没有,网站也没有,去群里问了一下这部分确实没有,群友推荐这部分遗漏的去看韩顺平老师更新的视频,我想可能是这部分视频没有录下来,比较遗憾,但是从老师总结视频的篇幅来看,这3个部分的内容竟然占了剩下的1个小时19分钟,也就是说Java基础中的一半,应该是非常重要的不可跳过的,于是我就去看了韩顺平老师的教程,韩老师的视频 正好是今年1月底才上传的,并且确实有包含常用类、集合框架、I/O这部分内容,于是我转去韩老师那继续自学。
然后又有个问题,我是直接接下去学习常用类、集合框架、I/O,还是从头开始看呢,我思考了一下决定重新开,原因有以下几个,我前面学的课程不是很多,断断续续也就20来天,时间不是很久,韩老师前面的视频我可以双倍速度看过去,花不了多久时间,顺便复习一下前面学习的,毕竟学的越多忘的越多,还有韩老师的视频是21年开头的,秦老师的视频是19年的,韩老师的更新一点,就这查漏补缺的心态,我决定重新跟韩老师的视频在学校一遍。
就两个老师的风格来讲,可能我是跟着秦老师开始学的,我觉得秦老师讲的更基础更适合新人刚开始看,而韩老师讲的更加全面一点,如果是新人直接0基础看不知道看不看的懂,我正好看过一遍秦老师的,再回头看还行把,相同的点我就不重复记录了,后面学习会把新学习到的点在博客里面更新出来。
这10天也不是光找新课程,找了2天就确定了,目前韩顺平老师的看到101集了,有些新的知识点,随手记录在笔记本里,手头的纸张上,比较少,就没有天天发,今天大周周六没上班,在家统计一下发一下,写博客这个事情我觉得还是很有必要的,回头一看10天没记录了,就会怀疑自己有没有认真在学习。
转义字符
\t :一个制表位,实现对齐的功能
\n :换行符
\\ :一个 \
\" :一个 "
\’ :一个 ’
\r :一个回车
javac文档注释
javac -d 文件夹名 -xx -yy ****.java
DOS
相对路径:从当前目录开始定位,形成的一个路径
绝对路径:从顶级目录C盘D盘之类的开始定位,形成的路径
Shift + TAB
快速把代码对齐
程序中+号的使用
1当左右两把都是数值,做加法
2.左右有一边为字符串,做拼接
3.运算是从左到右的
System.out.println(100+3+"Hello");//103Hello
System.out.println("Hello"+100+3);//Hello1003
中文java帮助文档 8 / 11
http://matools.com/api
char
char 类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码.
char c5 = ‘b’ + 1;//98+1==> 99
System.out.println((int)c5); //99
数据转换的两条线(要背)
char-int-long-float-double
byte-short-int-long-float-double
(byte,short)和char 直接不会自动转换
编码的由来
- ASCII码 最早 1个字节 128个编码
- unicode 每一个英文字母和汉字都占用2字节 最多65536字符(兼容ASCII码)
- utf-8字母1字符 汉字3字节(最广泛,可能是中国内把,unicode的改进)
- gbk 字母1字符 汉字2字节(标示的范围小,相对的汉字也就少了,所以平时多用utf-8)
- gb2312 汉字
- big5 繁体
多种类型的数据,混合运算
多种类型的数据混合运算时,系统自动将所有数据转换成容量最大的那种数据类型再运算
byte、short、char可以互相运算,运算时先转为int类型
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 +b2; //这是错的
byte、short、char三个只要出现运算直接转int
字符串–数字 转换
//基本数据类型->String
int n1 = 100;
float f1 = 1.1F;
double d1 = 4.5;
boolean b1 = true;
String s1 = n1 + "";
String s2 = f1 + "";
String s3 = d1 + "";
String s4 = b1 + "";
System.out.println(s1 + " " + s2 + " "+ s3 + " " + s4);
int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
boolean b = Boolean.parseBoolean("true");
short num6 = Short.parseShort(s5);
String str = “123”;
int n1 =Integer.parse(str); //字符串转数字
String str = “Hello”;
int n1 =Integer.parse(str); //异常,数字才能转
除法
System.out.println(10 / 4); // 运算的两个数都是整数,结果保留整数 ,结果2
System.out.println(10.0 / 4); //有一个小数,结果2.5
double d = 10 / 4; // 2.0
取余
本质 a%b = a - (int)a / b * b (这个a/b好像是整数运算的意思,留整数,正负数就看这个)
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1
System.out.println(-10.5%3); // -1.5 有小数参加取余,余数竟然可以是小数,有意思
自增(a++,++a)
这是老师提供的公示,秦老师虽然也有说过,不过这次有了一点自己的想法了理解,a++ ,++a,我是这么想的,直接从左到右去看 ,什么东西在前面就先执行什么 a++ ,那就是先执行a ,赋值或者运算都行,然后再去++
int a = 1;
a = a++;
System.out.println(a); //1
// temp = a ; a = a + 1; a =temp;
int a = 1;
a = ++a;
System.out.println(a); //2
// a = a + 1; temp = a ; a =temp;
复合赋值运算符会进行强制类型转换
byte b = 3;
b += 2;// 可运行,等价于 b = (byte)(b + 2);
b = b + 2 ; //报错,2是int类型,运算完已经提升为int 不能由byte的b表示了
b += 2.2;//去IDEA跑了一下, 这个可运行,结果等于4
短路和逻辑
&&短路与
&逻辑与
都是两个为真才为真,区别是&&只要第一个是假的就不判断了,老师说开发中都用短路与,比较高效
“||”短路或 第一个为真第二个就不判断了,效率高,“|”逻辑或同逻辑与
三元运算符
x?y:z;
x真执行y,x假执行z
口诀[一真假二]
进制转换
- 2、8、16进制转10进制,低到高,右到左,几进制就乘几,的位数-1次方
- 10进制转2、8、16进制,几进制就除以几,一直除下去,最后余数反着写
- 2进制转8进制(3个数一组,按照2转10的方法算数),2进制转16(4个数一组同上)
- 8进制转2进制(把8进制的每一个数转为3位数的二进制,因为8进制没有8,8对应的2进制是1111,所以3个数的二进制就能表示0-7的所有8进制数)
- 16进制转2进制(同上,16进制对应的4个数二进制)
原码、反码、补码(背)
- 二进制的最高位是符号位:0表示正数,1表示负数(老韩口诀,0→ 0 1→ -)
- 正数的原码、反码、补码都一样(三码合一)
- 负数的反码:原码符号位不变,其他位取反(1变0,0变1)
- 负数补码 = 负数反码 + 1 负数反码=负数补码 - 1
- 0的反码,补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果的时候,要看他的原码 (重点)
自己总结的运算规则
原码转成反码,反码再转成补码,通过补码来与运算,运算完再转回去原码
位运算符练习
- 按位与 & : 两位都为1 ,结果为1 ,否则为0
- 按位或 | : 两位有1位为1,结果为1 ,否则为0
- 按位异或 ^ : 两位不一样,结果为1 ,否则为0
- 按位取反 ~ : 字面的意思,取反,1变0 ,0变1
# 练习 2 & 3
2的二进制 00000000 00000000 00000000 00000010
3的二进制 00000000 00000000 00000000 00000011
-------------------------------------------------
00000000 00000000 00000000 00000010 = 2
//都是正数,三码合一,直接按位与运算
//三码合一,补码运算结果直接是原码
# 练习 ~ -2
-2的二进制原码 10000000 00000000 00000000 00000010
转换为反码 11111111 11111111 11111111 11111101
负数反码+1=补码 11111111 11111111 11111111 11111110
--------------------------------------------------
对补码取反运算 00000000 00000000 00000000 00000001
此时运算后得到一个正数,正数三码合一是就是结果,不需要转换直接用
# 练习 ~ 2
2的二进制原码 00000000 00000000 00000000 00000010
三码合一直接运算
11111111 11111111 11111111 11111101
结果是负数的补码,要先算反码,再算原码
补码-1=反码 11111111 11111111 11111111 11111100
原码 10000000 00000000 00000000 00000011
结果为 -3
# 练习 2|3
2的二进制原码 00000000 00000000 00000000 00000010
3的二进制原码 00000000 00000000 00000000 00000011
按位或 00000000 00000000 00000000 00000011
正数三码合一 直接是结果 3
# 练习 2^3
2的二进制原码 00000000 00000000 00000000 00000010
3的二进制原码 00000000 00000000 00000000 00000011
按位异或 00000000 00000000 00000000 00000001
正数三码合一 直接是结果 1
位运算符 >>、<< 和 >>>
算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移 <<: 符号位不变,低位补 0
>>>
逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0
特别说明:没有 <<< 符号
int a=1>>2; //1 => 00000001 => 00000000 本质 1 / 2 / 2 = 0 除2 除2
int c=1<<2; //1 => 00000001 => 00000100 本质 1 * 2 * 2 = 4 乘2 乘2
System.out.println(15>>2); ///结果为3