java语法基础

java语法基础

注释

注释规约:
1)类、字段、方法必须使用文档注释,不能使用单行注释和多行注释。
2)所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
3)所有的类都必须添加创建者和创建日期。
4)所有的枚举类型字段必须要有注释,说明每个数据项的用途。
5)代码修改的同时,注释也要进行相应的修改。

静态类型的编程语言

必须得先指定变量的类型和名称
基本数据类型: boolean、char、byte、short、int、long、float 和 double
引用数据类型: 除了基本数据类型以外的类型,都引用类型。数组、类、接口。
为什么数组也是引用类型?

  • 基本数据类型:变量名指向具体的数值;基本数据类型存储在栈上。

  • 引用数据类型:变量名指向的是存储对象的内存地址,在栈上。内存地址指向的对象存储在堆上。

eg.list接口:

List<String> list = new ArrayList<>();
System.out.println(list);

对于接口类型的引用变量来说,只能 new 一个实现它的类的对象。

变量:局部变量,成员变量和静态变量会有默认值。java中使用局部变量前必须初始化,否则编译器不允许你使用它。

boolean默认值false;byte :0;int :0;
引用数据类型的默认值为 null,包括数组和接口。

包装器类型

Java 中的一种特殊类型,用于将基本数据类型(如 int、float、char 等)转换为对应的对象类型。
eg.

  • Byte(byte)
  • Integer(int)
    基本类型和包装类型的区别
    包装类型可以为 null,而基本类型不可以;
    包装类型可用于泛型,而基本类型不可以;
    基本类型比包装类型更高效;
    两个包装类型的值可以相同,但用“==”比较却不相等。
包装类缓存范围总结
  • 全部缓存: Boolean,Byte
  • 0-127缓存:Character
  • -128 – 127缓存:Short, Long, Integer
  • -没有缓存:Float, Double
Java中==和equals()的区别
  • == :基本数据类型,则比较数值是否相等;引用数据类型,则比较的是对象的内存地址是否相等。
  • equals():一般用来比较两个对象的内容是否相等。
    equals
    equals()方法存在于Object类
public boolean equals(Object obj) {
     return (this == obj);
}

类没有覆盖 equals()方法时,通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
一般我们都覆盖 equals()方法来比较两个对象中的属性是否相等;

程序运行时,数据存储的位置

  • 寄存器
  • 栈:存放在栈中的数据大小与生存周期必须在编译时是确定
  • 堆:可以动态分配内存大小,编译器不必知道要从堆里分配多少存储空间,生存周期也不必事先告诉编译器,Java 的垃圾收集器会自动收走不再使用的数据,因此可以得到更大的灵活性。但是,运行时动态分配内存和销毁对象都需要占用时间,所以效率比栈低一些。new 创建的对象都会存储在这块区域。
  • 磁盘:像文件、数据库,就是通过持久化的方式,让对象存放在磁盘上。当需要的时候,再反序列化成程序可以识别的对象。

自动装箱(Autoboxing)和自动拆箱(Unboxing)机制

自动装箱:基本类型转为包装类型
自动拆箱:包装类型转为基本类型

Java 1.5 为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。

Integer chenmo  = 10;  // 自动装箱
int wanger = chenmo;     // 自动拆箱

反编译:

Integer chenmo = Integer.valueOf(10);
int wanger = chenmo.intValue();

面试题:

// 1)基本类型和包装类型
int a = 100;
Integer b = 100;
System.out.println(a == b);

// 2)两个包装类型
Integer c = 100;
Integer d = 100;
System.out.println(c == d);

// 3)
c = 200;
d = 200;
System.out.println(c == d);

java数据类型转换

自动类型转换
byte -> short -> int -> long -> float -> double
char -> int -> long -> float -> double

强制类型转换
将较大的数据类型转换为较小的数据类型
将浮点数转换为整数
将字符类型转换为数值类型

强制类型转换可能会导致数据丢失或精度降低

IntegerCache

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert Integer.IntegerCache.high >= 127;
    }

    private IntegerCache() {}
}

静态代码块中,low 为 -128,也就是缓存池的最小值;high 默认为 127,也就是缓存池的最大值,共计 256 个。可以在 JVM 启动的时候,通过 -XX:AutoBoxCacheMax=NNN 来设置缓存池的大小。
assert 是 Java 中的一个关键字,寓意是断言,为了方便调试程序
在命令行运行 Java 程序的时候加上 -ea 参数打开断言。
运算符
当浮点数除以 0 的时候,结果为 Infinity 或者 NaN;
整数除以 0 的时候(10 / 0),会抛出异常。

位运算符

eg.按位右移

System.out.println(10>>2);//10/2^2=10/4=2
System.out.println(20>>2);//20/2^2=20/4=5
System.out.println(20>>3);//20/2^3=20/8=2
int a = 60, b = 13;
System.out.println("a 的二进制:" + Integer.toBinaryString(a)); // 111100
System.out.println("b 的二进制:" + Integer.toBinaryString(b)); // 1101

int c = a & b;
System.out.println("a & b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a | b;
System.out.println("a | b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a ^ b;
System.out.println("a ^ b:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = ~a;
System.out.println("~a:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a << 2;
System.out.println("a << 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a >> 2;
System.out.println("a >> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

c = a >>> 2;
System.out.println("a >>> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));

构造方法

  • 名字和类名相同
  • 没有返回值,不能用void声明构造函数
  • 生成类的对象时自动执行,无需调用
  • 构造方法不能被override(重写)

hashCode()

hashCode() 的作用是获取哈希码,也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。

  • 为什么要有 hashCode?
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashCode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashCode 值作比较,如果没有相符的 hashCode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashCode 值的对象,这时会调用 equals() 方法来检查 hashCode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
------
著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接:https://javaguide.cn/java/basis/java-basic-questions-02.html

为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?
哈希碰撞

基础面试题

  • a = a + b 与 a += b 的区别: += 隐式的将加操作的结果类型强制转换为持有结果的类型。
  • 抽象类可以没有抽象方法。抽象类不一定有抽象方法;但是包含一个抽象方法的类一定是抽象类。

你可能感兴趣的:(java学习笔记,java)