美文网首页
java String类

java String类

作者: 起风了dzj | 来源:发表于2017-10-04 14:22 被阅读0次

日期: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

实现输入一个字符串:打印图形

相关文章

网友评论

      本文标题:java String类

      本文链接:https://www.haomeiwen.com/subject/jpgzextx.html