1.字符串对象存在哪里
以“”方式给出的字符串对象,在字符串常量池中存储。
字符串常量池和运行时常量池逻辑上属于方法区,但是实际存放在堆内存中,因此既可以说两者存放在堆中,也可以说两者存在于方法区中。
2.String的不可变性
String name = “孙”;
String name += “悟空”;
其中"孙"和"悟空"存放在字符串常量池中,不会改变,一开始name指向常量池中的"孙",后来指向堆内存中的新对象"孙悟空"。
3.String两种不同构造方式的区别
- 以" "方式给出的字符串对象,在字符串常量池中存储,并且相同内容只会存储一份
- 通过构造器new对象,每new一次就会产生一个新对象,放在堆内存中
4.String常见面试题1
String s2 = new String(“abc”);
String s1 = “abc”;
第一行代码创建了两个对象,“abc"在字符串常量区中,s2指向的在堆中;
第二行代码没有创建新的对象。
5.String常见面试题2
- 示例1
String s1 = “abc”;
String s2 = “ab”;
String s3 = s2 + “c”;
s1 == s3?
答案是false,s1在字符串常量池,s3在堆内存中。 - 示例2
String s1 = “abc”;
String s2 = “a” + “b” + “c”;
s1 == s2?
答案是true,因为Java存在编译优化机制,s2的常量运算会在编译时计算出来,“a”+“b”+“c"会直接转成"abc”。
6.String比较内容
equals();
equalsIgnoreCase(); 忽略大小写比较内容
7.String常用API
public int length()
public char charAt(int index)
public char[] toCharArray()
public String substring(int beginIndex, int endIndex) 包前不包后
public String replace(CharSequence target, CharSequence replacement)
public boolean contains(String target)
public boolean StartWith(String target)
public String[] split(String regex)
8.ArrayList添加元素
ArrayList list = new ArrayList();
相当于ArrayList list = new ArrayList<>();
没必要一定声明类型,这样可以添加任意类型元素。
且println(list)时,打印的不是list地址,而是其中的内容。
原因: 在println()时,会自动 调用toString()方法,而list的toString()方法重写过。
9.ArrayList泛型
只能存储引用类型,不支持基本数据类型
10.ArrayList常用方法
方法名称 | 说明 |
---|---|
public E get(int index) | 返回指定索引处元素 |
public int size() | 返回集合 |
public E remove(int index) | 删除指定索引处元素,返回被删除的元素 |
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E set(int index, E element) | 修改指定索引处元素,返回被修改的元素 |
remove(Object o)时,若有多个相同元素,只删除第一个
11.ArrayList遍历并删除元素
从前往后删除是错误的,需要从后往前删除。想想删除元素之后,每个元素的索引会变化的。
12.static关键字
- static修饰成员变量表示该成员变量只在内存中存储一份,可以被共享访问、修改。
13.两类成员变量(成员方法同理)
- 静态成员变量(static修饰,属于类,内存中加载一次):常表示如在线人数信息等需要被共享的信息
- 访问方式有两种:类名.静态成员变量(推荐),对象.静态成员变量(不推荐)
- 实例成员变量(无static修饰,属于对象):必须用对象.实例成员变量访问
14.static内存机制
当类加载到方法区时,会同步在堆内存中开辟一块这个类的静态变量区。且只加载这一次。静态方法随着类一起加载到方法区(可访问状态),实例方法是不可访问状态,调用的时候移入栈中。
15.工具类
里面封装了一大堆静态成员方法,直接用类名访问即可。因此工具类无需创建对象,建议将工具类的构造器私有化。
16.代码块概述
- 代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法之外。使用{}括起来的被称为代码块。
- 主要分为两类:
- 静态代码块:
- 格式:static{}
- 特点:随着类的加载而加载,并且自动触发,只执行一次
- 使用场景:在类加载的时候做一些静态数据的初始化
- 构造代码块:
- 格式:{}
- 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
- 初始化实例资源
- 静态代码块: