一.创建String对象的两种方式.
1.字符串底层维护的是char[]数组,直接存放在堆中。
例如:char[] value={'a','b','c'};
String s1=new String(value);
2.底层也会new String(),但是存放在堆中的常量池中,效率高。
String s2 ="abc";
注意:如果是第一次使用字符串,java会在堆中的常量池创建对象。再次使用调用此对象时,会直接访问堆中常量池中的对象。
=========================================================================
二,==与equals()的比较。
1.一般情况下,==比较的是两个对象的地址值,Object类中equals()默认比较的也是地址值,
但String类重写了equals()方法,不再比较地址值,而是两个串的具体内容。
======================================================================
三,String中常用的API方法。
1.charAt-----------获取指定下标处的字符。
2.concat-----------用于拼接字符串。
3.endsWith--------判断是否以指定元素结尾。
4.startsWith--------判断是否以指定元素开头。
5.indexof------------获取指定元素首次出现的下标值。
6.lastIndexof-------获取指定元素最后一次出现的下标值。
7.length-------------获取指定字符串的长度。
8.toUpperCase()-------把指定字符串转为全大写
9.toLowerCase()-------把指定字符串转为全小写
10.trim-----------去除指定字符串首尾空格
11.split---------------分割字符串。
(注意:打印的是地址值,需要用Arrays.toString 才得到的是一个String 类型数组。)
12.substring 根据指定下标截取子串,
(如果只有一个下标,那就从指定位置处开始截取,包含指定位置)
13.valueOf-----------类型转换。
例如:String.valueOf(10)表示将数字10转化为字符串类型的10。
====================================================================
四,String相关小题问答:
1.String是不可变的吗?-----------------是的。
2.String类是否可以被继承?--------------不可以被继承。
3.String str="i"与 String str=new String(“i”)一样吗?--------不一样,因为内存的分配方式不一样。
String str="i"方式是将其分配到堆中的常量池中,而String str=new String(“i”) 则被分到堆内存中。
4.数组有没有 length()方法?String 有没有 length()方法?
数组没有 length()方法 ,但是有 length 的属性。
String 有 length()方法。
====================================================================
5.String和StringBuffer、StringBuilder的相同点和不同点是什么?
相同点:三者都是用字符数组保存字符串。
不同点:1.String底层用final进行了修饰,所以String对象不可变;StringBuilder和StringBuffer
没有用final修饰,所以对象可变。
2.StringBuilder和StringBuffer都继承自AbstractStringBuilder类。
3.String是线程安全,StringBuffer对方法加了同步锁,所以是线程安全的。
StringBuilder并没有加同步锁,所以是非线程安全的。
=====================================================================