JavaSE之String类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/83831965

String类的两种实例化方式

直接赋值 :

String str = "Hello Bit" ; // str是一个对象,那么"Hello Bit" 就应该保存在堆内存中
System.out.println(str) ;

这种赋值方式最为常用。但是String本身毕竟是一个类,既然是类,那么类中一定存在构造方法。String类也不例外,String类的其中一种构造方法如下:

public String(String str) ;

传统方法(通过构造方法实例化String类)

 String str = new String("Hello Bit") ;
  System.out.println(str) ;

该方法符合传统做法,使用关键字new进行对象实例化。

字符串相等比较

String类成员方法实现

先看段代码

public class homework2 {
    public static void main(String[] args){
       String str1="Hello HL";
       String str2=new String("Hello HL");
        System.out.println(str1==str2);//String是引用类型,str1 str2保存的是字符串的地址,所以这里比较的是字符串保存的地址,所以输出false
    }
}

通过上段代码我们了解到要比较两个字符串的大小不能直接比较,所以我们要用到String类的成员函数来实现

    public boolean equals(String anotherString)(成员方法)
public class homework2 {
    public static void main(String[] args){
       String str1="Hello HL";
       String str2=new String("Hello HL");
        System.out.println(str1.equals(str2));//true
    }
}

字符串常量是String的匿名对象

       String str2=NULL;//对象不存在
       str2.equals("hello");//两者区别,这种情况会是程序崩溃
       "hello".equals(str2);//推荐写这种情况

小提示:以后开发中,如果要判断用户输入的字符串是否等同于特定字符串,一定要将特定字符串(String常量)写在前面,否则可能会出现空指针异常错误使程序崩溃。

String类两种实例化的区别

1.采用直接赋值

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

在这里插入图片描述
为什么现在就没有重新赋值呢?
String类的设计使用了共享设计模式
在JVM底层实际上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用
所谓的对象池就是一个对象数组(目的就是减少内存开销)

2.采用构造方法

类对象使用构造方法实例化是标准做法。分析如下程序:

String str = new String("hello") ;

在这里插入图片描述
通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这 一缺点之外,也会对字符串共享产生问题。
在String类中提供有方法入池操作 public native String intern();( 手工入池(本地方法)):

String str1 = new String("hello").intern() ; 
String str2 = "hello" ;
 System.out.println(str1 == str2); // true

在这里插入图片描述
面试题:请解释String类中两种对象实例化的区别
1.直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2.构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池。
因此,我们一般会采取第一种方式直接赋值。

字符串常量不可变更

字符串一旦定义以后不可改变。
所有语言对于字符串的底层实现都是字符数组,数组的最大缺陷就是长度固定。在定义字符串常量时,它的内容不可改变。
观察如下代码:

String str="hello";
str=str+" HL";
str+="!!!";
System.out.println(str);//hello HL!!!

以上字符串的改变是字符串对象的改变而不是字符串的改变。
在这里插入图片描述
可以发现字符串上没有发生任何变化,但是字符串对象的引用一直在改变,而且会形成大量的垃圾空间。正是因为String的这个特点,所以在以后我们开发中尽量不要出现下面代码:

String str ="HL";
for(int i=0;i<1000;i++)
    str+=i;

如果有很多用户都使用了同样的操作,那么产生的垃圾数量就相当可观了。

字符与字符串的相互转换

在这里插入图片描述

字节(byte)与字符串

在这里插入图片描述

字符串比较

在这里插入图片描述

public class homework2 {
    public static void main(String[] args){
       String str1="Hello HL";
       String str2="hello hl";
        System.out.println(str1.equals(str2));//false---区分大小写比较
        System.out.println(str1.equalsIgnoreCase(str2));//true----不区分大小写比较
        System.out.println(str1.compareTo(str2));//-32----比较字符串的大小
    }
}

比较两个字符串大小
public int compareTo(String anotherString)
返回大于0:表示大于比较对象
返回等于0:两者相等
返回小于0:表示小于比较对象

字符串查找

在这里插入图片描述
字符串查找,最好用最方便的就是 public boolean contains(String str);

String str="helloworld";
System.out.println(str.contains("world"));//true

这个判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能就必须借助indexOf()方法完成.

字符串替换

在这里插入图片描述

字符串拆分

在这里插入图片描述
范例:实现字符串的全部拆分处理
在这里插入图片描述
范例:实现字符串的部分拆分处理
在这里插入图片描述

以上的拆分形式都很容易,如果发现有些内容无法拆分开就需要使用""转义
范例:拆分IP地址

public class homework2 {
    public static void main(String[] args){
        String str1="192.168.12.12";
       String[] str=str1.split("\\.");//在java中字符点有特殊含义所以必须要用转义符转义才能进行拆分
       for(String x:str)
       {
           System.out.println(x+" ");
       }
    }
}

在实际开发中经常出现多次拆分,所以该程序必须会操作。如下段代码:

public class homework2 {
    public static void main(String[] args){
        String str1="HL:19|LSX:20|QX:20";

       String[] str=str1.split("\\|");
       for(int i=0;i<str.length;i++)
       {
           String []tmp=str[i].split(":");
           System.out.println(tmp[0]+"="+tmp[1]);
       }
    }
}

字符串截取

在这里插入图片描述
索引从0开始

字符串的其他常规操作

在这里插入图片描述

注意:求数组长度 (数组名.length)是数组的属性,而String中使用的是length()方法
范例:观察isEmpty()方法


public class homework2 {
    public static void main(String[] args){
        String str1=" he HL ";
        System.out.println("hello".isEmpty());//false
        System.out.println("".isEmpty());//true
        //System.out.println(new Stirng().isEmpty());//程序报错,对象不能为空
    }
}

面试题:首字母大写

public class homework2 {
    public static void main(String[] args){
        System.out.println(FirstUpper("vbsibvl"));
        System.out.println(FirstUpper(""));
        System.out.println(FirstUpper(new String()));
    }
    public static String FirstUpper(String str){
       if("".equals(str)||str==null){
           return str;
       }
       if(str.length()>1){
           return str.substring(0,1).toUpperCase()+str.substring(1);
       }
       return str.toUpperCase();
    }
}

StringBuffer类

为什么会出现StringBuffer类呢?
任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer类。

字符串拼接

在String中使用”+“来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:public synchronized StringBuffer append(各种数据类型 b)
范例:观察StringBuffer的用法

public class homework2 {
    public static void main(String[] args){
        StringBuffer sb=new StringBuffer();
        sb.append("hello").append("world");
        fun(sb);
        System.out.println(sb);
    }
    public static void fun(StringBuffer str) {
        str.append("\n").append("www.bit.com");
    }
}

运行结果
在这里插入图片描述
String和StringBuffer最大的区别在于:String的内容无法修改,但是StringBuffer的内容可以修改。而且如果频繁修改字符串的情况考虑使用StringBuffer

String和StringBuffer类的交换原则

String变为StringBuffer:利用StringBuffer的构造方法或者append()方法
StringBuffer变为String:调用toString()方法

public class homework2 {
    public static void main(String[] args){
        //String变为StringBuffer:利用StringBuffer的构造方法或者append()方法
        String str=new String("HL");
        StringBuffer sb=new StringBuffer(str);
        System.out.println(sb);
        //String变为StringBuffer:利用StringBuffer的append()方法
        StringBuffer sbb=new StringBuffer();
        sbb.append("hello").append("world");
        fun(sbb);
        System.out.println(sbb);
        //StringBuffer变为String:调用toString()方法
        String str1=new String();
        str1=sbb.toString();
        System.out.println(str1);
    }
    public static void fun(StringBuffer str) {
        str.append("\n").append("www.bit.com");
    }
}

运行结果
在这里插入图片描述
StringBuffer也有一些String类没有的方法

字符串反转

public synchronized StringBuffer reverse();
范例:

public class homework2 {
    public static void main(String[] args){
        StringBuffer sb=new StringBuffer("hello HL");
        System.out.println(sb.reverse());
    }
}

删除指定范围的数据

public synchronized StringBuffer delete(int start,int end);
范例:

public class homework2 {
    public static void main(String[] args){
        StringBuffer sb=new StringBuffer("hello HL");
        System.out.println(sb.delete(1,4));
    }
}

插入数据

public synchronized StringBuffer delete(int offset,各种数据类型 b);
范例:

public class homework2 {
    public static void main(String[] args){
        StringBuffer sb=new StringBuffer("hello HL");
        System.out.println(sb.insert(0,4));
        System.out.println(sb.insert(0,"HL "));
    }
}

面试题:解释String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
2.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作,String"+"底层会将String转变为StringBuilder。

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/83831965
今日推荐