public final class String—>被final进行修饰,不可进行改变,最终类
String类的概述:最终类
java中所有的字符串常量都是String类的对象
String类底层是根据不可改变字符数组来实现数据存储的,String对象的内容是无法改变的(常量)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200817093340267.png#pic_center)private final(源码)表示的是最终的字符数组,不可以被改变的字符数组,且外界不能被访问的数组。
- StringBUilder和StringBuffer不产生新的未使用的对象
当参与运算的都是常量那么在编译期间就会进行优化,直接计算结果再进行赋值
String s4="a"+"b";//创建两个 常量池 2
byte b=128-1;---->直接进行右边的优化计算,在进行赋值给b,没有进行报错
常量池的出现就是为了节省内存空间,提高计算机的查询速度。
二进制字节码文件的加载(class文件):
首先获取这个类的二进制字节流,将这个字节流中的数据存储到**方法区中**,然后生成一个代表该类的 java.lang.Class 对象(HotSpot 是把 Class 对象放在方法区中),用来访问方法区这些数据。JVM在堆中产生一个class对象
方法区中有两个常量池:静态常量池,运行时常量池(jdk-1.7)
静态常量池:存储静态信息,静态资源的,随着类的加载而进行加载。现给定的是默认值,初始化在进行赋值操作,所以静态不能使用非静态
运行时常量池:存储基本类型的常量,字符串常量,存储在方法区中,引用类型的常量等各种不能改变的数据在程序中。
总共创建几个对象? 5个对象
String str=“a”; //1 方法区中
str+=“b”;//str=new StringBuilder(“a”).append(“b”).toString();//4----->源码中toString方法返回了一个新对象
1(堆) 1(方法区) “ab” (方法区) 1(堆)
字符串常量对象有:a b ab tostring()返回对象,newStringBuilder()
区别:
StringBuilder与StringBuffer,String:
jdk1.0开始String类作品皆使用的是StringBuffer,安全可靠,倒是拼接效率低下
jdk1.5开始String类做拼接使用的是StringBuilder,不安全,但是拼接效率较高
String 长度大小不可变
String进行字符串的拼接的时候,产生的是新的对象,只是将新对象的引用赋值和原对象的引用
StringBuffer 和 StringBuilder 长度可变
StringBuffer 线程安全 StringBuilder 线程不安全
StringBuilder 速度快
StringBuilder的底层是初始容量是 16
重要方法:
1. charAt():根据指定的下标值返回字符串对象对应的字符---底层通过访问字符数组进行返回数组的值
2. length():根据字符串的长度,返回字符串的字符个数---底层通过访问字符数组的长度length,返回length的值
3. toCharArray():将字符串转换成字符数组,进行数组的迁移
4. String 的构造方法有很多-----API应用程序接口
5. compareTo():对两个字符串数组进行排序,排序规则根据字典进行排序求差值如果差值为0,则进行个数的比较
//如果方法返回值为正数,说明前面对象大于后面的对象
//如果方法返回值为负数,说明前面对象小于后面的对象
//如果方法返回值为0,说明前面对象和后面的对象内容一致
6. concat():底层是根据数组扩容来拼接字符串,将指定的字符串拼接到另一个字符串的末尾
7. contains();判断字符串中是否存在给定的子串,返回boolean值
8. startWith();判断字符串是否值是以规定的子串开头----文件过滤,查询
9. endWith():判断字符串是否值是以规定的子串结尾----文件过滤,查询
10. boolean equals(Object anObject) ;进行字符串的比较,比较地址值和内容是否相同
11. boolean equalsIgnoreCase(String anotherString) :忽略大小写的比较形式,----验证码
12. getBytes();把字符串对象内容转成字节数组
13. new String(Byte[],int offset,int length,CharSet character):可以字节数组的部分内容转成新的字符串对象
14. hashCod():计算的是哈希码的值(哈希算法)哈希码值的计算过程和对象的内出现的容有关系--底层源码
15. indexOf();根据指定内容返回在对象内容中的第一次下标值---多个重载方法
方法的拓展:
构造函数中:
- 不管你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。
- 一旦自定义了构造方法,不管是有参构造还是无参构造,默认构造方法就会失效
命令行参数:
- 有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
- 命令行参数是在执行程序时候紧跟在程序名字后面的信息。
可变参数:
- JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。
- 方法的可变参数的声明如下所示:typeName... parameterName(int..a)
- 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
可变参数的代码执行:
public class FinalizationDemo {
public static void main(String[] args) {
Cake c1 = new Cake(1);
Cake c2 = new Cake(2);
Cake c3 = new Cake(3);
c2 = c3 = null;
System.gc(); //调用Java垃圾收集器
}
}
class Cake extends Object {
private int id;
public Cake(int id) {
this.id = id;
System.out.println("Cake Object " + id + "is created");
}
protected void finalize() throws java.lang.Throwable {
super.finalize();
System.out.println("Cake Object " + id + "is disposed");
}
}