日期:2017-10-02
今天10月2日,昨天去千灯古镇游玩了一天,今天打算复习一下String类
地点:上海市杨浦区政本路东方家园
闲话少说,让我们开启探索String类之旅吧!!!
1.1.0、String类的两种对象实例化方式
String之所以特殊,原因在于:两种不同的对象实例化方式。
方式一:直接赋值字符串的形式为String类对象实例化
方式二:采用String类的构造方法为String类的对象实例化,String类的构造方法为:
public String(String str)
实例:
1.1.1.字符串的比较
若有两个int型变量,如果想知道二者是否相等,应该使用“==”进行验证。
那么换成String该如何?
==的确是完成了相等的判断,,但是最终判断的是两个对象(现在的对象是字符串)是否相等,属于数值判断---------判断的是两个对象的内存地址数值,并没有判断内容,要想完成字符串内容的判断,则必须使用String类操作方法
public boolean equals(String str)
使用equals()方法比较的不再是内存地址的数值,比较两个字符串的内容。
常见面试题:
请解释String类中的“==”和equals()的区别
“==”比较的是两个字符串的内存地址是否相同,属于数值比较
equals比较的是两个字符串的内容,属于内容比较。
1.1.2.字符串与字符串常量的判断
开发中可能遇到的问题:字符串常量调用equals方法,可以避免空指针异常。
1.1.3.String类的两种实例化方式的区别
1.分析直接赋值的情况:
开辟了一块栈内存,一块堆内存
关于直接赋值操作中字符串都相同的原因:
在String类进行设计时采用一种称为:共享设计模式的概念,在每一个运行的JVM底层存在一个字符串的对象池(Object Pool),如果用户采用了直接赋值的的方式,会将字符串的内容放入池中,以供其他继续使用直接赋值方式的String对象使用,如果新声明的字符串不在池中,则会开辟一个新的,继续放到池中,以供下次使用。
共享设计模式:好比在家中准备的工具箱一样,如果有一天需要用到螺丝刀,发现家里没有,那么肯定要去买一把新的,使用完之后不可能丢掉,会将其放到工具箱以备下次继续使用,而这个工具箱中的工具肯定可以为家庭中的每个成员服务。
2.分析构造方法赋值的情况:
代码样例:
原因:每一个字符串都是一个String类的匿名对象,首先会在堆内存中开辟一块空间保存字符串“Hello”,而后又使用关键字new ,开辟了另一个堆内存空间,不过真正使用的是用关键字new 开辟的堆内存,而之前定义的字符串常量的堆内存空间将不会有任何的栈内存指向,其中有一块将成为垃圾。另外,使用构造方法实例化的String类对象内容不会保存在字符串对象池之中,即不能够进行共享数据操作。
观察入池问题:
使用构造方法实例化的String对象不会入池,所以使用构造方法实例化的String对象只能自己使用,
手工入池:
但在String类中为了方便操作提供了一种称为手工入池的方法:
public String intern();
这个方法表示:将开辟的字符串对象那个保存在对象池中,不需要从新开辟新的对象了。
面试题1:请解释String类的两种对象实例化方式的区别
直接赋值:只开辟一块堆内存空间,字符串的内容可以自动入池,以供下次使用
构造方法:开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,需要使用intern()方法手动入池
开发:使用直接赋值的方式
面试题2:代码String str=new String("Hello");创建了几个String类的实例化?
创建了两个实例化对象,一个是String类的匿名对象“Hello”,另一个是使用关键字new实例化的String的类对象。
1.1.4.字符串的内容一旦声明则不可改变
内存分析图:
java Doc文档:
String类常用的方法(重点):实际开发中String类使用广泛,讲过的方法尽可能背下来(方法的名称、返回值类型、参数的类型及个数、方法的作用)
之前介绍的2个方法:equals() intern()
String类和字符之间的转换:
例子1.字符串和字符数组转换,完成一个小写字符串变为大写字符串的操作,小写字母与大写字母差了32。
判断一个字符串是否由数字组成?
实现方法传入字符串,返回字符串中出现的次数为n的单词,如果多个单词出现次数为n,拼接成一个字符串用空格分隔。已知元字符串仅以空格分隔。
例如传入参数:"good good study day day up" 和2
返回:"good day"
1.1.4.字符串与字节:
public String (byte[] bytes) 构造 说明:将全部的字节数组变为字符串
public String(byte[] bytes,int offset,int length) 构造 将部分的字节数组变为字符串
public byte[] getBytes() 普通 将字符串变为字节数组
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
普通 字符串转码操作
技术穿越:一般情况下在程序中如果想要操作字节数组只有两种情况
情况一:需要进行编码的转换时
情况二:数据要进行传输IO操作或者网络编程要使用到
1.1.4.字符串的比较
public boolean equals(String anObject) 普通 区分大小写的相等比较
public boolean equalsIgnoreCase(String anotherString) 普通 不区分大小写,比较是否相等。
public int CompareTo(String anotherString) 普通 比较两个字符串的大小
例子略
注意:读者要注意CompareTo()方法返回的类型int
实现输入一个字符串:打印图形