Java中的String类和StringBuffer类

目录

 

1.String类

 String类方法

2.StringBuffer

StringBuffer特有方法 


1.String类

String类的特点:

  • 字符串是一个特殊的对象
  • 字符串一旦初始化就不可以被改变
  • 分析以下两句代码有什么区别?
String s1 = "abc";//s1是一个类类型变量, "abc"是一个对象
//字符串最大特点:一旦被初始化就不可以被改变。
String s2 = new String("abc");

s1在内存中有一个对象
s2在内存中有两个对象。(先new一个对象,然后把"abc"传递给String的构造函数)。

在这里,先不谈堆 和 栈 ,先简单引入常量池这个简单的概念。其实,常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

例子中的s1中的”abc”是字符串常量,它们在编译期就被确定了。

用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的内存地址。

例1:

class  Demo
{
  public static void main(String[] args)
  {
    String s1="abc";
    String s2=new String("abc");
    String s3="abc";
    System.out.println(s1==s2);
    System.out.println(s1==s3);  
//凡是内容中存在的字符串都不会再创建,Java会确保一个字符串常量只有一个拷贝
    System.out.println(s1.equals(s2));
    //String类复写了Object类中equals方法,该方法用于判断字符串的内容是否相同
  }
}

注意:关于 equals() 和 == 区别:

  1.  String类复写了Object类中equals方法,该方法用于判断字符串的内容是否相同。
  2.  而 == 是比较两字符串的地址是否相同,比较是不是同一个字符串的地址引用。

 String类方法

String类适用于描述字符串事物。那么它就提供了多个方法对字符串进行操作。

常见的操作有哪些?

1.获取

  1. 字符串中的包含的字符数,也就是字符串的长度   int length():获取长度。
  2. 根据位置获取位置上某个字符。  char charAt(int index):
  3. 根据字符获取该字符在字符串中位置。                                                                                                                            

int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。  

int indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置。                                  

int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex) :从fromIndex指定位置开始,获取str在字符串中出现的位置。                            

int lastIndexOf(int ch)   :返回字符最后一次出现的索引值

class  StringDemo
{
  public static void main(String[] args)
  {
    String s1="abcdefgaf";
    System.out.println(s1.length());  //返回字符串的长度
    System.out.println(s1.charAt(3));    //返回下标是3处的字符
    System.out.println(s1.indexOf('c'));   //字符c处的索引值
    System.out.println(s1.indexOf('d',1));    //从下标1处开始查找字符d的索引
    System.out.println(s1.lastIndexOf('a'));   //字符a最后出现的索引值
  }
}

 

2.判断

  1. 字符串中是否包含某一个子串  boolean contains(str):                                                                                                        

    特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。所以,也可以用于对指定判断是否包含。  if(str.indexOf("aa")!=-1)    而且该方法即可以判断,也可以获取出现的位置。   

  2. 判断字符串中是否有内容    boolean isEmpty(): 原理就是判断长度是否为0. 

  3. 字符串是否是以指定内容开头  :boolean startsWith(str);

  4. 字符串是否是以指定内容结尾:boolean endsWith(str);

  5. 判断字符串内容是否相同。复写了Object类中的equals方法:boolean equals(str);

  6. 判断内容是否相同,并忽略大小写:boolean equalsIgnoreCase();

 

class  StringDemo
{
  public static void main(String[] args)
  {
    String s1="StringDemo.java";
    String s2="stringdemo.java";
    System.out.println(s1.contains("Demo")); //是否包含Demo
    System.out.println(s1.isEmpty());   //判断字符串是否为空
    System.out.println(s1.startsWith("String"));
    System.out.println(s1.endsWith("java"));
    System.out.println(s1.equals(s2));
    System.out.println(s1.equalsIgnoreCase(s2));  //忽略大小写比较内容
  }
}

3.转换

  • 将字符数组转成字符串:

构造函数:String(char[])
                  String(char[],offset,count):将字符数组中的一部分转成字符串。

静态方法:
                static String copyValueOf(char[]);
                static String copyValueOf(char[] data, int offset, int count);

                static String valueOf(char[]):

  • 将字符串转成字符数组

      char[] toCharArray()

  • 将字节数组转成字符串

            String(byte[])
            String(byte[],offset,count):将字节数组中的一部分转成字符串。

  • 将字符串转成字节数组。

      byte[]  getBytes():

  • 将基本数据类型转成字符串

        static String valueOf(int)
        static String valueOf(double)

class  StringDemo
{
  public static void main(String[] args)
  {
    char[] ch={'a','b','c','d','e','f'};
    String s1=new String(ch);
    String s2=new String(ch,1,3);//将字符数组的一部分转成字符串
    System.out.println(s1);
    System.out.println(s2);
    String str="abcdef";
    char[] arr=str.toCharArray();
    for(int x=0;x<arr.length;x++)
    {
      System.out.println("arr="+arr[x]);
    }
  }
}

 

4.替换

String replace(oldchar,newchar);

class  StringDemo
{
  public static void main(String[] args)
  {
    String str="hello.java";
    String s1=str.replace("java","class");
    System.out.println(s1);
  }
}

 

5.切割

String[] split(regex);

class  StringDemo
{
  public static void main(String[] args)
  {
    String str="Tom,Jack,Mike";
    String[] s1=str.split(",");   //切割完以后的字符串变成了字符串数组
    for(int x=0;x<s1.length;x++)
    {
      System.out.println(s1[x]);
    }
  }
}

 

6.子串

获取字符串中的一部分:

String substring(begin);        //从begin到字符串末尾
String substring(begin,end);

class  StringDemo
{
  public static void main(String[] args)
  {
    String str="abcdef";
    String s1=str.substring(2); //从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
    String s2=str.substring(2,4); //包含头,不包含尾。
    System.out.println(s1);
    System.out.println(s2);
  }
}

 

7.转换

转换,去除空格,比较:

  • 将字符串转成大写或则小写:

         String toUpperCase();    //将字符串中的所有字母都变成大写
         String toLowerCase();   //将字符串中的所有字母都变成小写

  • 将字符串两端的多个空格去除

        String trim();    //只去除两端的空格,中间的空格不会去除

  • 对两个字符串进行自然顺序的比较:

        int compareTo(string);

class  StringDemo
{
  public static void main(String[] args)
  {
    String str="  Hello World";
    String s1=str.toUpperCase(); //变大写
    String s2=str.toLowerCase();  //变小写
    String s3=str.trim();  //去除两边的空格
    System.out.println(s1);
    System.out.println(s2);
    System.out.println(s3);
    String s4 = "a1c";
    String s5 = "aaa";
    System.out.println(s4.compareTo(s5));

  }
}

 

2.StringBuffer

  1.  字符串的组成原理就是通过该类实现的;
  2. StringBuffer可以对字符串内容进行增删;
  3. StringBuffer是一个容器;
  4. 很多方法与String相同;
  5. StingBuffer是可变长度的.
  6. StingBuffer是字符串缓冲区
  7. 可以直接操作多个数据类型
  8. 最终会通过toString方法变成字符串。

StringBuffer特有方法 

1.存储

StringBuffer append():将指定数据作为参数添加到已有数据结尾处。
StringBuffer insert(index,数据):可以将数据插入到指定index位置。

class  StringDemo
{
  public static void main(String[] args)
  {
    StringBuffer sb=new StringBuffer();
    sb.append("abc");
    sb.append("def");
    System.out.println(sb.toString()); //最终会通过toString方法变成字符串
    sb.insert(2,"haha");
    System.out.println(sb.toString());
  }
}

 

2.删除

StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。

class  StringDemo
{
  public static void main(String[] args)
  {
    StringBuffer sb=new StringBuffer("abcdefg");
    sb.delete(1,3);  //删除时包含头不包含尾
    System.out.println(sb);
    sb.delete(0,sb.length());  //删除全部内容
    System.out.println(sb);
  }
}

 

3.获取

char charAt(int index) 
int indexOf(String str) 
int lastIndexOf(String str) 

int length() 
String substring(int start, int end) 

 

4.修改

StringBuffer replace(start,end,string);
void setCharAt(int index, char ch) ;

将缓冲区中指定数据存储到指定字符数组中

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 

class  StringDemo
{
  public static void main(String[] args)
  {
    StringBuffer sb=new StringBuffer("abcdefg");
    sb.replace(1,3,"haha");
    System.out.println(sb);
    sb.setCharAt(3,'g');
    System.out.println(sb);
  }
}

 

5.反转

StringBuffer reverse(); 

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

 

注意:JDK1.5 版本之后出现了StringBuilder.

StringBuffer是线程同步。
StringBuilder是线程不同步。

以后开发,建议使用StringBuilder

升级三个因素:
1,提高效率。
2,简化书写。
3,提高安全性。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值