当前位置: 首页 > article >正文

JAVA关于String字符串

String概述:

  • java.lang.String类代表字符串,Java程序中的所有字符文字(例如“abc”)都为此类的对象;
  • 字符串的内容是不会发生改变的,他的对象在创建后不能更改。
String name="永劫";

String name="无间";

在这里一共创建了两个对象;可以理解为在在堆内存中String串池中创建了一个“永劫”;然后又创建了一个“无间”;然后把”无间“填入name中;

String my="永劫";

String name="无间";

System.out.println(my+name);

这个代码会创建三个对象(在串池中)一个是“永劫”一个是“无间”一个是“永劫无间”;

创建String对象的方式:

有两种:

  1. 直接赋值,例如:String name="Darling";
  2. 通过new关键字使用不同的构造方法创建对象:
public String()  //创建空白字符串不含任何内容

public String(String original) //根据传入的字符串创建字符串对象

public String(char[] chs) //根据字符数组,创建字符串对象

public String(byte[] chs) //根据字节数组,创建字符串对象(可以理解为根据ASCLL码)
  1. public String()  //创建空白字符串不含任何内容
    //字面意思
    String s1=new String();//如果现在输出s1啥都不会输出,也就是输出空

  2. public String(String original) //根据传入的字符串创建字符串对象
    String s2=new String("永劫无间")//在这里创建s2对象的时候直接赋值“永劫无间”;所以如果打印也是“永劫无间”

  3. public String(char[] chs) //根据字符数组,创建字符串对象
    char[] chs={'a','b','c','d'};
    String s3=new String(chs);

  4.   public String(byte[] chs) //根据字节数组,创建字符串对象(可以理解为根据ASCLL码)
    byte[] bytes={97,98,99,100};
    String s4=new String(bytes);//输出会输出"abcd"

JAVA的内存模型

对于new这种通过关键字创建对象的是

对于直接赋值这种,有个串池,在里面创造对象,不过创建后不能改变

例如

public class StringDemo{
    public static void main(String[] args){
        String s1="abs";
        String s2="abc";
    }
}

  在这里直接赋值,系统会检查串池中是否存在这个值,不存在就创建新的存在的话就复用;   

 字符串的比较 :

      对于基本数据类型:        

比较的是数据值。 

int a=10;
int b=20;
System.out.println(a==b);//输出false

       对于引用数据类型:

   比较的是地址值。

String s1= new String("abc");
String s2= new String("abc");
System.out.println(s1==s2);//输出false

这个false的原因是两个都是创建的,所以的地址不一样;如果两个都是直接赋值,那么会输出true,因为串池会重复调用。

字符串比较的方法:

boolean equals方法(要比较的字符串).....{完全一样的的结果才是true,否则为false}

"=="比较基本数据类型(数据值)引用数据类型(地址值);

public class Dome{
        public static void main(String[] agrs){
        
                String s1=new String("abc");
                String s2="abc";//如果s1="Abc"就会输出false;
                System.out.println(s1==s2);//false
                boolean result1=s1.equals(s2);
                System.out.println(result1);//true
        }
}

boolean equalsIgnoreCase(要比较的字符串) .......{忽略大小写的比较}

public class Dome{
        public static void main(String[] agrs){
        
                String s1=new String("abc");
                String s2="abc";//就算s1="Abc"也会输出true;
                System.out.println(s1==s2);//false
                boolean result1=s1.equalsIgnoreCase(s2);
                System.out.println(result1);//true;
        }
}
 补充:           

在用Scanner键盘录入的时候是在堆内存创建的不是串池!       

遍历字符串统计字符串个数 :

  • public char charAt(int index);//根据索引返回字符
  • public int length();//返回字符串的长度
  • 数组的长度:数组名。length
  • 字符串长度:字符串对象。length()
    public class zjh{
    
        public static void main(String[] args){
            String s1="abcd";
            for(int i=0;i<s1.length();i++){
                    char s= s.charAt(i); //把这个字符串的第i为返回           
                    System.out.println(c);
            }
        }
    }

    字符串的拼接和反转:  

 String字符串可以加字符串生成一个新的字符串,不过不是在原来的基础上,应该是又新创建了一个字符串。

字符串反转的最简单的方法就是从最后一个遍历到第一个,然后又一个新的字符串加这个字符串的第i个元素。

StringBuilder:

概述:

可以看作是一个容器,创建之后里面的内容是可以改变的

作用:提高字符串的操作效率

public StringBuilder append(任意类型) //添加数据,并返回对象本身

public StringBuilder reverse()//反转容器中的内容从头到尾

public int length() //返回长度(字符出现的个数)

public String toString()//通过toString()就可以把StringBuilder转换成String

public String replace(a,b)//把a替换为b
subString(i)//从i开始截取,从0开始索引
StringBuilder sb=new StringBuilder();
1.sb.append(任意类型);
2.sb.reverse();
3.sb.length();
4.String bs=sb.toString();

链式编程:就是在调用一个方法的时候,不用变量接受他的结果,继续调用其它方法

StringJoiner:

概述:

和StringBuilder一样,也可以看作一个容器,创建之后里面的内容是可变的。

作用:提高字符串的操作效率,而且代码编写的特别简洁,但是很少用

public StringJoiner(间隔符号)//创建一个StringJoiner对象,指定拼接时的间隔符号
public STringJoiner(间隔符号,开始符号,结束符号)//创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号
public StringJoiner add(任意)//添加
public String toString()//返回一个字符串(该字符串就是拼接之后的结果)

                                                                                                                                                                         


http://www.kler.cn/a/595528.html

相关文章:

  • [极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)
  • SQL Server——表数据的插入、修改和删除
  • flink作业访问zk出现acl报错问题分析
  • epoll成员函数介绍
  • 蓝桥每日打卡--区间移位
  • 在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用
  • AI大白话(三):深度学习——AI的‘大脑‘是如何构建的?
  • 【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行
  • 四种事件类型
  • Blender模型旋转动画制作
  • C++异常处理时的异常类型抛出选择
  • 一文速通Python并行计算:00 并行计算的基本概念
  • 3.8、密钥管理与应用
  • Ambari湖仓集成怎么选?Hudi,Iceberg,Paimon
  • 牛贝跟卖软件Niubox如何上架产品?
  • 【高并发内存池】第三弹---构建Central Cache的全方位指南——从整体设计到核心实现
  • Word中公式自动标号带章节编号
  • QT日志级别设置
  • 1.无穷小的比较
  • fastapi+angular实现菜鸟驿站系统