【Java基础】字符串的内存情况及应用场景

String

特点

  • 用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改String str="hello";
  • 存储在堆中的字符串常量池
  • 已经定义过的字符串,再次定义时直接使用已有的
  • 字符串String类重写了**boolean equals(object obj)**方法,重写后的功能是比较两个字符串的内容是否一致

内存情况

  • 先去堆中的字符串常量池找“hello”,没有找到则在字符串常量池中创建一个“hello”
  • 这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象,String str3=new String("hello");
class Demo9{public static void main(String[] args){
//字符串:用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改
//先去堆中的字符串常量池找"hello",没有找到则在字符串常量池中创建一个"hello"String str1="he11o";
//先去堆中的字符串常量池找"hello",找到了,直接使用己有的"hello"String str2= "hello";sop(str1==str2); //true 
//这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象String str3=new String("hello"); sop(str1==str3);//false
//字符串String类重写了boolean equals(object obj)方法,重写后的功能是比较两个字符串的内容是否一致boolean boo = str1.equals(str3);sop(boo);//true}//判断用户名密码是否正确public static boolean check(String username,String password){if(username!=null && username!="" && password!=null && password!=""){if("admin".equels(username)&&"123".equals(password))return true;}}//封装意识public static void sop(object obj){System.out.println(obj);}
}

在这里插入图片描述

字符串方法

获取

  1. 获取字符串的长度
    int length()

    int len = "owiueriouerioeur".length();
    
  2. 获取某一个位置上的字符
    char charAt(int index)

    char ch = "hello world".charAt(6);
    
  3. 获取字符在字符串中的位置
    如果要找的字符或者字符串不存在,返回值为**-1**

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

      int index = "hello world".indexOf('l');
      
    • 第二个参数用于指定开始找的位置
      int indexOf(int ch, int fromlndex)

      int index = "hello world".indexOf('l',5);
      
    • 获取一个字符串在字符串中出现的位置
      int indexOf(String str)

      int index = "hello world llo".indexOf("llo");
      
    • 第二个参数用于指定开始找的位置
      int indexOf(String str, int fromIndex)

      int index = "hello world llo".indexOf("llo",5);
      
    • 最后一次出现的位置
      int lastlndexOf(char ch)

      int index = "hello world".lastIndexOf('k');
      

验证邮箱是否合法,包含@和. ,@在.的前边

public static void main(String[] args) {boolean boo = checkEmail("xiaoer163.com");sop(boo);
}
public static boolean checkEmail(String email){
if(email!=null && email!="")if(email.indexOf('@' )==-1)return false;else if(email.indexOf(' . ' )==-1)return false;else if(email.indexOf( '@' )>email.indexOf('.'))return false;elsereturn true;
return false;
}

判断

  1. 判断是否包含一个字符串
    boolean contains (CharSequence s) CharSequence

    boolean boo = "hello world".contains("wor");
    
  2. 判断两个字符串的内容是否相同 (区分大小写)
    boolean equals(Object anObject)

    boo = "hehe".equals("haha"); 
    
  3. 忽略大小写,判断两个字符串的内容是否相同
    boolean equalsIgnoreCase(String anotherString)

    boo = "HEHE".equalsIgnoreCase("hehe");
    
  4. 判断是否以某字符串开头
    boolean startsWith(String prefix)

    boo = "javamysql".startsWith("java");
    
  5. 判断是否以某字符串结尾
    boolean endsWith(String suffix)

    boo = "dog.jpg".endsWith("jpg");
    
  6. 判断字符串是否为

    为空返回true,不为空返回false

    只要双引号中有字符,就不是空字符串

    boolean isEmpty()

    boo = " ".isEmpty();
    

转换

字符数组字符串的转换

  1. 使用构造方法
    String(char[] value)

    char[] ch={'h','e','l','l','o'};
    String str1=new String(ch);//hello
    

    String(char[] value,int offset, int count) 字符数组,开始下标,个数

    String str2=new String(ch,2,3);//llo
    
  2. 使用静态方法
    static String copyValueOf(char[] data)

    String str3 = String.copyValueOf(ch);//hello
    

    static String copyValueOf(char[] data, int offset, int count)

    String str4=String.copyValueOf(ch,2,3);//llo
    
  3. 将字符串转成字符数组
    char[] toCharArray()

    char[] arr = "hello".toCharArray();//[h, e, l, l, o]
    
  4. 将字节数组转成字符串-----解码
    String(byte[] bytes)

    String(byte[] bytes, int offset, int length)

    byte[] b={65,66,67,68,69};
    String str5 = new String(b);//使用平台默认的编码进行解码
    sop(str5);//ABCDE
    String str6 = new String(b,2,3);
    sop(str6);//CDE
    

    使用指定的编码将字节数组转换成字符串:
    String(byte[] bytes, String charsetName)

    byte[] bb={-28, -67, -96, -27, -91, -67};
    String str6=new String(bb,"UTF-8");//使用UTF-8进行解码
    sop(str);//你好
    
  5. 将字符串转成字节数组-----编码
    byte[] getBytes()

    byte[] c = "你好".getBytes(); //——使用平台默认的编码进行编码
    sop(Arrays.toString(c));//[-60, -29, -70, -61]
    byte[] cc = "你好".getBytes("UTF-8"); //——使用UTF-8进行编码
    sop(Arrays.toString(cc));//[-28, -67, -96, -27, -91, -67]
    
  6. 将基本数据类型转换成字符串
    静态方法String.valueOf()

    String ss=String.valueOf(88);//88
    

替换

生成新的字符串,原字符串并没有被修改,字符串是不能被修改的

String replace(char oldChar, char newChar )
String replace(CharSequence target, CharSequence replacement)

String str = "hello world".replace('o','k');//hellk wkrld
String ss = "hello world".replace("wor","wc");//hello wcld

子串

String substring(int beginIndex )
String substring(int beginIndex, int endIndex)
包含起始位置,不包含结束位置,到结束位置的前一位

String s="I love java";
String s1=s.substring(7);//java
String s2=s.substring(2,6);//love

转换

大小写转换
String toLowerCase()
String toUpperCase( )

String t = "abcdefg".toUpperCase();//ABCDEFG
String tt = "LMN".toLowerCase();//lmn

去除空格

将字符串两端的空格去掉
String trim()

String m="    iweurie   owieuroiwer  ".trim();
sop("["+m+"]");//[iweurie   owieuroiwer]

模拟trim方法,将字符串两端的空格去掉String trim()

class Demo3{public static void main(String[] args){String s=trim("   hello ");sop("["+s+"]");}public static String trim(String str){int start=0,end=str.length()-1;//从左边找到第一个不是空格的字符while (str.charAt(start)==' ' && start<=end)start++;//从右边找到第一个不是空格的字符while (str.charAt(end)==' ' && end>=0)end--;return str.substring(start,end+1);}public static void sop(Object obj){……}
}

比较

  • 字典顺序比较两个字符串;

  • 左边的大于右边的返回大于0的数,左边的小于右边的返回小于0的数,左边的等于右边的返回0;

  • 对应的字符一一对比(第一个和第一个比,第二个和第二个比,……),当出现第一对互不相同的字符时,哪个字符大哪个字符串就大

int compareTo(String anotherString )
int compareToIgnoreCase(String str) (不区分大小写,比较大小)

int x = "aecd".compareTo("aaa");//4
x = "abc".compareToIgnoreCase("ABC");//0

拼接

String concat(String str)

String y = "hello".concat("world");//helloworld

切割

String[] split(String str)

String str=",wang,ji,guo,chen,sun";
String[] arr = str.split(",");
for(String ss:arr)sop(ss);

静态方法

将若干个字符串拼接到一起,在拼接的时候,元素与元素之间以指定的分隔符进行分隔。
String join ( CharSequence delimiter, CharSequence… elements )

String ss = String.join(",","ding","wang","yan");

以指定的格式,进行字符串的格式化
String format ( String format, object… args )

ss = String.format("%8s%5d%.1f%8c","hello",66,88.88,'k');
//1234567812345123412345678
//   hello   6688.9       k
ss = String.format("%8s %5d %.1f %8c","hello",66,88.88,'k');
//12345678_12345_1234_12345678
//   hello    66 88.9        k
常见占位符

%s : 替代字符串 → %ns : 凑够n位字符串,如果不够,补空格
%d : 整型数字占位符 → %nd : 凑够n位,如果不够,补空格
%f : 浮点型数字占位符 → %.hf : 保留小数点后面指定位的数字
%c : 字符型占位符

字符串缓冲区

  • StringBuffer

    可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
    线程安全的,可以安全地被多个线程使用

  • StringBuilder

    不能安全使用多线程

存储

  • StringBuffer append(boolean b)

    • 默认添加在容器的末尾
    • 返回原容器
    StringBuffer stringBuffer=new StringBuffer(); //字符串缓冲区
    StringBuffer sb1 = stringBuffer.append(false);//返回原容器
    StringBuffer sb2 = stringBuffer.append(666);
    sop(stringBuffer==sb1);
    sop(stringBuffer==sb2);
    stringBuffer.append(false).append(666).append("hello");//默认添加在容器的末尾
    sop(stringBuffer);//StringBuffer重写了toString方法,返回的是容器中的字符串
    
  • StringBuffer insert(int offset, boolean b)

    • 在指定位置添加数据
    stringBuffer.insert(8,"ok");//在指定位置添加数据
    

删除

StringBuffer delete(int start, int end)
不包括结束下标上的字符,到结束下标的前一位

StringBuffer deleteCharAt(int index)

stringBuffer.delete(8,10);
stringBuffer.deleteCharAt(7);

修改

StringBuffer replace(int start, int end, String str)
不包括结束下标上的字符,到结束下标的前一位

void setCharAt(int index, char ch)

stringBuffer.replace(5,7,"88");
stringBuffer.setCharAt(6,'6');

获取

char charAt(int index)
int indexOf(String str)
int indexOf(String str, int fromIndex)

int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。

int lastIndexOf(String str, int fromIndex)
返回最后一次出现的指定子字符串在此字符串中的索引。

int length()
返回长度(字符数)。

反转

StringBuffer reverse()

练习:使用StringBuilder打印一个矩形

public static void show(int rows,int cols)
{StringBuilder stringBuilder=new StringBuilder();for(int i=1;i<=rows;i++){for(int j=1;j<=cols;j++){stringBuilder.append("*");}stringBuilder.append("\r\n");}sop(stringBuilder);
}

在这里插入图片描述

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

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

相关文章

爱丁堡大学出新招,大小语言模型配合节约成本!

在大语言模型的应用中&#xff0c;往往面临着成本和性能权衡的问题。 一方面&#xff0c;大型LLM的参数量极大&#xff08;如70B&#xff09;&#xff0c;每次调用都可能带来更多的成本&#xff0c;而小型LLM&#xff08;如7B&#xff09;的成本则更容易被接受。 另一方面&am…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2,1306310-00-8,是一种重要的多肽化合物

一、试剂信息 名称&#xff1a;DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2CAS号&#xff1a;1306310-00-8结构式&#xff1a; 二、试剂内容 DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2是一种重要的多肽化合物&#xff0c;其CAS号为1306310-00-8。该多肽包含一个DO…

ICLR 2024 杰出论文开奖了!录用率31%,两篇国内论文获荣誉提名

朋友们&#xff0c;ICLR 2024开奖了&#xff01;5月7日至11日&#xff0c;今年的大会在奥地利维也纳展览会议中心举行。 ICLR&#xff08;国际表征学习大会&#xff09;是公认的深度学习领域国际顶级会议之一&#xff0c;属于CCF A类&#xff0c;主要专注于深度学习和强化学习等…

hexo 博客插入本地图片时遇到的坑

哈喽大家好&#xff0c;我是咸鱼。 最近一直在折腾博客的事&#xff0c;说是 hexo 极易上手&#xff0c;我觉得只仅限于在安装部署的时候&#xff0c;随着对 hexo 的深入使用&#xff0c;发现遇到的问题还是挺多的。 那今天来讲一下我在把本地图片插入到 hexo 博客文章中遇到…

树莓派4b红外检测

1.红外检测连接图 2.红外检测工作原理 红外传感器的工作原理类似于物体检测传感器。该传感器包括一个红外LED和一个红外光电二极管&#xff0c;因此通过将这两者结合起来&#xff0c;可以形成一个光耦合器。 红外LED是一种发射红外辐射的发射器。该LED看起来与标准LED相似&a…

Games101-动画与模拟(求解常微分方程,刚体与流体)

Single Particle Simulation 规定了任何一个物体任何时刻的速度&#xff0c;知道它的初始位置&#xff0c;求它某个时间后的位置&#xff1f; 如果一个物体是匀速直线运动&#xff0c;用初始位置加上速度和时间的乘积即可 如上图&#xff0c;如果想描述一个粒子在一个速度场&am…

【平台开发】MTK6833——cache操作记录

CPU Cache 用的是一种叫 SRAM&#xff08;Static Random-Access Memory&#xff0c;静态随机存储器&#xff09; 的芯片。 通常分为L1&#xff0c;L2&#xff0c;L3三层缓存。 CPU 并不会直接和每一种存储器设备直接打交道&#xff0c;而是每一种存储器设备只和它相邻的存储器…

Linux---HTTP协议

HTTP HTTP协议&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在Web浏览器和Web服务器之间传输数据。 一、认识URL 平时我们俗称的 " 网址 " 其实就是说的 URL http请求样例 看起来是一行一…

ubuntu20文件安装和卸载cuda11.6

搜索cuda 11.6 nvidia&#xff0c;进入官网https://developer.nvidia.com/cuda-11-6-0-download-archive 选择linux --> runfile 用安装包安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sudo s…

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

第二代增强-采购订单抬头子屏幕增强

文章目录 第二代增强-采购订单抬头子屏幕增强需求查找增强点创建项目增强子屏幕定义全局变量编写出口函数代码激活增强运行结果查看创建的采购订单底表数据 第二代增强-采购订单抬头子屏幕增强 需求 查找增强点 创建项目 增强子屏幕 定义全局变量 *&---------------------…

读书笔记——《高质量C++/C编程指南》(2)

目录 前言 命名规则 共性规则 简单的Windows应用程序命名规则 表达式和基本语句 运算符优先级 复合表达式 if语句 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 对if 语句的补充说明 循环语句的效率 for 语句的循环控制变量 s…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

Pandas进阶

文章目录 第1关&#xff1a;Pandas 分组聚合第2关&#xff1a;Pandas 创建透视表和交叉表 第1关&#xff1a;Pandas 分组聚合 编程要求 使用 Pandas 中的 read_csv() 函数读取 step1/drinks.csv 中的数据&#xff0c;数据的列名如下表所示&#xff0c;请根据 continent 分组并…

MySQL-ELK基础

1&#xff1a;什么是 ELK ELK是由一家elastic公司开发的三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能&#xff0c;之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack Elastic S…

【JavaScript】内置对象 - Date 日期对象 ④ ( 制作倒计时页面 )

文章目录 一、倒计时页面实现1、需求分析2、计算秒数3、计算倒计时时间的 天 / 时 / 分 / 秒4、页面中显示倒计时时间 二、完整代码示例1、完整代码2、执行结果 Date 日期对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Da…

速卖通商品评论API(aliexpress.item_review)返回值全解析

在电商领域&#xff0c;用户评论对于产品的推广和销售具有极其重要的影响。速卖通&#xff08;AliExpress&#xff09;作为全球知名的跨境电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中aliexpress.item_review API允许开发者获取商品的评论信息。本文将…

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析

品质为王&#xff1a;高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析 在当今的健康产品市场中&#xff0c;高效溶解性鱼油胶囊以其独特的营养价值和吸收效率赢得了众多消费者的青睐。然而&#xff0c;要想在激烈的市场竞争中脱颖而出&#xff0c;产品的品质保证至关重要。其中&a…

深入理解WPF的ResourceDictionary

深入理解WPF的ResourceDictionary 介绍 在WPF中&#xff0c;ResourceDictionary用于集中管理和共享资源&#xff08;如样式、模板、颜色等&#xff09;&#xff0c;从而实现资源的重用和统一管理。本文详细介绍了ResourceDictionary的定义、使用和合并方法。 定义和用法 Res…