Java核心技术Ⅰ——心得(1)

时间:2021-09-09 22:09:58

之前学的android,现在由Javase来深入java,这里只提到一些混淆的,容易犯错、忘记,不常见又很重要的一些知识点。
1.Java中定义类的规则很宽松。名字必须以字母开头,后门可以跟字母和数字的任意组合,长度上没有限制,但不能使用Java保留字。

标准的命名规范为:类名是以大写字母开头的名词,如果名字由多个单词组成,每个单词的第一个字母都应该大写,用大写字母的方式称为骆驼命名法。

2.源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。

3.java中的main方法必须是静态的。

4.在java中,一共有8种基本类型,其中4种整型(byte,short,int,long),2种浮点型(float,double),1种用于表示Unicode编码的字符单元的字符类型char和1种表示真值的boolean。

5.在Java中,整型的范围与运行Java的代码的机器无关,因此移植性很好在不同的平台上,相反,c和c++需要针对不同的处理器选择最高效的整型,这样就很有可能造成在32位处理器上运行很好的程序在16位系统上运行却发生整数溢出。

6.十六进制数值有一个前缀0x或0X(0xCAFE),八进制有一个前缀0,,010对应八进制的8,很显然,八进制表示容易混淆,建议最好不要使用八进制常熟。

7.从Java7开始,加上前缀0b或者0B就可以写二进制数,如(0b1001就是9)同样也是Java7之后,可以为数字字面量加下划线,如用1_000_000表示一百万,下划线未来让人易读,Java编译器会去除下划线。

8.Java没有任何无符号(unsigned)形式的整型。

9.double表示的数值精度是float类型的两倍(有人称为双精度数值),绝大部分程序使用double,很多情况下float满足不了需求。

10.用于表示溢出和出错情况的三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字)
一个正整数除以0的结果为正无穷大,计算0/0或者负数的平方根结果为 NaN。

11.浮点数值不适合用于无法接受舍入误差的金融计算中。什么个意思呢?system.out.println(2.0-1.9)打印结果并不是0.1,而是0.8999999,(no picture you say a Jb ),原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确表示1/10,也就是0.1,,这就好比十进制无法表示3/10一样,是我们习惯十进制而已,2.0-1.8结果就是0.2了,如果在数值计算中不允许有任何舍入误差就应该使用BigDecimal类,之后会有提到。

12.char类型表示单个字符。不过,现在情况有所变化,如今有些Unicode字符一个char满足不了,需要两个char。
(这里解释下原因:1991年发布了Unicode1.0,当时仅占用不到65535代码值的一半,所以设计Java时就决定采用16位的Unicode编码,然而,经过一段时间,增加了大量汉语、日语、和韩语的表意文字,Unicode超过了65535,16位的char已经满足不了需求。)
‘A’是编码值位65所对应的字符常量。它与“A”不同,“A”是包含一个字符A的字符串

13.强烈建议程序中不要使用char,最好将字符串作为抽象数据类型处理。

14.整型值和布尔类型不能相互转化。

15.在C++中,数值甚至指针可以代替boolean。值0相当于false,1为true,Java中不是这样,下面这句话:
if(x=0)
在C++中这个测试可以编译运行,其结果总是false,而在java中,这个测试不能通过编译,原因x=0不能转化boolean。

16.变量名对大小写敏感,如hireday和hireDay是两个不同变量名,许多程序员将变量名命名为类型名如 Box box;
还有程序员喜欢在前面加a,如Box aBox;

17.在Java中变量的声明尽可能地靠近变量第一次使用的地方,是一种良好的编程风格,Java中不区分变量的声明与定义。

18.final关键字表示这个变量只能被赋值一次,一旦被赋值之后就不能更改了,习惯上,常量名使用全大写,可以使用static final设置一个类常量被一个类的多个方法使用。

19.整数被0除会产生异常,浮点数被0除将会得到无穷大或者NaN。

20.强制类型转化是社区小数点部分,并不是舍入,如果想对浮点型进行舍入运算,需要Math.round(),Math.round(4.5)结果为5,Math.round(4.4)结果为4,当调用round时候,仍然需要强转,round返回的类型是long类型。

21.如果运算符得到一个值,其类型与左侧操作数类型不同,就会发生强制类型转换。如一个int x,
x+=3.5;是合法的,将把x设置为(int)(x+3.5),结果为4
x=x+3.5;会报错,提示你进行强转。

22.如果n是一个整数变量,而且用二进制表示的n从右边数第4位位1,用位运算符则:
int x=(n&0b1000)/0b1000;会返回1,否则返回0。

23.枚举类型:enum Size {SMALL,LARGE,EXTRA_LARGE}:Size s=Size.LARGE;

24.如果需要把多个字符串放在一起,用一个定界符分割,可以使用静态join方法:
String all=String.join(“/”,“S”,“M”,“L”,“XL”);结果为:“S/M/L/XL”

25.要检测两个字符串是否相等,不区分大小写,可以使用equalsIgnoreCase方法。“Hello”.equalsIgnoreCase(“hello”)

26.要检查一个字符串既不为空串也不是null,if(str!=null&&str.length()!=0)

27.StringBuffer和StringBuilder,执行速度方面:StringBuilder>Buffer
Builder是非线程安全的,Buffer是线程安全的。 单线程下建议用Builder,多线程下用Buffer。一般用builder。其中
setCharAt来修改某个单元。

28.Scanner方法实现输入操作,Scanner in=new Scanner(System.in);
String name=in.nextline();String firstName=in.next();int n=in.nextInt();
其中,使用nextline方法是因为输入行中有可能包含空格,要想读取一个单纯(以空格作为分隔符),要用next();

29.在循环中,检测两个浮点数是否相等需要格外小心,
for(double x=0;x!=10;x+=0.1 )…可能永远不会结束,由于舍入的误差,因为0.1无法精确地用二进制表示,x将从9.99999到10.09999998.

30.如果基本的整数和浮点数精度不能满足要求,可以使用BigInteger和BigDecimal两个类处理任意长度的数字序列整数和浮点数的数值。
使用静态的valueOf方法可以将普通数值转化为大数值:BigInteger a=BigInteger.valueOf(100);
遗憾的是不能使用算数运算符,只能使用类中的add和multiply方法。BigInteger c=a.add(b);//c=a+b;

31.在java中,允许将一个数组变量拷贝给另一个数组变量,这时,两个变量引用同一个数组。
int[] a=b;
a[5]=12;这时b[5]也等于12
如果希望将一个数组的所有值拷贝到另一个数组,使用copyof方法、第一个参数是要拷贝的数组,第二个是新数组的大小,如果没占满,将多余的元素呗赋值为0;布尔则是false。

32.要想对数值型数组排序,可以使用arrays.sort方法,使用的是快速排序。

33.要想快速打印一个二维数组的数据元素列表,可以使用Arrays.deepToString();方法

34.面向对象中要认识到,一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。

35.如果将域定义为static,每个类中只有一个这样的域,即使没有该类的对象,静态属性static修饰的属性也是存在的,它属于类,不属于对象。

36.如果在编写一个类时没有编写构造器,那么系统会默认提供一个无参构造器,将所有的实例设置为默认值,0,false,对象都是null。如果类中提供了至少一个构造器,但是没有提供无参构造器,则在构造对象时会视为不合法。

37.如果构造器的第一个语句如this(),这个构造器将调用同一个类的另一个构造器(相当于另一个重载的构造器)。

38.在覆盖一个方法时候,子类方法不能低于超类方法的可见性,如果超类是public,子类必须也是public。

39.为了提高程序的清晰度,包含一个或者多个抽象方法的类本身必须被声明是抽象的。除了抽象方法外,抽象类还可以包含具体数据和具体方法。类即使不含抽象方法,也可以声明为抽象类。抽象类不可以被实例化,但可以创建一个具体的子类(如person是抽象类,可以创建具体的studengt类)

40.在Java中,只有基本类型不是对象,例如数值、字符和布尔类型都不是对象,不管是对象数组还是基本类型的数组都是集成object类。

41.关于字符串的散列码(hashcode),hashCode是由对象导出的,如果不是对象(基本类型)是不会有hashCode的。
String s=”Ok”;
StringBuilder sb=new StringBuilder(s);
System.out.println(s.hashCode()+sb.hashCode());//s的散列码2556,sb是20526976
String t=new Striing(“Ok”);
StringBuilder tb=new StringBuilder(t);
System.out.println(t.hashCode()+tb.hashCode());//t的散列码2556,sb是20527144
s和t拥有相同的散列码,是因为字符串的散列码是由内容导出的,而字符串缓冲的sb和tb却不一样,是因为在StringBuilder类中没有定义hashCode方法,它的散列码是有object类的默认hashCode导出的对象存储地址。

42.数组列表的容量和数组的大小有一个非常重要的区别。
数组列表:new ArrayList<>(100) 是有保存100个元素的能力。size=0
数组:new Employee[100] 是分配100个元素的存储空间,有100个固定空位置可以使用,size=100。
一旦数组列表的大小不再发生变化,就可以调用trimToSize方法将存储区域的大小调整为当前元素所需的存储空间数目,垃圾回收器将回收多余的存储空间。