zoukankan      html  css  js  c++  java
  • java常用类与包装类--常用类字符串String类、StringBuffer类、Stringbuilder类

    1.String类

    1.1String类的概念和储存结构:

    (1)字符串是一个比较特殊的对象,可以使用new,也可以不使用new来创建字符串对象

    String s1 = new String("abc"); 堆
    
    String str = "abc"; 常量池
    String str2 = "abc";

    两者的区别:一个在堆中,一个在常量池中
    常量池:方法区的一部分,字符串在常量池里面保存一份

    (2)字符串是不可变量,一旦初始化就不可以被改变
    String s1 = "abc";(直接使用用字符串字面量)
    s1 = s1 + "123";//s1变量指向变了(指向了"abc123"),并不是字符串变了。

    面试题:以下语句创建了几个对象?
    String str1 = new String("abc");
    
    一个或者两个:
    如果之前常量池里有"abc"了,就在堆中创建一个对象;
    如果常量池里没有"abc"对象,则先在常量池中把"abc"创建出来,然后再到堆空间中创建对象.
    面试题

    (3)"abc" vs new String("abc");

    String s3 = "abc";
    String s4 = "abc"; VS String str1 = new String("abc");
    使用new关键字创建的对象都是在堆内存中开辟了新空间,所以地址不可能相同。
    不使用new创建的字符串引用的是常量池中的字符串对象,所以地址是相同的

    (4)new String(chs)

    1.2String类的常用构造方法

    String(char[] ch)
    String(char[] ch,int offset,int count)
    String(byte[] bys,int off,int len)
    //使用默认的解码,将字节数组解码成String
    先在堆中,后在常量池
    其构造方法创建的字符串,先在堆中创建出来,
    并在常量池保存一个副本(如果常量池中没有的话)

    String(String original)
    //用一个原始字符串构建一个新字符串
    使用构造方法创建的对象都是在堆中
    如果直接使用字符串常量创建对象: new String(String original)
    先在常量池中创建对象,然后在堆中创建对象;

    补充:char的ASCII

    int length() --获取字符串中字符的个数
    char charAt(int index);

    char[] toCharArray();//使用此方法改写统计案例
    int indexOf(String str); 有报位置无-1
    boolean startsWith(String str);
    boolean endsWith(String str);
    String[] split(String reg);//统计单词
    String substring(int beginIndex);
    String substring(int beginIndex,int endIndex);(左闭右开)

    1.3 equal方法与==

    1.4 String 的构造方法

    1.4.1成员变量

    1.4.2构造方法

     

     

         1.5字符串拼接原理

    2.StringBuffer类

    类似于String的字符缓冲区,是一个容器。其内部维护了一个字符数组,用于存储字符。StringBuffer可以对字符串内容进行增删
    很多方法与String相同。

    2.1对成员变量源码研究

    2.2StringBuffer的构造方法

    2.3StringBuffer类特有方法--添加

    StringBuffer append(int x) --在末尾追加
    StringBuffer insert(int off,插入内容)---指定位置
    若:StringBuffer sb = new StringBuffer();
    则以下语句等价:

     

     

    2.3.1append解析

    append方法后面可以跟任意数据类型,一下是对append(String str)

    2.4StringBuffer类特有方法--删减

    StringBuffer delete(int start, int end)
    注意位置区间的处理:包前不包后:[start,end)

    2.5toString方法

     

    补充:对比oject类

    2.5StringBuffer类特有方法--反转功能

    StringBuffer reverse()

    2.6StringBuffer类特有方法--替换功能

    StringBuffer replace(int start,int end,String str)
    替换功能:[start,end)

    3.StringBuilder类

    3.1StringBuilder vs StringBuilder

    JDK1.5出现了:StringBuilder
    区别是从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。

    与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

      • StringBuilder是同步的,效率稍低
      • StringBuilder是非同步的,因此速度更快

    3.2练习

    练习1:

    将字符串中每个单词反转,例如:
    welcome to China
    emoclew ot anihC
    
    思路:
    考虑使用StringBuffer类的reverse方法
    关键是如何将每个单词转换成StingBuffer对象?
    public class StringBuilderDemo2 {
    
        public static void main(String[] args) {
            String src = new String("welcome to China");
            //切分成字符串数组
            String[] words = src.split(" ");
            
            //用来装反转之后的字符串
            StringBuilder res = new StringBuilder();
            
            //遍历数组,封装成StringBuilder对象
            for(int i = 0;i<words.length;i++){
                StringBuilder sb = new StringBuilder(words[i]);
                res.append(sb.reverse()).append(" ");
            }
            
            System.out.println(res.toString().trim());
        }
    
    }
    练习

    练习2:

    public class StringBufferDemo{
        public static void main(String[] args){
            StringBuffer s1 = new StringBuffer("A");
            StringBuffer s2 = new StringBuffer("B");
            test(s1,s2);
            System.out.println(s1+","+s2);//考察 AB,B
        }
    
        public static void test(StringBuffer x,StringBuffer y){
            x.append(y);
            y = x;
            System.out.println("test:"+x+","+ y);//AB,AB
        }
    
    }
    练习

  • 相关阅读:
    多网卡ip选择
    微软编程一小时--微软2014实习生招募编程模拟测试感想
    .NET和JAVA的比较- 体系结构
    CentOS下JAVA WEB 环境搭建
    MySQL 8.0.23 安装配置向导
    uniapp map层级太高,样式支持度不高 使用nvue解决
    flex 伸缩盒子
    setInterval在浏览器切换时加速的问题
    软件包查找下载https://pkgs.org/
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/wqbin/p/11178614.html
Copyright © 2011-2022 走看看