Java初阶 ( String 类)

news/2024/5/4 9:34:07/文章来源:https://blog.csdn.net/wuweixiaoyue/article/details/129967268

文章目录

  • 一、String 类的基础概念
    • 1.1 Java 中的字符串
    • 1.2 字符串的构造
  • 二、String 类的进阶概念
    • 2.1 求字符串的长度
    • 2.2 isEmpty()
    • 2.3 字符串的比较
    • 2.4 字符串的查找
    • 2.5 字符串的转换
    • 2.6 字符串的替换
    • 2.6 字符串的拆分
    • 2.7 字符串的截取
    • 2.8 去掉字符串的左右空白字符
    • 2.9 StringBuilder和StringBuffer
  • 三、字符串的不可修改性
    • 3.1 原因
    • 3.2 字符串的修改

一、String 类的基础概念

1.1 Java 中的字符串

Java 中的字符串,其实是一个类
在这里插入图片描述

  • final 表示这个 String类 无法被继承
  • String 类关联了 java.io.Serializable, Comparable, CharSequence 这三个接口
  • String是引用类型,内部并不存储字符串本身
    • String 中的成员变量是 char value[ ] 和 hash
  • 在Java中“”引起来的也是String类型对象
// 打印"hello"字符串(String对象)的长度
System.out.println("hello".length());

1.2 字符串的构造

public class Test {public static void main(String[] args) {String name = "hello";System.out.println(name);    //和下面那个相比,只是省略了一些标识符而已,意义一样String name1 = new String("world");System.out.println(name1);char[] ch = {'a','b','c','d'};String name2 = new String(ch);System.out.println(name2);}
}

在这里插入图片描述
在这里插入图片描述

二、String 类的进阶概念

由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串

2.1 求字符串的长度

Java 当中,没有说过字符串是以 ‘\0’ 结尾的

public class Test {public static void main(String[] args) {String name = "hello";System.out.println(name.length());}
}

在这里插入图片描述

2.2 isEmpty()

public class Test {public static void main(String[] args) {String str4 = "";      //指向的对象中没有任何数据System.out.println(str4.isEmpty());    //如果里面没有数据就返回true,否则返回falseString str5 = null;       //代表不指向任何对象System.out.println(str5.isEmpty());    //空指针异常}
}

在这里插入图片描述

2.3 字符串的比较

  • 比较是否引用同一个对象
    注意:对于内置类型, == 比较的是变量中的值;对于引用类型==比较的是引用中的地址。
  • boolean equals(Object anObject)方法:按照字典序比较
    字典序:字符大小的顺序
  • int compareTo(String s) 方法: 按照字典序进行比较
    与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
    1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
    2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
  • int compareToIgnoreCase(String str)
    方法:与compareTo方式相同,但是忽略大小写比较
public class Test{public static void main(String[] args) {String str1 = new String("hello");String str2 = new String("hello");System.out.println(str1 == str2);System.out.println(str1.equals(str2));    //String 里面自己重写了equals方法System.out.println("=========");String str3 = "abc";String str4 = "abc";System.out.println(str3 == str4);System.out.println("====");String str5 = "abcd";     //直接赋值,且存放的值是一样的情况下,会被认为指向的是同一块空间String str6 = "abCd";System.out.println(str5.compareTo(str6));    System.out.println(str5.compareToIgnoreCase(str6));}
}

在这里插入图片描述

2.4 字符串的查找

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越界,抛出 IndexOutOfBoundsException异常
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int indexOf(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

2.5 字符串的转换

  • 数值和字符串转换
class Student {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}
}public class Test {public static void main(String[] args) {// 数字转字符串String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);String s3 = String.valueOf(true);String s4 = String.valueOf(new Student("Hanmeimei", 18));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);System.out.println("=================================");// 字符串转数字// 注意:Integer、Double等是Java中的包装类型,这个后面会讲到int data1 = Integer.parseInt("1234");int data2 = Integer.valueOf("1234");double data3 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);System.out.println(data3);}
}

在这里插入图片描述

  • 大小写转换
public class Test {public static void main(String[] args) {String s1 = "hello";String s2 = "HELLO";// 小写转大写System.out.println(s1.toUpperCase());// 大写转小写System.out.println(s2.toLowerCase());}
}

在这里插入图片描述

  • 字符串转数组
public class Test {public static void main(String[] args) {String s = "hello";// 字符串转数组char[] ch = s.toCharArray();for (int i = 0; i < ch.length; i++) {System.out.print(ch[i]);}System.out.println();// 数组转字符串String s2 = new String(ch);System.out.println(s2);}
}
  • 格式化
public class Test {public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s);}
}

2.6 字符串的替换

方法功能
String replaceAll(String regex, String replacement) 把所有的regex都替换为replacement
String replaceFirst(String regex, String replacement) 把首个出现的regex替换为replacement

2.6 字符串的拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

方法功能
String[] split(String regex) 将字符串根据regex全部拆分
String[] split(String regex, int limit)将字符串根据regex,拆分为limit组
  • 注意事项:
    • 字符"|“,”*“,”+“,”."都得加上转义字符,前面加上 “\” .
      • 理解:一个 ‘.’ 需要一个’\’ 进行转义,但是要识别一个’\',需要两个\\
    • 而如果是 “\” ,那么就得写成 “\\” .
public class Test {public static void main(String[] args) {String str2 = "192\\168\\0\\0\\1";     //用两个\\表示一个\String[] ret2 = str2.split("\\\\");   //表示的是\\for (int i = 0; i < ret2.length; i++) {System.out.println(ret2[i]);}}
}
  • 如果一个字符串中有多个分隔符,可以用"|"作为连字符
public class Test {public static void main(String[] args) {String str2 = "name=zhangsan&age=18";String[] ret2 = str2.split("=|&");for (int i = 0; i < ret2.length; i++) {System.out.println(ret2[i]);}}
}

在这里插入图片描述

  • 多次拆分
public class Test {public static void main(String[] args) {String str2 = "name=zhangsan&age=18";String[] ret2 = str2.split("&");for (int i = 0; i < ret2.length; i++) {String[] strings = ret2[i].split("=");for (String s : strings) {System.out.println(s);}}}
}

在这里插入图片描述

2.7 字符串的截取

方法功能
String substring(int beginIndex)截取指定位置开始的剩余字符串
String substring(int beginIndex, int endIndex)截取[beginIndex,endIndex)内容

2.8 去掉字符串的左右空白字符

String trim()
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).

public class Test {public static void main(String[] args) {String str = "   hell  oo  p   0   pppp";System.out.println(str.trim());System.out.println(str);    //是产生一个新的字符串,并没有在原字符串的基础上,进行修改}
}

在这里插入图片描述

2.9 StringBuilder和StringBuffer

  • String、StringBuffer、StringBuilder的区别
    • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
    • StringBuffer与StringBuilder大部分功能是相似的
    • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

在这里插入图片描述

  • String和StringBuilder类的转换
    • String和StringBuilder类不能直接转换
    • 下面是依靠方法进行转换的方法
public class Main {public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder();     //String变为StringBuilder: 利用StringBuilder的构造方法或append()方法stringBuilder.append("12");System.out.println(stringBuilder);String ret = stringBuilder.toString();   //StringBuilder变为String: 调用toString()方法System.out.println(ret);}
}
方法功能
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第一次出现的位置
StringBuff insert(int offset, String str)在offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index)删除index位置字符
StringBuffer delete(int start, int end)删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str)将[start, end)位置的字符替换为str
String substring(int start)从start开始一直到末尾的字符以String的方式返回
String substring(int start,int end)将[start, end)范围内的字符以String的方式返回
StringBuffer reverse()反转字符串
String toString()将所有字符按照String的方式返回

三、字符串的不可修改性

3.1 原因

String是一种不可变对象. 字符串中的内容是不可改变,这个原因取决于String的内部定义

在这里插入图片描述

  • String类中的字符实际保存在内部维护的value字符数组中
  • final 表示不能修改这个引用的指向,且该类不能被继承
  • String类并没有提供一个get()方法,或者set()方法,来访问这个字符串,所以这个内容是不可以被修改的

3.2 字符串的修改

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下
在这里插入图片描述

  • 总结
    • 待在对String类进行修改时,效率是非常慢的,会创建多个对象,所以不建议在循环里进行拼接
    • 如果要修改,尽量使用StringBuilder和StringBuffer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_282517.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode.226 翻转二叉树

题目链接 Leetcode.226 翻转二叉树 easy 题目描述 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;r…

C++对象模型与this指针

一、成员变量与成员函数分开存储 1、在C中&#xff0c;类内的成员变量和成员函数分开存储 首先&#xff0c;对于一个空对象&#xff0c;占用内存空间为1 class person {};void test01() {person p;cout << sizeof(p) << endl; } 因为C编译器给每个空对象分配1个字…

【juc】wait和notify原理

目录一、monitor锁结构图二、说明一、monitor锁结构图 二、说明 1.线程1一开始持有对象A的monitor锁&#xff0c;即monitor中的owner指向线程1 2.线程1在执行的过程中发现条件a不满足执行不下去了&#xff0c;此时线程1可以调用wait方法&#xff0c;那么线程1就进入waitset进行…

【RabbitMQ高级篇】消息可靠性问题(1)

目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…

.net C#反编译及脱壳常用工具--小结

1、Reflector --微软自家工具--推荐 Reflector是最为流行的.Net反编译工具。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使NET程序员眼前豁然开朗&#xff0c;因为这个免费工具可以将NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转…

五、页面切割技术,实现工作台

页面切割技术 1.<frameset>和<frame> <frameset>:用来切割页面 <frameset cols"20%,60%,20%"> 竖着把窗口切三部分 <frameset rows"20%,60%,20%"> 横着把窗口切三部分 <frame>&#xff1a;用来显示页面 <frame …

三星公司因ChatGPT造成数据泄露?

作者丨黑蛋 ChatGPT大家最近应该都听过很多&#xff0c;关于各种ChatGPT消息铺天盖地&#xff0c;将会取代大部分人工&#xff0c;ChatGPT代替创作&#xff0c;绘画&#xff0c;很多公司因此裁员等消息多不胜数&#xff0c;甚至短短几个月&#xff0c;ChatGPT升级版ChatGPT4就…

无需服务器免费上线你的静态网页

无需服务器免费上线你的静态网页:https://s.qiniu.com/bmaYJf

Keil 5 安装教程及简单使用【嵌入式系统】

Keil 5 安装教程【嵌入式系统】前言推荐说明keil5安装教程第一阶段&#xff1a;安装mdk第二阶段&#xff1a;激活mdk第三阶段&#xff1a;安装STM32芯片包第四阶段&#xff1a;安装C51单片机第五阶段&#xff1a;激活C51单片机keil 5的简单使用1建立新工程2创建新文件3.生成HEX…

华硕 ASUS-PRIME-B560M-A Intel Core i5-11400黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板ASUS-PRIME-B560M-A 处理器Intel Core i5-11400已驱动 内存16GB DDR4 3200 Mhz已驱动 硬盘Western Digital Black SN750 500GB已驱动 显卡SAPPH…

社区团购是什么?打破传统消费模式的新选择

社区团购作为一种新兴的消费模式&#xff0c;已经成为了越来越多人的选择。在社区团购中&#xff0c;商家可以通过团购的方式向消费者提供优惠的价格和服务&#xff0c;同时也可以借助社区团购来扩大销售渠道和提高品牌知名度。本文将以一家小型便利店的社区团购为例&#xff0…

艾瑞巴蒂看过来!OSSChat 上线:融合 CVP,试用通道已开放

还在纠结于反复查找开源项目的技术文档&#xff1f; 团队常因频繁搜索开源项目主页导致效率低下&#xff1f; 每天都要问一遍【开源项目中那些“小白问题”究竟有没有更快的解决方法&#xff1f;】 对此&#xff0c;只想对你说&#xff1a;赶紧试试 OSSChat&#xff01;赶紧试…

灵动MM32 MindSPIN系列MCU —— 无刷电机驱动的得力伙伴

无论是在工业应用&#xff0c;还是智能家居和物联网应用上&#xff0c;提高效率和节能减碳一直为其主轴诉求&#xff0c;而有着兼顾于高效与节能特色的直流无刷电机&#xff0c;正是符合此应用的主流。 灵动微电子MindSPIN系列MCU产品就是针对直流无刷电机驱动所量身打造的。由…

Leetcode.112 路径总和

题目链接 Leetcode.112 路径总和 easy 题目描述 给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum。如果存在&#xff0c;返回 true&#xff1b;否则&#xf…

自学编程的5大误区,早知道早避坑,过来人的宝贵经验

前言 有的人自学很快&#xff0c;几乎一个多月就能掌握一门技术&#xff0c;而有的人苦苦坚持&#xff0c;最后还是半途而废&#xff0c;很大的原因就在于在学习的时候掉进了一些误区没能走出来。 今天我们就来讲讲自学编程常见的5大误区&#xff0c;避开这些误区我们定能在自…

美团全国各配送站机房配备深圳钡铼技术工业物联网监测终端S270,实现远程数据监测

美团集团与钡铼技术&#xff0c;日前签约美团旗下全国各配送站机房监测项目。深圳钡铼技术为美团每家配送站机房配备工业物联网数据监测终端S270&#xff0c;接入美团系统&#xff0c;助力美团集团实现物联网升级。实现远程采集仓库机房水浸、温湿度、烟感、停电报警等数据&…

“成年人”的数据库,既要又要也要!

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c;《明说三人行》访谈栏目创始人兼主持人卢东明、沃趣科技创始人兼 CEO 陈栋、DBAplus 社群联合创始人杨建荣、PostgreSQL…

强化学习——初探强化学习

本文引自&#xff1a;《 动手学强化学习 》 第 1 章 初探强化学习 1.1 简介 亲爱的读者&#xff0c;欢迎来到强化学习的世界。初探强化学习&#xff0c;你是否充满了好奇和期待呢&#xff1f;我们想说&#xff0c;首先感谢你的选择&#xff0c;学习本书不仅能够帮助你理解强…

MATLAB插值函数interp1

MATLAB插值函数interp1 参考链接&#xff1a;interp1 插值法又称“内插法”&#xff0c;是利用函数f (x)在某区间中已知的若干点的函数值&#xff0c;作出适当的特定函数&#xff0c;在区间的其他点上用这特定函数的值作为函数f (x)的近似值&#xff0c;这种方法称为插值法。…

【C语言】浮点数和0比较

文章目录一. 浮点数存储时是有精度损失的二. 浮点数不能直接进行 比较三. 使用精度来比较两个浮点数是否相等四. 浮点数和0比较一. 浮点数存储时是有精度损失的 下面程序中我们打印一个浮点数的值 int main() {double d 3.6;printf("%.50f\n", d);return 0; }观察…