字符型常量和字符串常量的区别
1.形式上:字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
2.含义上:字符常量相当于一个整型值(ASCII值)可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
3.占内存大小:字符常量只占一个字节 字符串常量占若干个字节(至少一个字符结束标志)
什么是字符串常量池?
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串是JVM会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。
String有哪些特性
不变性:String是只读字符串,是一个典型的immutable对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。
常量池优化:String对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
final:使用final来定义String类,表示String类不能被继承,提高系统的安全性。
String为什么是不可变的吗?
简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下
/** The value is used for character storage.*/ private final char value[];
是否可以继承String类
String类是final类,不可以被继承。
String str = “i” 与 String str = new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str = “i”的方式,Java虚拟机会将其分配到常量池中;而String str = new String(“i”) 则会被分到堆内存中。
数组有没有length()方法?String有没有length()方法
数组没有length()方法,有length的属性,String有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
String类的常用方法有哪些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的byte类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
在使用HashMap的时候,用String做key有什么好处?
HashMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashCode被缓存下来,不需要再次计算,所以相比于其他对象更快。