Java 常用api及其底层实现一String

Java API是JDK所提供的使用类,这些类将底层的代码给封装起来了。Object类是java语言中的根类,它所描述的所有方法子类都可以使用,所有类在创建对象的时候,最终找的父类就是Object。。在Objec类中,最常见的就是euqals方法和toString方法。equals方法用于比较两个对象是否相同,实质是比较两个对象的内存地址。在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型。在调用对象的属性时,一定要进行类型转换,转换之前一定要进行类型判断。toString方法返回该对象的字符串表示。其实该字符串内容就是对象的类型[email protected]+内存地址值。

原文链接:https://blog.****.net/hellomy_future/article/details/81783453

String类

String类是Java核心类,在Java.lang包下,从String的源码可以看出:
1)String类是用final进行修饰的,他是不能被继承的,
2)String类实现了Serializable(序列化)、CharSequence(字符序列)、 Comparable(比较)接口。
3)String实例的值是通过字符数组来进行存储的,而且有final修饰,所以是不可修改的,因此String类一旦实例后就不能改变

重要方法:
1)+号连接字符串
原理:内部会创建一个StringBuilder()对象,并调用append()方法将数据拼接,最后调用toString()方法返回拼接好的字符串。
与此之外还有一种特殊情况,也就是当"+"两端均为编译期确定的字符串常量时,编译器会进行相应的优化,直接将两个字符串常量拼接好,例如’‘I’’+’‘am’'会直接拼接为Iam,而那中引用的不会,所有会慢一点。

如果在大量循环拼接字符串时,建议直接引用StringBuffer,然后使用append()方法来拼接,会提升效率。

字符串常量池
在Java的内存分配中,大致为class常量池,运行时常量池,字符串常量池。
JVM在使用字符串时,做了一个优化,使用字符串常量池,如果要实例一个String,他会先去字符串常量池中进行查找,如果找到了,直接返回这个实例引用,如果没有,他会在字符串中创建这个实例,因为String类是无法修改的,因此字符串常量池中不会存在两个一样的实例。
在HotSpotVm中,字符串常量池是通过StringTable类来实现的,他是一个Hash表,默认值长度为1009。

Java 常用api及其底层实现一String
因为字符串常量池中不存在两个相同的实例,因此s1==s2,但是new一定会产生新的对象,而且这个对象存在堆中,因此new产生了两个对象,存在栈中的s3和存在堆中的String对象AB
Java 常用api及其底层实现一String
当执行String s1 = “AB”时,JVM会去常量池中查找这个是否存在“AB”实例,如果不存在,会创建,如果存在,则会直接返回这个实例对象的引用地址。

intern()方法
intern方法可以避免new String()使用时新建一个对象,他和“AB”一样会去字符串常量池中进行查找,如果没有就新建一个,因此可以节省很大内存。
https://www.cnblogs.com/feizhai/p/10196955.html

StringBuffer与StringBuilder
主要区别:
1)String是不可变的,StringBuffer与StringBuilder都是可变的
2)运行速度:StringBuilder>StringBuffer>String
3) StringBuilder不是线程安全的,而StringBuffer是

Java 常用api及其底层实现一String