java笔记
JAVA的数据类型占用内存空间大小是不一样的:
上图中一个方框代表一个字节,也就是8bit。浮点型数e表示以10为底数,并且浮点数结尾需要添加字母f,double类型数据同样是e为底数,不需要增加字母后缀。
在定义常量的时候,需要加上final修饰符,变量就被定义成常量了。一般来讲,常量名通常全部大写!
另外一个技巧就是:JAVA允许用var关键字声明变量,这样可以省略变量类型,由编译器决定变量类型。
定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。
需要注意运算溢出:
public class Main {
public static void main(String[] args) {
int x = 2147483640;
int y = 15;
int sum = x + y;
System.out.println(sum); // -2147483641
}
}
运算溢出不会报错,通常很难发现,为确保计算可靠性,初学者可以在数据运算过程中选用long等数据类型,保证运算不会出错,如果在严格的内存限制场景,需要提前考虑好合适的数据类型。
移位运算在Java里分为带符号与不带符号,对于带符号的右移>>
与左移<<
一位相当于分别做乘2与除2操作(除以2取商),并且符号位不动。要特别注意这不是循环移位,左移可能造成最高位置1,此数变成负数。同样对于不带符号的移位运算>>>
,它的特点是符号位跟着动,因此对于一个负数右移会使它变成正数。还需要特别注意:对byte
和short
类型进行移位时,会首先转换成int
再进行移位。
在运算过程中,如果参与运算的两个数的类型不一致,那么计算结果类型取较大类型。例如short
和int
计算,结果总是int
。
浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。浮点数运算还存在另外一个问题:浮点数运算误差,计算机在用2进制存取浮点数时,浮点数通常无法精确表示,例如,十进制的0.1转换成2进制是一个无限循环小数;0.5却可以精确表示。浮点数与整数一起运算时,整型会自动提升到浮点型,比如:
public class Main {
public static void main(String[] args) {
int n = 5;
double d = 1.2 + 24.0 / n; // d=6.0,后面除法会把n提升成浮点数
System.out.println(d);
}
}
需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。例如:
double d = 1.2 + 24 / 5; // d=5.2
我们还可以把浮点数强制转化成整数。在转型的时候,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将返回整型的最大值,例如:
int n1 = (int) 12.3; // 12
int n2 = (int) 12.7; // 12
int n2 = (int) -12.7; // -12
int n3 = (int) (12.7 + 0.5); // 13
int n4 = (int) 1.2e20; // 2147483647
字符串使用过程中常见的转义字符:
\"
表示字符"
\\
表示字符\
\n
表示换行符\'
表示字符'
\r
表示回车符\u####
表示一个Unicode编码的字符
字符串连接是Java的另一个强大的功能,可以使用+
号连接任意字符串和其他数据类型。部分语言只能连接字符串。但是在使用java字符串时还需要特别注意字符串的不可变性考虑如下代码:
public class Main{
public static void main(String[] args){
String s = "hello";
String t = s;
s = "world";
System.out.println(t);
}
}
输出依旧是hello。
使用+
号连接任意字符串和其他数据类型的相关注意事项:
public class Main {
public static void main(String[] args) {
int r = 65;
char rchar = 65; //这是对的,rchar等于A,65对应的Unicodde编码
char rchar = r;//这么做会报错,谨记
char rchar = (char)r;//这么做是对的rchar等于A,65对应的Unicodde编码
String s = "hello" + r;
String ss = "" + r;//""属于空字符串,空字符串不等同于null
System.out.println(s); // 输出hello65
System.out.println(ss); // 输出同样是hello65
String t = ""+(char)r+(char)r;
System.out.println(t); // 输出为AA
}
}
需要特别注意:在Java中字符串是引用类型,这与int等类型不同,在使用中要尤其注意:在Java中,判断值类型的变量是否相等,可以使用==
运算符。但是,判断引用类型的变量是否相等,==
表示“引用是否相等”,或者说,是否指向同一个对象,大多数情况下我们想比较的实际是引用变量指向的对象,因而在比较时需要对字符串对象使用equals()
方法,但是当引用类型的变量指向一个空值null,它表示不存在,即该变量不指向任何对象:
String s1 = null; // s1是null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = ""; // s4指向空字符串,不是null,注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。
这种情况下s1是可以直接来比较的:
s1 != null;
Linux操作系统的创造者Linus最近出了一本自传:《JustforFun》,简体版译名为《乐者为王》。如果我来译,我就译为《一切只为乐趣》。是的,兴趣才能使你乐在其中,乐在其中你才会产生热情,热情才能使你卓越。要忠于自己的兴趣。有人问,怎样才能找到自己的兴趣,如果我有答案,我就可以开一个“ 卡内基兴趣开发中心”,成为全球首富。这种问题不会有明确答案的,你的兴趣要别人来帮你开发,咄咄怪事。你可以多方尝试,但是首先要有起码的坚持。练琴很辛苦,音阶训练枯燥无比,但如果稍加坚持,也许你得到了赞美,也就发掘了兴趣。很多人说兴趣不能当饭吃,错,兴趣可以当饭吃。出问题的不在“ 兴趣何方”, 而在 “ 能否坚持”。
在学习和工作中,兴趣爱好和努力付出的关系:因为爱所以付出,因为付出所以更爱。