Java基础(16)String

十六.String
String实际上就是对一个char类型数组的封装,String中提供了很多方法,用来帮助我们有效的操作这个char类型的数组
一.String类型对象的创建
1.通过字符串常量的形式 来创建字符串
String str="HelloWorld";
"HelloWorld"字符串的形式  被称为字符串常量
字符串常量也是String类型的对象,但是该对象的创建不在代码的运行时期,而是在类加载时,将字符串常量
对象在全局字符串常量池(串池)中,进行创建
全局字符串常量池(串池):串池是堆空间中一块内存,用来储存字符串常量对象(String类型的对象)
2.通过构造方法来创建字符串对象
String str2=new String("HelloWorld");
a.类加载时期,先在串池中,创建一个内容为"HelloWorld"的String对象
b.在运行时期,将串池中内容为"HelloWorld"的String对象,作为参数,在  堆空间中  创建一个String类型的对象
3.常见面试题  重要
String str="HelloWorld";
String str2=new String("HelloWorld");
这两种创建String对象的形式,有什么区别?
a.字符串常量的形式创建对象,只会在串池中  创建一个对象
b.构造方法创对象,会先在串池中创建一个对象,再在堆空间中创建一个对象
4.全局字符串常量池(串池)的作用
用来复用字符串对象,整个JVM中,所有以字符串常量形式,创建的String对象,都会被放置在   串池中   
而,串池中内容一致的String对象只会存在一份,谁先被创建,串池就存储谁,这样就能保证内容一致的字符串使用
都是同一个字符串对象,放置String对象的频繁创建,提高内存利用率
二.String类型的不可变性
String类型的对象一旦被创建  内容就不可改变  如果改变内容  就会新创建一个String类型的对象
用来存储改变后的内容
1.为什么String是不可变得
a.从思想的角度来说
Java中所有内容一样的字符串都会去使用同一个串池中的对象 如果一个引用试图修改该对象的内容
则会让所有使用该对象的引用都受到影响
b.从代码的层面来说
String中封装的字符数组  是final修饰的,而字符数组中存储的字符其实就是String的内容  所以String的
内容  是不可变得
2.当更改字符串内容时,新生成的对象回放在那?  了解
a.纯字符串常量进行改变时,即  相加是一字符串常量进行相加
String str = "Hello"+"World";
生成的新对象  是在串池中
b.有字符串引用进行的改变  即  相加时有字符串引用的参与
String str = "Hello";
str =str+"World";
生成的新对象  在堆空间中
堆空间中的字符串对象  不会被复用
串池中的字符串对象  可以被复用
三.String类型的常用方法  重要
常见的方法间api或文档  要求每个同学必须熟练掌握15个以上的常用方法
字符串中的方法介绍
     int length()  字符串长度
     boolean equals(Object obj)  比较2个字符串的内容是否相同
     char charAt(int index) 根据指定下标index,获取对应的1个字符
          char c = s.charAt(0);
     int indexOf(String str)
          s1.indexOf(s2)  返回s2在s1中首次出现的位置下标,如果不存在则返回-1
     int indexOf(String str, int fromIndex)
          s1.indexOf(s2,5)  返回s2在s1中首次出现的位置下标,如果不存在则返回-1(从formIndex下标开始向后查询)
    
     String substring(int beginIndex) 截取字符串,从beginIndex到结尾
     String substring(int beginIndex, int endIndex) 
          截取字符串,从begin开始,到end结束(包含beginIndex,不包含endIndex)
     String[] split(String regex) 
          String[] ss = s1.split(s2) 根据间隔符(参数),把原字符串 拆分成 字符串数组。
         
     String replace(char oldChar, char newChar) 是使用第二个参数 替换 字符串中的第一个参数
     String intern() 获取字符串在串池中的地址 
     char[] toCharArray() 字符串转换成字符数组类型
     boolean contains(String s)
          boolean b = s1.contains(s2);   s2是否是s1子串
     boolean isEmpty()  判断是否是空字符串("" 长度0),是空串返回true,否则false
     String toLowerCase() 字符串转换成小写返回
     String toUpperCase()  字符串转换成大写返回
     String trim()  去掉字符串前后的空格
     boolean endsWith(String suffix) s1.endsWith(s2) 判断s1是否以s2结尾
     boolean startsWith(String prefix) 判断一个字符串是否以 prefix开头
     int lastIndexOf(String str) 从后向前查询
     int lastIndexOf(String str, int fromIndex) 从formIndex向前检索
1.字符串中的intern方法 面试题
当字符被调用intern方法时,会先去验证  该字符串的内容  是否已经在串池中存在 如果存在就把串池中
内容一样的对象返回给调用者,如果该字符串的内容不存在,则把该字符串添加到串池里  并将当前字符串
自身返回给调用者
四.可变字符串的分类
1.可变字符串的分类
可变字符串都是java.lang包下的
StringBuffer 是JDK1.0出现的,线程安全,但是效率低
StringBuilder是JDK1.5出现的,线程不安全,但是效率高,常用
2.可变长字符串的用法
(1)创建可变长字符串 只能使用构造方法的形式,不能使用字符串常量的形式创建
StringBuilder builder = new StringBuilder("ABC");
(2)如果想进行字符串的拼接  则需要使用方法,而不能使用+
StringBuilder builder = new StringBuilder("ABC");
builder.append("DEFG");
System.out.println(builder);
3.可变长字符串的可变性
更改可变长字符串的内容时,就是在原来的内容上更改,不会生成新对象
StringBuilder builder = new StringBuilder("ABC");
StringBuilder b2=builder;
builder.append("DEFG");
System.out.println(builder==b2);
常见的问题:
String 和 StringBuilder有什么区别?
( 1) String 是不可变长字符串,完成字符串拼接时效率相对较低
(2) StringBuilder 是可变长字符串,完成字符串拼接时效率相对较高
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值