底层string

来源:互联网 发布:网络音乐盛典歌曲 编辑:程序博客网 时间:2024/06/16 12:17
常量池

Java代码被编译成class文件时,会生成一个常量池(Constant pool)的数据结构,用以保存字面常量和符号引用(类名、方法名、接口名和字段名等)

通过命令 javap -verbose 查看class文件中 Constant pool 实现(看字节码)

常量池的内存分配 在 JDK6、7、8中有不同的实现:
1、JDK6及之前版本中,常量池的内存在永久代PermGen进行分配,所以常量池会受到PermGen内存大小的限制。
2、JDK7中,常量池的内存在Java堆上进行分配,意味着常量池不受固定大小的限制了。
3、JDK8中,虚拟机团队移除了永久代PermGen

常量池的内存分配6及之前在永久代PermGen,受PermGen内存大小的限制;7在堆上分配,大小不受限;8移除了永久代PermGen

字符串初始化 “javap -c” 命令查看字节码指令实现

字符串可以通过两种方式进行初始化:字面常量和String对象。字面常量初始化变量直接指向常量池里的字符串,表达式 “ja” + “va” 在编译期间会把结果值”java”直接赋值给变量。

通过new string()对象,使用char数组存储字符串构造对象,char数组指向常量池里的字符串,所以用==比较两种初始化方式,结果为false(地址不同)
String c = a + b  字符串变量的连接动作,在编译阶段会被转化成StringBuilder的append操作,变量c最终指向Java堆上新建String对象

final修饰的变量发生连接动作时,虚拟机会进行优化,将表达式结果直接赋值给目标变量

http://www.importnew.com/21711.html

string类中两个成员变量,final修饰的value[]数组,int hash(缓存string对象的哈希值)

StringBuffer成员变量value数组没有被final修饰

StringBuffer 的构造函数默认创建的大小为16个字符,尽量指定大小这样会减少扩容的次数,也就是会减少创建字符数组对象的次数和数据复制的次数

string stringBuffer两个类都是final修饰,不能被继承

http://blog.csdn.net/qh_java/article/details/46382265

http://www.cnblogs.com/dolphin0520/p/3778589.html

超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等

所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址

http://www.cnblogs.com/chenssy/p/3416195.html

public boolean equals(Object obj) {
    return (this == obj);
    }

public native int hashCode();对象的哈希码值

本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置

对于一个对象而言,其hashCode过程就是一个简单的Hash算法的实现

ArrayList是List接口的可变数组的实现

private transient Object[] elementData;

ArrayList提供了三种方式的构造器,可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection的元素的列表

存储:set(),add(),addAll();

向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现

数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的.调用ensureCapacity方法来手动增加ArrayList实例的容量

读取:get();删除:remove()
原创粉丝点击