hashcode和equals约定关系如下
- 如果两个对象相等,那么他们一定有相同的哈希值
- 如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等,
加载驱动的方法
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
Java中的char
java中的char是Unicode编码,Unicode编码占两个字节,就是16位,足够存储一个汉字。
Properties实现了Map接口,是线程安全的
Java关键字
true、false、null都不是关键字。
goto、const 是保留的关键字。
abstract continue for new
switch default if package
synchronized do goto private
this break double implements
protected throw byte else
import public throws case
enum instanceof return transient
catch extends int short
try char final interface
static void class finally
long strictfp volatile const
float native super while
boolean assert
变量的引用
常量池:未经 new 的常量
堆区:成员变量的引用,new 出来的变量
栈区:局部变量的引用
成员变量的引用在堆区,是因为成员变量的所属对象在堆区,所以它也在堆区。
局部变量的引用在栈区,是因为局部变量不属于某一个对象,在被调用时才被加载,所以在栈区。
String,StringBuffer,StringBuilder的区别
可变与不可变
String 类中使用字符数组保存字符串,如下就是,因为有final修饰符,所以可以知道String对象是不可变的。String为不可变对象,一旦被创建,就不能修改它的值,对于已经存在可的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value
StringBuffer是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,它只能通过构造函数来建立。如:StringBuffer sb = new StringBuffer();不能通过赋值符号对他进行赋值。对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.sb.append(“hello”);
线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是 线程安全的 。看如下源码:
public synchronized StringBuffer reverse() {
super.reverse();
return this ;
}
public int indexOf(String str) {
return indexOf(str, 0);//存在 public synchronized int indexOf(String str, int fromIndex) 方法
}
StringBuilder并没有对方法进行加同步锁,所以是 非线程安全的 。
StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder( 抽象类 )。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
效率
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
效率比较String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”时,String效率最高