java基础知识总结1

  1. Java 基本数据类型
    Java中总共有八种基本的数据类型:byte(1)、short(2)、int(4)、long(8)、char(2)、float(4)、double(8)和boolean【PS:括号内的为所占的字节数】,每种基本类型都有其对应的包装类。
    1.1 自动类型转换
    自动类型转换 :低级变量可以直接转换为高级变量,转换规则为:
    byte→short(char)→int→long→float→double
    例如,下面的语句可以编译通过:
    byte b;
    int i=b;
    long l=b;
    float f=b;
    double d=b;
    但是将double型变量赋值给float变量,不加强转的话会报错。
    1.2 自动装箱和自动拆箱
    简单的说,装箱就是就是将基本数据类型转换为包装器类型;拆箱就是将包装器类型转换为基本数据类型。
    例如:
    Integer i = 10; //装箱
    int n = i; //拆箱
    注意事项:
    1 对于Integer而言,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。例如:
    public class Main {
    public static void main(String[] args) {
    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 200;
    Integer i4 = 200;
    System.out.println(i1i2);
    System.out.println(i3
    i4);
    }
    }
    输出的结果就为:
    true
    false
    2 Integer i = new Integer(xxx)和Integer i =xxx;这两种方式的区别。
    1.第一种方式不会触发自动装箱的过程;而第二种方式会触发;
    2.在执行效率和资源占用上的区别。第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况(注意这并不是绝对的)。
    3.当 ****运算符的两个操作数都是包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程);另外,对于包装器类型,equals方法并不会进行类型转换。例如:
    public class Main {
    public static void main(String[] args) {
    Integer a = 1;
    Integer b = 2;
    Integer c = 3;
    Integer d = 3;
    Integer e = 320;
    Integer f = 320;
    Long g = 3L;
    Long h = 2L;
    // 因为c、d都是包装类型,所以返回true
    System.out.println(c
    d);
    // 因为e、f都大于128,属于不同的对象,所以返回false
    System.out.println(ef);
    // 因为含有算数运算符,所以比较的数值,返回true
    System.out.println(c
    (a+b));
    // 因为equals不会类型转换,所以比较的是类型,返回true
    System.out.println(c.equals(a+b));
    // 比较数值,所以返回true
    System.out.println(g==(a+b));
    // 因为equals不会类型转换,a、b为Integer,所以返回false
    System.out.println(g.equals(a+b));
    // a向上转型为Long,所以返回true
    System.out.println(g.equals(a+h));
    }
    }
    1.3 int 和 和 Integer 有什么区别?

Integer是int的包装类;int是基本数据类型;
Integer变量必须实例化后才能使用;int变量不需要;
Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
Integer的默认值是null;int的默认值是0。
1.4 String、StringBuffer、StringBuilder的区别:
1.是否可变:
1 String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
2 StringBuffer、StringBuilder:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。

2.是否线程安全:
String:对象定义后不可变,线程安全。
StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据

3 . String不可变有什么好处?
可以缓存 hash 值
String Pool 的需要
线程安全
2. Java 修饰符
Java修饰符:用来定义类、方法或者变量,通常放在语句的最前端。可分为:
访问修饰符
非访问修饰符
2.1 访问修饰符
Java中具有四种访问权限:
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
访问权限之间的对比如下表所示:
java基础知识总结1
2.2 非访问修饰符
Java中提供的非访问修饰符有:
··static:用来修饰类、方法和变量。
·static修饰变量:类所有的实例都共享静态变量,可以直接通过 类名来访问它;
·static修饰方法:静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说它不能是抽象方法(abstract)。
· static修饰语句块:静态语句块在类初始化时运行一次。
·static修饰内部类:静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。

··final:用来修饰类、方法和变量:
·final 修饰类:不能够被继承
·final 修饰方法:不能被继承类重新定义;
·final 修饰变量:如果为基本类型,则数值不可改变,为常量;若为引用类型,则引用不能更改,但引用的对象本身的属性可更改。
· abstract:用来创建抽象类和抽象方法。
·synchronized 和 volatile:主要用于线程的编程。
注意事项:
静态成员函数中不能调用非静态成员;
非静态成员函数可以调用静态成元;
常量成员不能修改,静态成员必须初始化,但可以修改;
静态成员和静态方法可以直接通过类名进行调用,其他成员方法则需要进行实例化后调用。

2.3 Java变量
Java中的变量可分为三种类型:
成员变量
局部变量
静态变量

它们三者的区别如下图所示:java基础知识总结1