首页 > 编程语言 >java------字符串

java------字符串

时间:2024-03-25 23:33:06浏览次数:15  
标签:java String s1 System 字符串 ------ println out

Java中字符串理解:

1.字符串不可变,它们的值在创建后不能被更改。

这里说的是,他们的而不是地址值

 当我们使用String s = “hello”;语句创建字符串的时候,首先会去常量池中查找,如果有,就返回这个常量的地址,如果没有,在常量池中创建并返回。world也是这样的。比如这里的“hello”,一开始是没有的,所以要先创建,然后返回一个地址,比如0x01下一次,如果String s= “hello”;的时候,s指向的也会是这个0x01的地址。

String s = "hello";  //常量池中没有常量"hello"就创建,假设地址值为0x001
String s1 = "hello"; //在常量池中查找到"hello",因此s1也指向地址0x001
System.out.println(s==s1); //地址值相同,所以返回的结果为true
System.out.println(s1.equals(s));//值相同,所以返回的结果为true
s += "world"//hello world

 s+="world"  =>"hello  world"  在常量池创建一个0x03

之前的变量s会重新指向这个新的地址0x03,而不是原先的0x01 所以说字符串一旦被创建,值就不可改变    这里的值指的字符串本身的值,而不是地址值

String s2 = new String("hello");//存放在堆中  
System.out.println(s2.equals(s));//比较值是否相同,返回为true
System.out.println(s2==s);//比较两个对象地址值,返回false

new String()会在堆内存中创建对象,而引用变量String s1则会在栈里面被创建,然后s1指向堆内存中被创建的String对象
”hello“也会在常量池中被创建,然后new String()创建的String对象会指向”hello“的地址,比如0x001,而String对象本身在堆内存中的地址,假设为0x0001,两个地址是不一样的

因此,这里的引用变量s1指向的是堆内存中String对象地址0x0001,而不是直接指向常量池中”hello“的地址0x001

 

2.字符串常量相加与变量相加的区别

  • 字符串如果是变量相加,是先开辟空间,然后再拼接
  • 字符串如果是常量相加,是先加,然后再去常量池里找,如果找到了就返回,如果找不到就创建
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";

System.out.println(s3==(s1+s2));  //false
System.out.println(s3==("hello"+"world"));  //true

s3==(s1+s2)的结果是false,是因为变量相加是先在常量池中开辟空间,然后将拼接后的字符串放入开辟的空间之中,因此地址会改变。
s3==(“hello”+“world”)的结果是true,是因为常量相加,是先拼接,然后在常量池中查找,是否有拼接后的字符串,如果有就返回这个地址值,如果没有才会创建新的空间。因为之前s3已经创建了”helloworld“字符串,所以返回的是s3指向的这个地址。因此地址相同。

String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = s1+s2;
String s5 = "helloworld";

System.out.println(System.identityHashCode(s3)); //第一行
System.out.println(System.identityHashCode(s4)); //第二行
System.out.println(System.identityHashCode(s5)); //第三行
第一行与第三行返回的值相同,说明s5优先指向的地址是s3一开始就创建的地址

3.创建字符串的四种方法

//创建字符串对象的四种方法

//public String():创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println("s1:" + s1);

//public String(char[] chs):根据字符数组的内容,来创建字符串对象
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);

//public String(byte[] bys):根据字节数组的内容,来创建字符串对象
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);

//String s = “abc”;    直接赋值的方式创建字符串对象,内容就是abc
String s4 = "abc";
System.out.println("s4:" + s4);
//显示结果
a1:abc
s2:abc

s3:abc

s4:abc

4.字符串常用的方法

String s = "abcde"

字符串的方法                                              解释说明

charAt():                               会根据索引获取对应的字符 s.charAt(i) i表示索引 length(): 会返回字符串的长度 s.length()

substring(start,end)                            截取字符串 s.substrng(0,3) a b c

substring(start)                             s.substrng(1) bcde

replace(需要替换的文字,替换成的东西)                   s.replace('a','g') gbcde

5.StringBuilder与StringBuffer、StringJoin

StringBuilder stringBuilder = new StringBuilder();
 stringBuilder.append("a").append("b").append("c");
System.out.println(stringBuilder.toString());
stringBuilder.reverse();
 System.out.println(stringBuilder.toString());

abc
cba
//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
System.out.println(str);//[aaa, bbb, ccc]

在 Java 语言中,由于 String 类是final 类型的,所以使用 String 定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。

解决方法:可以使用 StringBuffer 类(也称字符串缓冲区)来操作字符串。

说明:StringBuffer 类和 String 类最大的区别在于它的内容和长度都是可以改变的。StringBuffer 类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的 StringBuffer 对象。

1.使用StringBuffer类的构造方法初始化字符串对象 
StringBuffer 变量名=new String(字符串);
2.借助String类来创建StringBuffer类对象
String s="abc";
StringBuffer s5=new StringBuffer(s);
如果直接
StringBuffer sb = "abc";会报错

        StringBuffer s1=new StringBuffer("abcd1234!?,;");
        StringBuffer s2=new StringBuffer("987654321987654");
        StringBuffer s3=new StringBuffer("987654321");
        System.out.println("↓↓↓StringBuffer类的一些常用方法如下↓↓↓");
        System.out.println("-----------------------------------------------------");
        System.out.println("字符串s1的长度为:" + s1.length());//返回字符串的实际长度
        System.out.println("-----------------------------------------------------");
        System.out.println("字符串s1所占容器的大小为:" + s1.capacity());//返回字符串所占容器的总大小
        System.out.println("-----------------------------------------------------");
        System.out.println("获取字符串s1中第2个位置的字符:" + s1.charAt(2));
        System.out.println("-----------------------------------------------------");
        System.out.println("子字符串'654'第一次出现在字符串s2中的索引为:" + s2.indexOf("654"));
        System.out.println("从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:" + s2.indexOf("654",6));
        System.out.println("-----------------------------------------------------");
        System.out.println("子字符串'987'最后一次出现在字符串s2中的索引为:" + s2.lastIndexOf("987"));
        System.out.println("从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:" + s2.lastIndexOf("87",5));
        System.out.println("-----------------------------------------------------");
        s1.append('x');//在字符串s1的末尾添加字符'c'
        s1.append("Java");//在字符串s1的末尾添加字符串"Java"
        System.out.println("修改后的字符串s1为:" + s1);
        System.out.println("-----------------------------------------------------");
        s1.insert(4,"abcd");//在第4个位置插入字符串"abcd"
        System.out.println("修改后的字符串s1为:" + s1);
        System.out.println("-----------------------------------------------------");
        s1.deleteCharAt(1);//删除字符串s1中第一个位置的字符
        s1.delete(2,5);//删除字符串s1中第2到第4个位置的字符
        System.out.println("修改后的字符串s1为:" + s1);
        System.out.println("-----------------------------------------------------");
        s1.replace(4,8,"5678");//将字符串s1中第4到第7个位置的字符串修改为"5678"
        System.out.println("修改后的字符串s1为:" + s1);
        System.out.println("-----------------------------------------------------");
        s1.setCharAt(1,'b');//将字符串s1中第一个位置的字符修改为'b'
        System.out.println("修改后的字符串s1为:" + s1);
        System.out.println("-----------------------------------------------------");
        s2.reverse();//将字符串s2反转
        System.out.println("修改后的字符串s2为:" + s2);
        System.out.println("-----------------------------------------------------");
        System.out.println("截取字符串s1从第4个位置开始到结尾:" + s1.substring(4));
        System.out.println("-----------------------------------------------------");
        System.out.println("截取字符串s1从第4个位置开始到第7个位置结尾:" + s1.substring(4,8));
        System.out.println("-----------------------------------------------------");
        System.out.println("获取s1的变量类型:" + s1.getClass().getName());
        System.out.println("将对象信息转化为字符串:" + s2.toString());        
↓↓↓StringBuffer类的一些常用方法如下↓↓↓
-----------------------------------------------------
字符串s1的长度为:12
-----------------------------------------------------
字符串s1所占容器的大小为:28
-----------------------------------------------------
获取字符串s1中第2个位置的字符:c
-----------------------------------------------------
子字符串'654'第一次出现在字符串s2中的索引为:3
从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:12
-----------------------------------------------------
子字符串'987'最后一次出现在字符串s2中的索引为:9
从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:1
-----------------------------------------------------
修改后的字符串s1为:abcd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:abcdabcd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:accd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:accd5678!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:abcd5678!?,;xJava
-----------------------------------------------------
修改后的字符串s2为:456789123456789
-----------------------------------------------------
截取字符串s1从第4个位置开始到结尾:5678!?,;xJava
-----------------------------------------------------
截取字符串s1从第4个位置开始到第7个位置结尾:5678
-----------------------------------------------------
获取s1的变量类型:java.lang.StringBuffer
将对象信息转化为字符串:456789123456789

 

标签:java,String,s1,System,字符串,------,println,out
From: https://www.cnblogs.com/hellotoworld/p/18095535

相关文章

  • Linux - 第一节知识点
    一.ls指令ls显示当前目录下所有的文件列表alt+enter:让xshell自动全屏和取消全屏ls-a显示隐藏文件pwd显示当前命令行在进行操作时所处的目录在哪mkdir建立文件夹mkdir-p文件名/文件名一次可以建立多个目录redir文件名删除空目录rm文件名删除文件,不能删......
  • [附源码]计算机毕业设计疫情下高校学生离校系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍疫情的突发和持续影响使得高校学生离校管理面临前所未有的挑战。为了确保校园疫情防控的有效进行,同时保障学生的健康安全和合理流动,一个计算机毕业设计的疫情下......
  • Nodejs沙盒逃逸
    Buffer在较早一点的node.js版本中(8.0之前),当Buffer的构造函数传入数字时,会得到与数字长度一致的一个Buffer,并且这个Buffer是未清零的。8.0之后的版本可以通过另一个函数Buffer.allocUnsafe(size)来获得未清空的内存。注:关于BufferJavaScript语言自身只有字......
  • 学习java时候的笔记(二)
    判断和循环判断结构if语句格式1:if(关系表达式){ 语句体;}Demoimportjava.util.Scanner;publicclassIfDemo1{publicstaticvoidmain(String[]args){/*需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应*/......
  • ARP地址解析协议
    ARP协议讲解:1.地址解析协议2.作用:将IP解析为MAC地址3.ARP协议工作原理:1.ARP请求(ARPRequest):当主机需要向一个已知IP地址的设备发送数据包时,首先检查本地ARP缓存(ARPCache)看是否有该IP地址对应的MAC地址。如果没有,主机就会构造一个ARP请求广播帧,询问该IP地址对应的MAC地址......
  • 大数据分布式系统中的脑裂,你懂吗?
        脑裂就是由原来只有一个做决策的大脑突然间变成了由多个同时做决策,而这多个大脑在做决策时,因为互相之间的信息并不同步而导致的决策之间发生冲突进而让分布式系统的管理陷入到一种混乱的局面,分布式系统中引入了多个管理者同时做决策的现象就叫脑裂。    ......
  • C语言——getchar()
     //这里的代码适当修改是可以用来清理缓冲区的intmain(){ intch=0; while((ch=getchar())!=EOF) { putchar(ch); }return0;}intmain(){ //举一个例子 //假设密码是一个字符串 charpassword[20]={0}; printf("请输入密码:>"); scanf("%s......
  • 基于51单片机的空气质量检测【温湿度,PM2.5,上位机】(仿真)
    设计一个简单、实用的基于单片机的空气质量检测仪。仪器特点:①pm2.5检测功能:当空气质量高于设置最小值低于最大值时,亮黄灯提示轻度污染,当高于设定值最大值时,亮红灯通过蜂鸣器警告,同时启动风扇进行排风;②温度检测功能:当环境温度低于设定最小值时,亮红灯蜂鸣器警告,高于最大设定......
  • 基于51单片机的空调【DS18B20,LCD1602,3模式】(仿真)
    设三个按键,不同的按键对应不同的模式第一种模式空调控制温度在27°,窗帘关闭灯光关闭。第二种模式空调控制温度在25°,窗帘打开灯光部分打开。第三种模式空调控制温度在26°,窗帘打开灯光全部打开。#include"lcd1602.h"voiddelay_uint(uinti){ while(i--);}......
  • 基于51单片机的灌溉系统【温湿度,定时,水量,LCD1602】(仿真)
    自动灌溉系统1、系统分为湿度控制模式和定时模式2、湿度控制模式下,当湿度低于下限时启动水泵,高于上限时停止水泵3、定时模式下,当计时时间到达设定值时,启动水泵。水量可设置4、设置湿度上下限、加水水量#include"lcd1602.h"voiddelay_uint(uinti){ while(i--);}......