final class String (只有使用权,没有修改权)
1、实例化方式 直接赋值 String str = "Hello world"; 构造方法赋值 String str = new String ("new world");
2、*****字符串的相等比较***** "=="操作符用于比较两个变量的值是否相等,对于基本类型而言,比较的就是数值大小;对于 引用类型而言,比较的实际上是保存的地址是否相等而不会比较内容。 所以在字符串内容比较时,需要使用String类提供的equals( )方法,
区分大小写。 str.equals (str2);
equalsIngoreCase( )不区分大小写比较。
面试题:请解释String类 == 与 equals 的区别
1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
2. “equals()”:可以进行字符串内容的比较
3.String类的匿名对象(没起名字的时候) 所有字符串常量 " ",都是String类的匿名对象 在比较字符串是否等于特定字符串时,将字符串常量写在equals前,通过字符串常量来比 较"Hello world".equals(str);
4.两种实例化区别?
直接赋值与构造赋值
String str1 = "hello" ;
String str2 = "hello" ;
String str3 = "hello" ;
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // true
System.out.println(str2 == str3); // true
在JVM内部会维护一个字符串常量池(对象数组)。若采用直接赋值的方式进行String类的实 例化操作,那么对象赋值的方式实例化String对象,先在对象池中寻找是否有指定内容对象, 若有,直接引用。否则创建空间,将新对象入池以供下次使用。
构造方法:
String str = new String("hello") ;
当使用构造方法实例化字符串时,实际上会开辟两次空间。 实例化后的对象并不会保存在对象池中,可以使用intern( )方法来手工入池
String str = new String("hello").intern( ) ;
5.字符串常量不可变更:堆中常量的值无法修改,但是栈中的指向可以修改 字符串不要改变太多次,慎用"+"
6.char<-->String char[]-->String(char[] value)
将字符数组全部转为字符串
public String(char[] value,int offset,int len): 将字符数组的部分内容转为字符串
String-->char public char charAt(int index):取得字符串指定索引的字符,从0开始
String-->char[] public char[] toCharArray():将字符串转为字符数组
7.byte<-->String 字节用在二进制流与网络传输中
byte-->String public String(byte[] value);将字节数组全部转为字符串
public String(byte[] value,int offest,int len):将字节数组的部分内容转为字符 串
String-->byte[] public byte[] getBytes():将字符串转为字节数组
public byte[] getBytes(String charSet):将字符串按照指定的编码格式转为字节数组 Linux默认编码为UTF-8,windows磨人默认编码为GBK. 编码:将字符串按照怎样的算法转为字节
8.字符串比较方法
比较相等 equals equalsIngoreCase
比较大小 public int compareTo(String anotherString):
比较两个字符串的大小关系
负数:小于
正数:大于
0:相等
按照ASCII码比较,只要发现不相等的内容算出差值直接返回,不会继续向下查找
9.字符串查找方法 (课件1,6,7,8) contains indexOf : int startsWith endsWith
10.字符串替换
public String replaceAll(String regex,String replacement):
替换首个内容
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_")
11.*****字符串拆分*****
public String[] split(String regex):按照指定格式将字符串全部拆分
public String[] split(String regex,int limit):将字符串部分拆分,数组长度为 限定limit长度
String str = "hello world hello bit" ; String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
12.*****字符串截取*****
public String substring(int beginIndex):从指定索引开始截取字符串结尾
public String substring(int beginIndex,int endIndex):从指定索引开始到指定
结束位置
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
13.其他方法
trim():去掉字符串的左右两边空格,中间保留
toUpperCase():将字符串转大写处理
toLowerCase():将字符串转小写处理
length():将字符串转小写处理
isEmpty():判断空字符串对象,不能判断空对象
14.两SB:
为了方便进行字符串内容的修改
StringBuffer()
字符串拼接使用append()方法
String<-->StringBuffer:
a.通过StringBUffer的构造方法 public StringBuffer(String str)
b.通过append(String str):
StringBuffer
StringBuilder-->String:
调用StringBuffer的toString()
独有方法:
字符串反转:reverse()
删除指定位置字符串:delete(int start,int end)
在指定位置插入任意元素:insert(int offset,各种数据类型 b)
StringBuilder
面试题:
请解释String,StringBuffer与StringBuilder的区别
① String常量内容不可修改,而StringBuffer与StringBuilder的内容可以修改。
② StringBuffer 使用同步处理,线程安全,性能较低;StringBuilder使用异步处理,线 程不安全,性能较高。在普通场景下,推荐使用StringBuilder。当String对象使用"+"进 行字符串拼接时,javac编译器会将String对象变为StringBuilder而后调用append()来修 饰字符串内容,减少无用空间的开辟。
*****Object类*****
Object类是所有类的父类,所有类默认继承Object类
toString():取得对象信息
System.out.println()系统输出对象时,默认会调用该对象的toString()
若自定义类需要进行内容的输出,需要覆写toString()
equals():比较两个对象内容
Object类提供的equals默认比较两个对象的地址是否相同
Object类可以接受所有引用类型,包括数组、类和接口
Object类是参数的最高统一类型
包装类--将基本类型封装到类中
数值型包装类(Number的子类):Byte、Short、Integer(int)、Long、Float、Double
对象类(Object的子类):Boolean、Character(char)
装箱与拆箱
装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法实现装箱处理
拆箱:将包装类中包装的数据数据类型取出,利用包装类提供的xxValue()方法 Integer提供的intValue(); 自动拆装箱机制(JDK 1.5)
Integer integer = 10;(装箱)
System.out.println(integer+10); (拆箱)
使用包装类与使用基本类型在用法上基本一致
用基本类型还是包装类?
① [强制]所有POJO(简单java类,类中只有属性与getter/setter,构造方法)类使用包装类
② 局部变量推荐使用基本类型
包装类进行数值比较使用equals方法 对于Integer var = ?直接赋值在-128~127区间内的赋值,Integer对象在缓存池产生,会 复用已有对象。在这个区间外的所有数据均在堆上产生,并且不会复用已有对象。