Java基础知识

基本数据类型

java中基本数据类型有八种。

字符串
char(两个字节)

布尔型
boolean(一个字节)

数值型

  • 整形:byte(一个字节),short(二个字节),int(四个字节),long(八个字节)
  • 浮点型:float(单精度、四个字节),double(双精度、八个字节)

整形取值范围

  • byte:范围为-128到127,在变量初始化的时候,byte类型的默认值为0。
  • short:范围为-32,768到32,767,在变量初始化的时候,short类型的默认值为0。
  • int:范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。
  • long:范围为-9,223,372,036,854,775,808到9,223,372,036, 854,775,807 ,在变量初始化的时候,long类型的默认值为0L或0l,一般情况以0L为书写标准。

自动拆装箱

其实所谓的自动装箱和自动拆箱,就是把基本数据类型转为包装类型、包装类自动转为基本数据类型的过程。
包装类位于java.lang包,包装类和基本数据类型的对应关系如下表所示:

基本数据类型

包装类

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double

例子:

public static void main(String[]args){
        Integer integer = 10; //装箱
        int i = integer; //拆箱
    }

自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。

自动拆装箱带来的问题

  • 在进行数据比较的时候,不能只使用==进行数据的比对,在-128到127范围内可行,超过这个范围就需要使用equals进行比较。
  • 在自动拆箱的时候,如果包装类为null,会发生NPE异常。

String(字符串)

  • 字符串定义:String s = “adc”;
  • 字符型连接:s = s.concat(“ef”);
  • 字符串的截取:substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容
  • 字符串替换:
    (1):replace(CharSequence target, CharSequence replacement) ,用replacement替换所有的target,两个参数都是字符串。
    (2):replaceAll(String regex, String replacement) ,用replacement替换所有的regex匹配项,regex很明显是个正则表达式,replacement是字符串。
    (3):replaceFirst(String regex, String replacement) ,基本和replaceAll相同,区别是只替换第一个匹配项。

字符串的拼接方式

  • 使用+拼接字符串
String start= "Hello";
String end= "World";
String splice = start+ "," + end;
  • spring的concat方法
String start= "Hello";
String end= "World";
String splice = start.concat(",").concat(end);
  • StringBuffer和StringBuilder
StringBuffer start= new StringBuffer("Hello");
String end= "World";
StringBuffer splice = wechat.append(",").append(end);

StringBuilder start= new StringBuilder("Hello");
String end = "World";
StringBuilder splice = start.append(",").append(end);

性能对比

(1)StringBuilder < StringBuffer < concat < +
(2)如果不是在循环体中进行字符串拼接的话,直接使用+就好了。
(3)如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder

字符串池

  • 在JVM中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池。
  • 当代码中出现双引号形式(字面量)创建字符串对象时,JVM 会先对这个字符串进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回;否则,创建新的字符串对象,然后将这个引用放入字符串常量池,并返回该引用。这种机制,就是字符串驻留或池化。
  • 在JDK 7以前的版本中,字符串常量池是放在永久代中的。在JDK 8中,彻底移除了永久代,使用元空间替代了永久代,于是字符串常量池再次从堆内存移动到永久代中。
  • 字符串有长度限制,在编译期,要求字符串常量池中的常量不能超过65535,并且在javac执行过程中控制了最大值为65534。在运行期,长度不能超过Int的范围,否则会抛异常。

Java中各种关键字

transient

变量修饰符,当被transient修饰的成员变量,在进行序列化的时候,会忽略此成员变量,在反序列化的时候,被修饰的成员变量会设置一个默认值,例如:int为0,对象为null。

instanceof

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,instanceof 运算符只能用作对象的判断。

boolean result = obj instanceof Class

obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。

final

final可以修饰变量、方法、类,修饰变量表示变量不可以被修改,修饰方法表示方法不可以被重写,修饰类的时候表示类不能被继承。
例子:

//修饰变量
class Test{
     final String name = "Hello";
}
//修改方法
class Parent {
    final void name() {
        System.out.println("Hello");
    }
}
//修饰类
final class Parent {
}

static

static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。

  • 静态变量:一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。
private static int count;
public static String str;
  • 静态方法:与静态变量一样,静态方法是属于类而不是实例。一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。
public static void setCount(int count) {
}
  • 静态代码块
    (1)Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。
    (2)静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。
    (3)Java不允许在静态块中使用非静态变量。静态块只在类装载入内存时,执行一次。

synchronized

synchronized的用法

synchronized是Java提供的一个并发控制的关键字。主要有两种用法,分别是同步方法和同步代码块。也就是说,synchronized既可以修饰方法也可以修饰代码块。synchronized可以保证原子性、有序性和可见性。

public class SynchronizedDemo {
     //同步方法
    public synchronized void doSth(){
        System.out.println("Hello World");
    }

    //同步代码块
    public void doSth1(){
        synchronized (SynchronizedDemo.class){
            System.out.println("Hello World");
        }
    }
}

被synchronized修饰的代码块及方法,在同一时间,只能被单个线程访问。

volatile

volatile的用法

  • volatile是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。
  • 只需要在声明一个可能被多线程同时访问的变量时,使用volatile修饰就可以了。
  • volatile保证有序性和可见性。
public class Singleton {  
//通过关键字去修饰
    private volatile static Singleton singleton;  
    private Singleton (){}  
}

原文地址: http://hollischuang.gitee.io/tobetopjavaer/#/menu