你好陌生人,请不要试图越过权限文章,谢谢!

20220815-0829-技术学习-java-01

Java8种基础类型

整型包括: int、short、long、byte

  其中[int] 占位 4个字节,一个字节 = 8位,则在java虚拟机中共占用32位,则取值范围为 -2的31次方~2的31次方 - 1。

  short占位2个字节,取值范围为 ±2的15次方;long占8个字节,取值范围:±2的63次方。正数范围内需-1

  短整型short与byte适用于底层文件处理,或存储很宝贵的大数组使用。

浮点型包括:float、double

  浮点型[float]占用4个字节,32位的占用中可细分为:1bit的符号位、指数位8bit,剩余的尾数位为:23bit。最高为 1负0正。特别注意是的,当 1/0时表示无穷大,0/1时表示NaN。这需要在计算数值时候做出适当判断,以免产生NaN等。

  双精度(Double)占用字节为8,它比float数值精准度为2倍。所以一般情况下,选择double类型作为小数运算。

字符类型:char

  在java中,char可表示成 ‘A’编码值为65的字符常量,而”A”则表示成一个字符串。在过往的时间里,出现过许多编码形式,如:ISO8859-1、ASCII等编码形式,而如今常用的则为UniCode,如utf8等。

布尔类型: boolean

  java中数值的1与0不能表达真假状态,如:

1
2
3
4

if (x == 0) {

}

  此语句下若x=0,可正常进入,java不会把x最终的结果0看做成布尔类型。

大数

  大数是用于复杂类型的计算,相比较于数值的进行,不论是整型、双精度都有一个精度范围,而在某一些的场景下需要运行大数,如1225245343233356666664330000000084865834828345863这里的数值。本身的数值超出了所有类型的范围,则就需要把数值转化成字符型。

  字符型的优势在于,不论你的数值有多大,其实际表达的意思为占用空间的大小,所以理论上大数是没有限制的。在java中提供了两种常用的大数计算类:BigDecimal、BigInteger。

  BigDecimal:此类可以提供相对应的不同的浮点数运算。常用的方法有:add、subtract、multiply、divide(除)。divide有两种方式入参,其方法表示形式为:

1
2
BigDecimal divide(Bigdecimal other);
BigDecimal divide(Bigdecimal other,RoundingMode mode);

  其RoundingMode中的RoundingMode.HALF_UP方法可以自动进行进位,其BigDecimal提供的setScale()方法提供对大数的保留小数位数,入参数方式

1
2
BigDecimal bigNumber = new BigDecimal("100000.3453453453")
bigNumber.setScale(2,ROUNDING_HALF_UP)

静态变量(static)与final

  final修饰符主要用于表示修饰一个变量不可改变,如: name变量被修饰 final name = “jianfreespace”后。则该初始化后续不可被重新赋值。

  static静态字段用于修饰在成员方式或者变量上,若修饰在成员变量中,则在一个类中,作为一个静态变量存在,不论任意对象进行实例化,所有类的实例会共享同一个静态字段。静态字段是属于类,不属于任意对象。

  一般情况下,静态变量使用的不多,因为会造成混乱与不变,但静态常量确常常出现,用于 public static final进行修饰。

instanceof

  instanceof用于判断是否元素或对象属于这个类型或是其父类。在类型转化时可以使用其判断

1
2
3
if (object instanceof object) {
//若真进入
}

equals

  equals方式用于比较值或对象,值得注意的是,若两个对象 A与B,若A.equals(B)为真,则相对应的hashcode一定相等,若重写了equals方法则必须重写hashcode方法,因为若不重写hashcode方法,其默认取Object中对象存储地址得出散列码。

  概念:两个相等的对象一定有相同的hashcode。

toString

  toString方法默认由Object方法。返回一个对象值的字符串。一般来说,自定义子类时需要重写toString方法可以更直观的表现数据的呈现形式与方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class People
{
String name;
int age;
People(String name,int age)
{
this.name = name;
this.age = age;
}

@Override
public String toString() {
return getClass().getName()
+ "[name=" + name
+ ",age=" + age
+"]";
}
}

自动装箱与自动拆箱

  自动装箱=>将基础类型转化为包装类型。会默认自行转化,如存入数组为Integer时,你写入list.add(3)等同于=>list.add(Integer.valueOf(3));

  自动拆箱=>将包装类型转化成基础类型。会默认自行转化,获取数组的值时,int item = list.get(i) => int item = list.get(i).intValue();

1
2
3
ArrayList<Integer> list = new ArrayList<>;
list.add(3); // => list.add(Integer.valueOf(3))
int item = list.get(i); => list.get(item).intValue()

  包装类型的比较一般情况下不能使用 ==,因为 == 运算符检测的是对象是否具有相同的存储位置。不过通常下不同对象的存储地址都是不同的。若需要判断两个包装类型的值是否相同,则需要使用equals来判断。

1
2
3
4
5
6
7
public static void main(String[] args) {

Integer a = 1000;
Integer b = 1000;
System.out.println( a == b);// false
System.out.println(a.equals(b)); // true
}

枚举类

  枚举类是特殊类型,它一般用来表示一组常量,如月份、星期、四季等。枚举类的基本用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

package com.jianfreespace;

/**
*
* @author jianfreespace
*/
public enum Size {

SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL");

private String abbreviation;

Size(String abbreviation) {
this.abbreviation = abbreviation;
}

public String getAbbreviation() {
return abbreviation;
}
public static void main(String[] args) {

for (Size size : Size.values()) {
System.out.println(size);
}
}
}
/**结果:
SMALL
MEDIUM
LARGE
EXTRA_LARGE
*/


Java反射类

  java反射虽然在业务场景下使用较少,但在框架与开发基础性工具上常常用到。反射可以用来:在运行时分析类的能力、在运行时检查对象等。Class类保存基本类的一些信息,比如例子中,People.class是类取class,people.class取类对象,其本质的结果class都是一样的。

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
People people = new People("Jianfreespace",23);
System.out.println(People.class);
Class cl = people.getClass();
System.out.println(cl);
}
/**
结果:
class com.jianfreespace.StartMain$People
class com.jianfreespace.StartMain$People
*/

  反射类中还可以使用Class.forName()用来获取一个类对象。并可以构建初始化对象。如:

1
People p = (People)Class.forName(Perple.class)