String类

String 简介,java中并没有字符串这种数据类型,但是考虑到开发的需要,而是提供了一个特殊类String 类来使用。(源码中String 的保存是通过数组的形式,所以String 的长度是固定的)

String类有2种实例化方式:
1:直接赋值: String str = “zixuechengcai”;
2: 构造方法:String str = new String(“zixuechengcai”);
比较2种实例化的区别:
本质区别:
直接赋值法:
”zixuechengcai” 是字符串常量,直接在堆内存中保存(字符串对象池中),然后再通过栈内存引用堆内存。
构造方法:
首先会开辟一个堆空间,放入“zixuechengcai”这个字符串常量,然后再通过new开辟新的堆内存存入“zixuechengcai”,所以之前定义的常量就不会被任何栈引用,而成为垃圾,等待GC回收。这种方式来实例化,本质上是开辟了2块内存空间,其中一块将成为垃圾。所以不推荐使用。
另外,构造方法实例化的字符串,不会进入到字符串对象池中。可以用方法.intern()手动入池。
如: String str = new String(“hah”).intern(); 这样 new 开辟的堆内存中的字符串就会进入到对象池中。

对象池介绍:(共享设计模式)(又称为字符串常量池)
在JVM底层中存在一个对象池(String只是其中一种类型),当代码使用直接赋值的方式实例化String对象时,会将此字符串对象所使用的匿名对象存入池中,,如果后续还有其他使用直接赋值的方式,并且内容相同的话,那么将不会开辟新的堆内存空间,而是从对象池中,通过引用的方式,继续使用。
常量池分为:
静态:
范例:String stra = “abcd”;
String strb=”a”+”b”+”c”+”d”;
System.out.println(stra == strb)
结果为true
在程序编译时,会将这些参与连接的常量组合在一起进行定义,这样就与stra的内容相同,最终结果就是继续使用stra的实例化的常量池,作为引用,所以2者地址相同。

动态:
范例:String stra = “abcd”;
String B= “b”;
String strb=”a”+B+”c”+”d”;
System.out.println(stra == strb)
结果为false
由于B变量在运行时才知道内容,所以在编译时无法确定,所以结果为false。

字符串的比较:
分析 “== ” 与 equals() 比较字符串的区别:
在基本数据类型上 “==” 用来判断值是否相同,但是用在String类对象时,比较的将不在是数值,而是实例化的对象的地址!即字符串堆内存的地址。
即使字符串内容相同,但是地址并不一定相同,比如上面说的,new开辟出的内存地址,和直接赋值开辟出的地址就不相同,所以在比较String类的时候,还是使用equals()方法,直接比较String类的内容,注意使用equals()避免空指针的出现。

字符串的修改的分析:
上面说到,字符串的底层其实是数组,数组的长度一但定义了就固定了,那如何进行字符串的修改? ,其实是通过引用的变化,来实现的,如下:
public class demo{
public static void main(String args[]){
String str = “fang”;
str += “shi”;
str= str + “yu”;
System.out.println(str);

}
}
执行结果 : “fangshiyu”
分析:其实堆内存中,有很多通过连接产生的新的堆空间,最后只有“fangshiyu”的堆空间被引用,而其他的就成为了垃圾,等待GC的回收!

字符串使用的案例:
String str = “fangshiyu”;

字符串和字符数组、字节的转换
char[] result= str.toCharArray(); //将字符串>字符数组
new String(result, 0,4); //将数组下标0到4的字符输出成字符串
byte data[] = str.getByets(); //将字符串转为字节数组
New String(data); // 将字节数组全部转为字符串。
New String(data , 0,4); // 将数组下标0到4的字节输出成字符串

字符串的查找:
Str.contains(“shi”) //自1.5开始增加的新方法,返回布尔类型判断是否存在
Str.indexOf(“shi”); //如果找到内容就会返回索引数据,如果没找到就会返回-1。
Str.lastIndexOf(“shi”); //从后往前查找。
Str.startWith(“fa”) // 判断是否已指定的字符串开头 返回布尔类型
Str.endWith(“fa”) // 判断是否已指定的字符串结尾 返回布尔类型

字符串的替换:
Str.replaceAll(“f”,”1”) // 将字符串中的“f”替换为1,返回新的字符串内容。
Str.replaceFirst(“f”,”1”) // 将字符串中的第一个“f”替换为1,返回新的字符串内容。

字符串的拆分:
String result[] = str.split(“,”); //将字符串中的”,”来拆分,返回数组。
如果在split方法中设置的是空字符(不是空格,是”” ,不是” ”。 ),那么就是将字符串根据每一个字符拆分。全拆。
注意,split方法能否正常拆分,都是与转义操作有关,比如以”.”来拆分,此时需要转义成”\.” 才能正常拆分。注意正则表达式的影响!!!。

字符串的截取:

Str.substring(4) ; // 指定位置截取到尾部 返回的是截取后字符串
Str.substring(0,4); //指定索引范围截取 返回的是截取后字符串

字符串格式化处理:
这里需要用到占位符:
字符串: %s
整数: %d
小数: %f
字符: %c
Int name = “方世玉”;
Int age = 18;
String.formate(“姓名:%s、年龄%d
”, name,age) //返回的结果是: 姓名:方世玉、年龄18

其他字符串方法:
public String concat(String str) 描述的是字符串的连接
Public String intern() 前面使用过,当用构造方法new实例化字符串时,可以使其内容入字符串常量池。
Public boolean isEmpty(); 判断是否为空字符串
Public int length() 计算字符串的长度
Public String trim() 去除左右空格
Public String toUpperCase() 字符串全部转大写
Pubic String toLowerCase() 字符串全部转小写

字符串概要:
1.String类在JAVA中属于特殊的,String可以通过直接赋值和构造方法进行实例化,前者只产生一个实例化对象,而且可以重用,后者产生2个,其中一个是垃圾空间。
2.JVM提供2类常量池,静态和动态,静态常量池,需在编译时进行字符串的处理,而运行时常量池,是在程序执行时动态实例化字符串对象。
3.比较字符串,使用的是equals()方法,而” == ” 比较的是2个字符串的地址值。
4.字符串一旦声明了,其内容不可更改(底层是数组,数组长度固定),修改是通过引用来实现的,但是会产生垃圾。
5.使用split方法时,要考虑正则表达式的影响,需要进行转义。
6.如果要对字符串进行编码的转换,可以通过getBytes来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值