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