String类知识

目录

一、String存在意义

二、字符串为何不可变

三、String类常用方法

        1、字符串构造

        2、String对象的比较

        3、字符串查找

        4、转化

        (1)数值和字符转化

        (2)大小写转换

        (3)字符串转数组

        (4)格式化

        5、字符串替换

        6、字符串拆分

        7、字符串截取

        8、字符串修改

        9、其他操作方法

四、StringBuilder和StringBuffer的使用和方法介绍

五、StringBuilder和StringBuffer的不同


一、String存在意义

        在c语言中我们以及接触到了字符串,但是表示字符串的方式只能是使用字符数组或者是字符指针,而Java面向对象很多时候离不开字符串,为了更好的实现面向对象的思想,Java提供了String类,这就是String类存在的意义

二、字符串为何不可变

        我们去写一个String类的时候,我们发现String类里面的内容不能直接被修改,为什么不能修改呢,我们先打开一下String类里面的构造:

         第一个final是不能被继承我们理解,那么第二个为啥不是字符串被修改的主要原因呢,上代码:

  public static void main(String[] args) {
        final char[] str={'1','2','3'};
        str[0]='4';
        System.out.println(str);
    }

        打印出来的结果是:

        为何会这样呢?主要得益于final修饰的一般是地址不能变,而修改数组里面的东西,地址是不会变化的,所以就算被fianl修饰,char[]里面的内容还是可以被修改。 而private私有化封装才是字符串不能被修改的本质原因。

三、String类常用方法

        1、字符串构造

         对于字符串的构造,常用的就三种构造方法——常量串构造,使用newString对象构造,使用字符数组构造,用代码来写如下:

 public static void main(String[] args) {
        //使用常量串构造
        String s1="wqe";
        //使用newString对象
        String s2=new String("wqer");
        //使用字符数组进行构造
        char[] str={'w','q','e'};
        String s3=new String(s2);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }

        打印结果如下:

        String类还提供了很多中字符串构造方法,而常用的就这三种

        2、String对象的比较

        一共有三种比较,第一种是==,第二种是equals方法比较,第三种是compareTo方法比较;

        对于==符号比较,比较的就是地址,equals方法比较的是里面的值是否相等,而且还是boolean类型,而compareTo方法是按顺序比较里面的字符串,相等则继续比较下一个,不相等则返回差值,值得注意的是,compareTo方法是按照ASC码里面的值进行比较,而对于相同的长度的字符串,返回-1或者1(根据前后俩个字符串哪个更长,前者减去后者)。  


public static void main(String[] args) {
        String q1="abc";
        String q2="abcA";
        String q3="abZ";
        String q4="abc";
        String q5=q1;
        //==比较地址
        System.out.println(q1 == q5);
        System.out.println(q1 == q3);
        System.out.println(q1 == q2);
        System.out.println("===========");
        //equals方法比较值
        System.out.println(q1.equals(q5));
        System.out.println(q1.equals(q3));
        System.out.println(q1.equals(q2));
        //compareTo桉顺序比较,不同返回差值,如果字符串长度不一样,而返回-1或者1
        System.out.println("===========");
        System.out.println(q1.compareTo(q4));
        System.out.println(q2.compareTo(q1));
        System.out.println(q1.compareTo(q3));
}

        而打印出来的结果是:

         总的来说,String类的比较方式还是挺常用的,可以根据自己需要去做出不同的比较方式。

        3、字符串查找

        字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法,如下图:

        

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int index(int ch,int fromIndex)从fromindex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str)返回str第一次出现的位置,没有返回-1
'int indexOf(String str,int fromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch,int fromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str,int fromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1

        

 public static void main(String[] args) {
        String s="abcabcabcqwertyuiopz";
        System.out.println(s.charAt(3));//a
        System.out.println(s.indexOf('a'));//0
        System.out.println(s.indexOf('a', 3));//3
        System.out.println(s.indexOf("cab"));//2
        System.out.println(s.indexOf("cab", 5));//5
        System.out.println(s.lastIndexOf(3));//-1(没有找到)
        System.out.println(s.lastIndexOf("a", 10));//6
        System.out.println(s.lastIndexOf("cabc"));//5
        System.out.println(s.lastIndexOf("cabc",7));//5
    }

        主要查找的方法就是这些,索引,向前往后查找和从后往前查找,查找字符串或者字符,第二个参数就是从第几个开始查找。

        4、转化

        (1)数值和字符转化

        数值和字符转化可以分为数值转化为字符串,也可以是字符串转化为数值,以代码为例:

        

  public static void main(String[] args) {
        //数字转字符串(通过String.valueOf)
        String s1=String.valueOf(1234);
        String s2=String.valueOf(12.34);
        String s3=String.valueOf(true);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println("============");
        int data1=Integer.parseInt("1234");
        int data2=Integer.parseInt("12534");
        System.out.println(data1);
        System.out.println(data2);
    }

        打印结果如下:

        .value()是转换为字符串的用法,而包装类.转换类型()是字符串转换为数值的方法。

        (2)大小写转换

        大小写转化主要用到了toUpperCasetoLowerCase的方法,toUpperCase()是将小写转换为大写的方法,toLowerCase()是将大写转换为小写的方法,如下:

        

 public static void main(String[] args) {
        String q1="qwe";
        String q2="QWE";
        System.out.println(q1.toUpperCase());
        System.out.println(q1.toLowerCase());
    }

        打印结果为:

 

        (3)字符串转数组

        字符串转为数组使用到toCharArray()方法,,然后数组转换为字符串也可以用到new String()方法,代码如下:

        

 public static void main(String[] args) {
        String w1="qwerty";
        //字符串转数组
        char[] ch= w1.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.println(ch[i]);
        }
        System.out.println();
        //数组转字符串
        String s2=new String(ch);
        System.out.println(s2);
    }

        打印结果如下:

        (4)格式化

        格式化方法用到format方法,代码如下:

        

  public static void main(String[] args) {
        String e1=String.format("%d-%d-%d",2019,9,14);
        System.out.println(e1);
    }

         

        格式化主要是按照里面的格式打印,对于设置日期这些有很大帮助。

四、StringBuilder和StringBuffer的使用和方法介绍

        StringBuilder和StringBuffer的使用需要创建对象,不像String类那样可以直接String s="q",

需要new一个对象,代码如下:

 public static void main(String[] args) {
        //StringBuffer sbd="qwe";//会报错
        StringBuilder sbd=new StringBuilder("wqwq");
        StringBuffer sbf=new StringBuffer("asd");

        System.out.println(sbd);
        System.out.println(sbf);
    }

        打印出来结果是:

        

        那么它们有什么不同呢?方法上有很大不同,我列出一个表格:

方法说明
StringBuff append(String str)在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
char charAt(int index)获取index位置的字符
int length()获取字符串的长度
int capacity()获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)扩容
void setCharAt(int index,char ch)将index位置的字符设置为ch
int indexOf(String str)返回str第一次出现的位置
int indexOf(String str,int fromIndex)从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str)返回最后一次出现str的位置
int lastIndexOf(String str,int fromIndex)从fromIndex位置开始找str最后一次出现的位置
StringBuffer insert(int offset,String str)

在offset位置插入:八种基本类型&String类型&

Object类型数据

StringBufferdeleteCharAt(int index)删除index位置字符
StringBuffer delete(int start, int end)删除[start,end)区间内的字符
 StringBuffer replace(int start, int end, String str)将[start,end)位置的字符替换为str
tring substring(int start)从start开始一直到末尾的字符以String的方式返回
String substring(int start, int end)将[start,end)将[start,end)范围内的字符以String的方式返回
StringBuffer reverse()反转字符串
ring toString()将所有字符按照String的方式返回

五、StringBuilder和StringBuffer的不同

        StringBuilder更适合于单线程,StringBuffer更适合多线程,为什么呢,我们打开这俩个的里面内容来看:

        这个是StringBuffer的,它的里面有锁,更适合多线程,而StringBuilder里面是没有锁的,更适合单线程,但速度更快。

 

 

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的string是一个非常常用的字符串,其实现原理比较复杂,需要涉及到动态内存分配、指针、操作符重载等多个知识点。下面是一个简单的string实现: ```c++ class String { private: char* data; // 存储字符串的字符数组 int length; // 字符串的长度 public: String(); // 默认构造函数 String(const char* str); // 带参数构造函数 String(const String& str); // 复制构造函数 ~String(); // 析构函数 int size() const; // 获取字符串长度 char& operator[](int index); // 重载下标操作符 const char& operator[](int index) const; // 重载下标操作符(常量版本) String& operator=(const char* str); // 重载赋值操作符 String& operator=(const String& str); // 重载赋值操作符 String operator+(const char* str) const; // 重载加法操作符 String operator+(const String& str) const; // 重载加法操作符 bool operator==(const char* str) const; // 重载等于操作符 bool operator==(const String& str) const; // 重载等于操作符 friend ostream& operator<<(ostream& os, const String& str); // 重载输出流操作符 }; String::String() { data = new char[1]; data[0] = '\0'; length = 0; } String::String(const char* str) { if (str == nullptr) { data = new char[1]; data[0] = '\0'; length = 0; } else { length = strlen(str); data = new char[length + 1]; strcpy(data, str); } } String::String(const String& str) { length = str.length; data = new char[length + 1]; strcpy(data, str.data); } String::~String() { delete[] data; } int String::size() const { return length; } char& String::operator[](int index) { return data[index]; } const char& String::operator[](int index) const { return data[index]; } String& String::operator=(const char* str) { if (data != str) { delete[] data; if (str == nullptr) { data = new char[1]; data[0] = '\0'; length = 0; } else { length = strlen(str); data = new char[length + 1]; strcpy(data, str); } } return *this; } String& String::operator=(const String& str) { if (&str != this) { delete[] data; length = str.length; data = new char[length + 1]; strcpy(data, str.data); } return *this; } String String::operator+(const char* str) const { String newStr; newStr.length = length + strlen(str); newStr.data = new char[newStr.length + 1]; strcpy(newStr.data, data); strcat(newStr.data, str); return newStr; } String String::operator+(const String& str) const { String newStr; newStr.length = length + str.length; newStr.data = new char[newStr.length + 1]; strcpy(newStr.data, data); strcat(newStr.data, str.data); return newStr; } bool String::operator==(const char* str) const { if (strcmp(data, str) == 0) { return true; } else { return false; } } bool String::operator==(const String& str) const { if (strcmp(data, str.data) == 0) { return true; } else { return false; } } ostream& operator<<(ostream& os, const String& str) { os << str.data; return os; } ``` 上述实现中,我们使用了动态内存分配来存储字符串的字符数组,同时重载了常用的操作符,如赋值操作符、加法操作符、等于操作符和输出流操作符等。需要注意的是,在使用重载操作符时,我们需要保证其语义与原始操作符一致,这样才能保证程序的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值