Java String、StringBuffer和StringBuilder类

package com.fish.string;
/*
 String 字符串类:
  
 题目:new String("abc")创建了几个对象?
 两个对象,一个对象是 位于字符串常量池中,一个对象是位于堆内存中。  
 */
public class Demo1 {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "hello";
        String str3 = new String("hello");
        String str4 = new String("hello");
        System.out.println("str1==str2?"+(str1==str2));  // true  
        System.out.println("str2==str3?"+(str2==str3));  //false
        System.out.println("str3==str4?"+(str3==str4));  // false
        System.out.println("str3.equals(str2)?"+(str3.equals(str4))); //true
       
        //是String类重写了Object的equals方法,比较的是两个字符串对象 的内容是否一致。
        // "=="用于比较 引用数据类型数据的时候比较的是两个对象 的内存地址,equals方法默认情况下比较也是两个对象 的内存地址。
       
        test(null);
       
    }
    public static void test(String str){
       
        if("中国".equals(str))
        {
            System.out.println("回答正确");
        }else{
            System.out.println("回答错误");
        }
    }
}

package com.fish.string;
/*
 String 的构造方法:
 
 String()  创建一个空内容 的字符串对象。
 String(byte[] bytes)  使用一个字节数组构建一个字符串对象
 String(byte[] bytes, int offset, int length) 
     bytes :  要解码的数组
     offset: 指定从数组中那个索引值开始解码。
     length: 要解码多个元素。
 
 String(char[] value)  使用一个字符数组构建一个字符串。
 String(char[] value, int offset, int count)  使用一个字符数组构建一个字符串, 指定开始的索引值,与使用字符个数。
  String(int[] codePoints,int offset,int count)
  String(String original) 
  记住: 使用字节数组或者字符数组都可以构建一个字符串对象。
 */
 
public class Demo2 {
    public static void main(String[] args) {
        String str = new String();
        byte[] buf = {97,98,99};
        str = new String(buf); //使用一个字节数组构建一个字符串对象
        str = new String(buf,1,2);   //使用一个字节数组构建一个字符串对象,指定开始解码 的索引值和解码的个数。
       
        char[] arr = {‘明‘,‘天‘,‘是‘,‘圣‘,‘诞‘};
        str = new String(arr); //使用字符数组构建一个字符串
        str = new String(arr,3,2);
       
        int[] buf2 = {65,66,67};
        str = new String(buf2,0,3);
        str = new String("abc");
        System.out.println("字符串的内容:"+str);
    }
}
package com.fish.string;
/*
2.2获取方法
int length()  获取字符串的长度
char charAt(int index) 获取特定位置的字符 (角标越界)
int indexOf(String str) 查找子串第一次出现的索引值,如果子串没有出现 在字符串中,那么则返回-1表示。
int lastIndexOf(String str) 查找子串最后一次出现的索引值 , 如果子串没有出现 在字符串中,那么则返回-1表示
*/

public class Demo3 {
    public static void main(String[] args) {
        String str = "abc中国ab中国";
        System.out.println("字符串的字符 个数: " + str.length() );
        System.out.println("根据索引值获取对应 的字符:"+ str.charAt(3));
        System.out.println("查找子串第一次出现的索引值:" + str.indexOf("中国"));
        System.out.println("查找子串最后一次出现的索引值:" + str.lastIndexOf("中国"));
    }
}
package com.fish.string;
import java.util.Arrays;
/*
2.3判断方法
    boolean endsWith(String str) 是否以指定字符结束
    boolean isEmpty()是否长度为0 如:“” null V1.6
    boolean contains(CharSequences) 是否包含指定序列 应用:搜索
    boolean equals(Object anObject) 是否相等
    boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等
2.4转换方法     
    char[] toCharArray()  将字符串转换为字符数组
    byte[]getBytes();
    字节数组与字符数组、字符串他们三者之间是可以互相转换。
*/

public class Demo4 {
    public static void main(String[] args) {
        String str = "Demo.java";
        System.out.println("是否以指定 的字符串结束:"+ str.endsWith("ja"));
        
        //str = "";
        System.out.println("判断字符串是否为空内容:"+str.isEmpty());
        System.out.println("判断字符串是否包含指定的内容:"+ str.contains("Demo"));
        System.out.println("判断两个 字符串的内容是否一致:"+ "DEMO.JAVA".equals(str));
        System.out.println("判断两个字符串的内容是否一致(忽略大小写比较):"+ "DEMO.JAVA".equalsIgnoreCase(str));
        
        //转换的方法
        char[] buf = str.toCharArray();  //把字符串转换字符数组
        System.out.println("字符数组:"+ Arrays.toString(buf));
        byte[] buf2 = str.getBytes();//把字符串转字节数组
        System.out.println("字节数组:"+ Arrays.toString(buf2));
    }
}
package com.fish.string;
import java.util.Arrays;
/*

其他方法
String replace(String oldChar, String newChar) 替换
String[] split(String regex) 切割
String substring(int beginIndex)   指定开始 的索引值截取子串
String substring(int beginIndex, int endIndex)指定开始 与结束的索引值截取子串
String toUpperCase() 转大写
String toLowerCase() 转小写
String trim() 去除字符串首尾的空格

*/
public class Demo5 {
    public static void main(String[] args) {
        String str = "今天晚上不打老虎";
        System.out.println("指定新内容替换旧 的内容:"+ str.replace("不", "要好好"));
        str = "大家-下-午-好";
        String[] arr = str.split("-"); //根据指定的字符进行切割 。
        System.out.println("字符串数组的内容:"+ Arrays.toString(arr));
        str = "中华人民共和国";
        System.out.println("指定开始的索引值截取子串:"+ str.substring(2));
        System.out.println("指定开始的索引值截取子串:"+ str.substring(2,6)); //包头不包尾  注意:截取的内容是包括开始的索引值,不包括结束的索引值, 截取的位置是结束的索引值-1.
        str = "abC中国";
        System.out.println("转大写:" + str.toUpperCase());
        str = "AbdfSDD"; 
        System.out.println("转小写:"+ str.toLowerCase());
        str = "         大家最近        都非常努力            ";
        System.out.println("去除字符串首尾的空格:"+ str.trim());
    }
}
package com.fish.string;
/*
需求1:自己实现trim的方法。
需求2: 获取上传文件名  "D:\\20120512\\day12\\Demo1.java"。
需求3:将字符串对象中存储的字符反序。    新中国好     -----> 好国中新
需求4: 求一个子串在整串中出现的次数 。 
*/

public class Demo6 {
    public static void main(String[] args) {
        String str  ="        西毒        欧阳锋             ";
        System.out.println(myTrim(str));
        str =  "D:\\aa\\bb\\Demo1.java";
        getFileName(str);
        str = "新中国好";
        System.out.println("翻转后的字符串:"+ reverse(str));
        str = "abcjavaabcjavaphpjava";  //java
        getCount(str, "java");
    }
    
    //统计子串出现的次数
    public static void getCount(String str,String target){
        int count = 0 ; //用于记录出现的次数
        int fromIndex  = 0; // 记录从那个索引值开始寻找目标子串
        
        while((fromIndex = str.indexOf(target, fromIndex))!=-1){
            //如果indexof方法返回 的不是-1,那么就是已经找到了目标元素。
            count++;
            fromIndex = fromIndex+target.length();
        }
        System.out.println("出现的次数:"+ count);
     }
    
    
   
    public static String reverse(String str){
        char[] arr = str.toCharArray();
        for(int startIndex = 0 , endIndex=arr.length-1 ; startIndex<endIndex; startIndex++,endIndex--){
            char temp = arr[startIndex];
            arr[startIndex] = arr[endIndex];
            arr[endIndex] = temp;
        }
   
        //使用字符数组构建一个字符串。
        return new String(arr);
    }
     
     
     
     
     //需求2: 获取上传文件名 "D:\\aa\\bb\\Demo1.java"。
     public static void getFileName(String path){
        int index = path.lastIndexOf("\\");
        String fileName = path.substring(index+1);
        System.out.println("文件名:"+ fileName);
        
        //根据截取来做
        //String [] strs=path.split("\\\\");
        //System.out.println(strs[length()-1]);
    }
    
    
    //需求1:自己实现trim的方法。
    public static String myTrim(String str){
        //先转换成字符 数组
        char[] arr = str.toCharArray();
        
        //定义两个 变量记录开始与结束 的索引值
        int startIndex = 0 ;
        int endIndex = arr.length -1;
        
        //确定开始 的索引值
        while(true){
            if(arr[startIndex]==‘ ‘){
                startIndex++;
            }else{
                break;
            }
        }
        
        //确定结束 的索引值:
        while(true){
            if(arr[endIndex]==‘ ‘){
                endIndex--;
            }else{
                break;
            }
        }
        
        //截取子串返回
        return str.substring(startIndex,endIndex+1);
    }
}
package com.fish.stringbuffer;
/*
 字符串特点:字符串是常量;它们的值在创建之后不能更改.
 
 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象。
 
 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象。
 
 如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer)。
 
 
 StringBuffer 其实就是一个存储字符 的容器。
 
 */
public class Demo1 {
    public static void main(String[] args) {
    String str1 = "hello";
    String str2= str1+" world";
    System.out.println("str1与str2是同一个 对象吗?"+(str1==str2));
}
}
package com.fish.stringbuffer;
/*
如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer)。
StringBuffer 其实就是一个存储字符的容器。
题目:使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?
    StringBuffer 底层是依赖了一个字符数组才能存储字符数据的,该字符串数组默认的初始容量是16, 如果字符数组的长度不够使用,自动增长1倍+2。
    
容器的具备的行为
    增加
    删除
    修改
    查看
    判断 
*/
public class Demo2 {
    public static void main(String[] args) {
        //先使用StringBuffer无参的构造函数创建一个字符串缓冲类。
        StringBuffer sb = new StringBuffer(); 
        sb.append("java");
        sb.append("java");
        sb.append("java");
        sb.append("java");
        sb.append("java");
        System.out.println(sb);
    }
}
package com.fish.stringbuffer;
/*
如果需要频繁修改字符串的内容,建议使用字符串缓冲类(StringBuffer)。
StringBuffer 其实就是一个存储字符的容器。

题目:使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?
StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用,自动增长1倍+2。
StringBuffer 是一个存储字符的容器 

容器的具备的行为
    String 
增加
    append(boolean b)    可以添加任意类型 的数据到容器中
    insert(int offset, boolean b)  指定插入的索引值,插入对应 的内容。 
删除
    delete(int start, int end)  根据指定的开始与结束的索引值删除对应的内容。
    deleteCharAt(int index)   根据指定 的索引值删除一个字符。
修改
    replace(int start, int end, String str) 根据指定 的开始与结束索引值替代成指定的内容。
    reverse()   翻转字符串缓冲类的内容。  abc--->cba
   setCharAt(int index, char ch)  把指定索引值的字符替换指定的字符。 
   substring(int start, int end)  根据指定的索引值截取子串。
    ensureCapacity(int minimumCapacity)  指定StringBuffer内部的字符数组长度的。
查看
    indexOf(String str, int fromIndex) 查找指定的字符串第一次出现的索引值,并且指定开始查找的位置。
    lastIndexOf(String str)     
    capacity() 查看当前字符数组的长度。 
    length() 
    charAt(int index) 
    toString()   把字符串缓冲类的内容转成字符串返回。

    
    StringBuffer 与 StringBuilder的相同处与不同处:
相同点:
    1. 两个类都是字符串缓冲类。
    2. 两个类的方法都是一致的。
不同点:
    1. StringBuffer是线程安全的,操作效率低 ,StringBuilder是线程非安全的,操作效率高。记住凡是增删改都会有线程安全的问题
    2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。

    推荐使用: StringBuilder,因为操作效率高。如果担心有线程安全问题,用StringBuffer
*/
public class Demo2 {
    public static void main(String[] args) {
        
        
        //先使用StringBuffer无参的构造函数创建一个字符串缓冲类。
        StringBuffer sb = new StringBuffer(); 
        sb.append("abcjavaabc");
        
        /*
        
        添加 
        sb.append(true);
        sb.append(3.14f);
        
        插入
        sb.insert(2, "小明");
        */
        
        
        /*
        删除
        sb.delete(2, 4); //  删除的时候也是包头不包尾
        sb.deleteCharAt(3); //根据指定 的索引值删除一个字符
        
        
        修改
        sb.replace(2, 4, "陈小狗");
        sb.reverse(); // 翻转字符串的内容
        sb.setCharAt(3, ‘红‘);
        String subString = sb.substring(2, 4);
        System.out.println("子串的内容:"+ subString);
        
        
        查看
        int index = sb.indexOf("abc", 3);
        System.out.println("索引值为:"+index);
        sb.append("javajava");
        System.out.println("查看字符数组的长度:"+ sb.capacity());
        */
        
        
        
        System.out.println("存储的字符个数:"+sb.length());
        System.out.println("索引指定的索引值查找字符:"+sb.charAt(2) );
        System.out.println("字符串缓冲类的内容:"+ sb);
       
       
        String content = sb.toString();
       
        test(content);
        }
    public static void test(String str){
    
    }
}
时间: 2024-11-08 22:33:54

Java String、StringBuffer和StringBuilder类的相关文章

Java String, StringBuffer和StringBuilder实例

1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length()3.3.2- concat(String)3.3.3- indexOf(..)3.3.4- substring(..)3.3.5- replace3.3.6- 其它实例4- StringBuffer vs StringBuilder 1- 分层继承 当使用文本数据时,Java提供了三种类别,包括

JAVA String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以

String Buffer和StringBuilder类-java

Java String Buffer和StringBuilder类 对字符串进行修改时,需要String Buffer和StringBuilder类 能够被多次修改,却不产生新的未使用对象 StringBuilder类,不是线程安全的. 速度优势,要求安全的情况下必须用StringBuffer类 public class Test{ public static void main(String args[]){ StringBuffer sBuffer = new StringBuffer("e

【Java】String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以

java String,StringBuffer,StringBuilder的区别

StringBuilder.StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...).只是StringBuffer会在方法上加synchronized关键字,进行同步. 最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer ? 这句话并不理解. 1 String String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的. String类的包

Java StringBuffer和StringBuilder类

当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类. 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象. StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问). 由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBui

Java StringBuffer 和 StringBuilder 类

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类. 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象. StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问). 由于 StringBuilder 相较于 StringBuffer 有速度优势,

Java 12 - Java StringBuffer和StringBuilder类

Java StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类. 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象. StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某

【JAVA】辨析:String,StringBuffer与StringBuilder

参考链接: CSDN:图析:String,StringBuffer与StringBuilder的区别 1. Java String 类:字符串常量 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间. String操作时内存变化的图: 2. StringBuffer 和 Str

浅谈String、StringBuffer和StringBuilder类的区别

1.均可对字符串进行修改,但StringBuffer和StringBuilder类的对象进行多次修改时,不产生新的未使用对象. String 的底层是用final修饰的char数组,变量的内容不可变——内存占用高,资源利用率低: StringBuffer和StringBuilder类 则继承了AbstractStringBuilder类,其未使用final修饰char数组,变量内容动态更新——无效数组等待垃圾回收,减少资源占用; 2.StringBuilder相较于StringBuffer有速度