1.String类
1.常见的创建方式
结果如下:
我们可以看到,如果构造方法中传入byte数组,会直接转移成对应的ASCII值
2.区别(面试)
- “”方式创建的字符串,放入到字符串常量池中,而且只存储一份。
- 通过构造器new出来的对象,放在堆中,对象不相同。
上述中的s1放在常量池,s2放在堆中,二者不相等。
输出结果如下:
3.String常见面试题
第一题:
/*
这句代码中一共创建了两个对象
1.“”创建的对象放入到常量池中
2.new创建的对象放入到堆中
*/
String s1 = new String("123");
/*
下列代码中共创建了0个对象
原因是,在上行代码中,已经创建了123字符串,并放入到字符串常量池中
*/
String s2 = "123";
/*
结果显然不相同
*/
System.out.println(s1==s2);
第二题:
String s1 ="123";
String s2 ="12";
String s3 = s2 + "3";
String s4 = "12" + "3";
System.out.println(s1==s3);
System.out.println(s1==s4);
System.out.println(s3==s4);
说明:
这里的s1和s4都是由“”直接给出,所以是都是放在字符串常量池中。而s3是由s2运算而来,所以是放在堆内存中的。
因为java在编译阶段,s1和s4的值都是给定的,不会改变,java存在编译期优化机制,会将"12" + "3"直接转成"123",可以直接放入到串池中,而s3是由变量得到,编译期间无法确定变量值,所以放到堆中。
结果如下:
2.ArrayList
1.ArrayList的使用
ArrayList不同于数组,可以不指定长度,从而往里添加数据。
此时类型是泛型,可以存储任意类型数据,加对象也可以。
2.常用API
3.面向对象进阶
1.static
static静态,可以修饰成员变量和成员方法。
static修饰成员变量表示该成员变量只在内存中存储一份,可以呗共享访问、修改。
静态成员变量:
推荐使用:类名.成员变量的方法来访问
不推荐使用:对象名.成员变量
静态方法与静态成员变量相同,都推荐使用类名访问。
当类加载到方法区时,会同时开辟一份堆内存,用来存储该类的静态变量。
使用场景:
该变量(方法)以执行一个共用功能为目的,则可以申请成静态的。
2.代码块
3.单例模式
懒汉式:
public class SingleInstance {
/**
懒汉式在使用时采取创建
*/
private static SingleInstance instance;
private SingleInstance(){};
public SingleInstance getInstance(){
if (instance == null){
instance = new SingleInstance();
}
return instance;
}
}
饿汉式:
public class SingleInstance {
/**
饿汉式单例是在获取对象之前已经创建好一个,这个对象只能是一个
*/
private static SingleInstance instance = new SingleInstance();
private SingleInstance(){};
}