一文带你认识java中的String类

 更新时间:2021年10月9日 12:00  点击:1772

什么是字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。其在java语言中可以通过一定的方法提取字符串中的一个字符

字符串常见的赋值方法

直接赋值法

String 变量名=" 初始值"

这种赋值方法经常被我们使用

 public static void main(String[] args) {
        String str1="hello world";
        System.out.println(str1);
    }

构造方法进行创建

格式:

String 变量名=new String(初始值)

public static void main(String[] args) {
        String str2=new String("SWPU YYDS");
        System.out.println(str2);
    }

注意:初始值不只局限于常量字符串,也可以是数组

比如字符数组:

public static void main(String[] args) {
        char ch[]={'S','W','P','U'};
        String str3=new String(ch);
        System.out.println(str3);
    }

又如字节数组:

public static void main(String[] args) {
        byte a[]={94,95,94};
        String str3=new String(a);
        System.out.println(str3);
    }

此外也可以通过这种构造方式把字符数组或者字节数组部分元素转换为字符串

public static void main(String[] args) {
        char ch[]={'a','b','c','d','e','f'};
        String str4=new String(ch,1,3);//1这个位置是字符串的开始位置,3为字符串的长度
        System.out.println(str4);
    }

字符串的比较相等

在int变量中判断两个int变量被赋予的值是否相等使用“==”便可以判断

 public static void main(String[] args) {
        int a=520;
        int b=520;
        System.out.println("a==b:"+(a==b));
    }

那么有人就会认为字符串的比较也可以用“==”进行比较

如图:

public static void main(String[] args) {
        String str5="abcdef";
        String str6="abcdef";
        System.out.println("str5和str6是否相等"+(str5==str6));
    }


那么字符串是不是就依靠“==”进行判断的呢?其结果显然是

就如这个代码:

public static void main(String[] args) {
        String str8="abcdef";
        String str7=new String("abcdef");
        System.out.println("str7和str8是否相等"+(str7==str8));
    }

 public static void main(String[] args) {
        String str8=new String("abcdef");
        String str7=new String("abcdef");
        System.out.println("str7和str8是否相等"+(str7==str8));
    }

为什么使用"=="会出现这种情况呢?

实际上String 使用 == 比较并不是在比较字符串内容, 而是比较两个引用是否是指向同一个对象

就比如:这里有两个篮子分别为A,B;分别里面放相同的5个苹果,将这两个篮子看做两个不同的类A和类B,而这个比较的便是类是否相同,而不是比较类里面的内容是否相同。

为了比较字符串内容是否相等那么我们就得使用String类提供的equals方法

public static void main(String[] args) {
        String str8="abcdef";
        String str7=new String("abcdef");
        System.out.println("str7和str8是否相等"+(str7.equals(str8)));
    }

public static void main(String[] args) {
        String str8=new String("abcdef");
        String str7=new String("abcdef");
        System.out.println("str7和str8是否相等"+(str7.equals(str8)));
    }

字符串常量池

在上面所讲的字符串赋值操作中

直接赋值为什么使用“==”进行比较有的就是true而有的就是false呢?

实际上当我们采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到字符串常量池之中,并且如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。

public static void main5(String[] args) {
        String str5="abcdef";
        String str6="abcdef";
        System.out.println("str5和str6是否相等"+(str5==str6));
    }

而我们使用构造方法时,首先String类的对象实例化操作时,先在字符常量池中寻找是否有字符串内容,如果有就不需要在放入字符串常量池中,其次在堆上开辟一个内存空间,该空间指向字符串常量池上的内容,而栈上的对象指向新开辟的内存空间

public static void main6(String[] args) {
        String str8="abcdef";
        String str7=new String("abcdef");
        System.out.println("str7和str8是否相等"+(str7==str8));
    }

注意:在采用直接赋值时,只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。在采用构造方法时会开辟两块堆内存空间,不会自动保存在对象池中,可以使用intern()方法手工池。

字符串常量池的实例

为了更好了解字符串常量池这里有几个实例可以加以练习

实例一

public static void main(String[] args) {
        String str1="abcdef";
        String str2="abc"+"def";
        System.out.println(str1==str2);
    }


2. 实例二

 public static void main(String[] args) {
        String str1="abcdef";
        String str2="abc";
        String str3=str2+"def";
        System.out.println(str1==str3);
    }

注意str2是变量,在编译的时候无法知道里面的值是什么,只有运行到时才知道

3. 实例三

public static void main(String[] args) {
        String str1="abcdef";
        String str2="abc"+new String("def");
        System.out.println(str1==str2);
    }


4. 实例四

public static void main(String[] args) {
        String str1="abcdef";
        String str2=new String("abc")+new String("def");
        System.out.println(str1==str2);
    }

5. 实例五

public static void main(String[] args) {
        String str1="abc";
        String str2=str1;
        str1="def";
        System.out.println(str1==str2);
    }

字符串的不可变

字符串是一种不可变对象. 它的内容不可改变.

String 类的内部实现也是基于 char[] 来实现的, 但是 String 类并没有提供 set 方法之类的来修改内部的字符数组.

如代码:

public static void main(String[] args) {
        String str = "hello" ;
        str = str + " world" ;
        str += "!!!" ;
        System.out.println(str);
    }

结果看似简单其实底层进行了许多操作

第一步:

第二步:

第三步:

那么如果我们需要修改字符串, 例如, 现有字符串 str = “Hello” , 想改成 str = “hello” , 该怎么办?

最简单的方法是:借助原字符串,创建新的字符串

public static void main(String[] args) {
        String str = "Hello";
        str = "h" + str.substring(1);
        System.out.println(str);
    }

为什么String为不可变?

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了。
  2. 不可变对象是线程安全的。
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中。

字符串的常见操作

字符串的比较

equals方法

该方法比较字符串的内容并区分字符的大小关系

public static void main(String[] args) {
        String str="Hello";
        String str1="hello";
        System.out.println(str.equals(str1));
    }

equalsIgnoreCase方法

该方法比较字符串的内容但不区分字符的大小关系

public static void main(String[] args) {
        String str="Hello";
        String str1="hello";
        System.out.println(str.equalsIgnoreCase(str1));
    }

compareTo方法

在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:如果相等则返回0;如果小于比较的字符串则返回小于0;相反则返回大于0的值;

 public static void main(String[] args) {
        String str1="Hello";
        String str2="hello";
        System.out.println(str1.compareTo(str2));
    }

public static void main(String[] args) {
        String str2="Hello";
        String str1="hello";
        System.out.println(str1.compareTo(str2));
    }

 public static void main(String[] args) {
        String str2="hello";
        String str1="hello";
        System.out.println(str1.compareTo(str2));
    }

字符串的查找

contains()方法

该方法可以判断该字符串是否有子串有则返回true;没有就返回false;

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="xass";
        System.out.println(str1.contains(str2));
    }

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="acbaskj";
        System.out.println(str1.contains(str2));
    }

indexOf()方法

该方法使字符串从头开始查找需要查找字符串的位置,查到了就返回位置的开始索引,如果没有检查到则返回-1。

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askj";
        System.out.println(str1.indexOf(str2));
    }

 public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askjsass";
        System.out.println(str1.indexOf(str2));
    }

lastIndexOf(String str)方法

由后向前查找子字符串

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askj";
        System.out.println(str1.lastIndexOf(str2));
    }

lastIndexOf(String str,int fromIndex)方法

从指定位置由后向前查找。

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askj";
        System.out.println(str1.lastIndexOf(str2,1));
    }

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askj";
        System.out.println(str1.lastIndexOf(str2,13));
    }

startsWith(String prefix)

判断是否以指定的字符串开头是则返回true不是则返回false

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="askj";
        System.out.println(str1.startsWith(str2));
    }

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="ac";
        System.out.println(str1.startsWith(str2));
    }

startsWith(String prefix,int toffset)

从指定位置开始判断是否以指定字符串开头

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="bask";
        System.out.println(str1.startsWith(str2,2));
    }

endsWith(String suffix)

判断是否以指定字符串结尾

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="bask";
        System.out.println(str1.endsWith(str2));
    }

public static void main(String[] args) {
        String str1="acbaskjcbaskd";
        String str2="skd";
        System.out.println(str1.endsWith(str2));
    }

字符串替换

replaceAll(String regx,String replacement)

替换字符串中所有指定的内容

public static void main(String[] args) {
        String str = "helloworld" ;
        System.out.println(str.replaceAll("l", "_"));
    }

replaceFirst(String regx,String replacement)

替换字符串中第一个指定的内容

 public static void main(String[] args) {
        String str = "helloworld" ;
        System.out.println(str.replaceFirst("l", "_"));
    }

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

字符串拆分

 split(String regex)

将字符串全部拆分

public static void main(String[] args) {
        String str = "hello world hello swpu" ;
        String[] result = str.split(" ") ;
        for(String s: result) {
            System.out.println(s);
        }
    }

注意:有些特别的字符作为分隔符可能无法正确切分需要加上转义

如:

注意:

  1. 字符"|","*","+“都得加上转义字符,前面加上”\".
  2. 而如果是".",那么就得写成"\".
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符

split(String regex,int limit)

将字符串部分拆分,该数组长度就是limit极限

public static void main(String[] args) {
        String str = "hello world hello swpu" ;
        String[] result = str.split(" ",3) ;
        for(String s: result) {
            System.out.println(s);
        }
    }

字符串截取

 substring(int bedinIndex)

从指定索引截止到结尾

public static void main(String[] args) {
        String str="helloworld";
        System.out.println(str.substring(3));
    }

substring(int beginIndex,int endIndex)

截取字符串的部分内容

public static void main(String[] args) {
        String str="helloworld";
        System.out.println(str.substring(3,5));
    }

注意:该区间为左闭右开则:[3,5)不包含5下标

总结

到此这篇关于java中String类的文章就介绍到这了,更多相关java的String类内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Java实现经典游戏复杂迷宫

    这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • java 运行报错has been compiled by a more recent version of the Java Runtime

    java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 教你怎么用Java获取国家法定节假日

    这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
  • Java如何发起http请求的实现(GET/POST)

    这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • 浅谈Java与C#的一些细微差别

    说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
  • mybatis 返回Integer,Double,String等类型的数据操作

    这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • 解决Java处理HTTP请求超时的问题

    这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
  • java 判断两个时间段是否重叠的案例

    这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31
  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
  • Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
  • C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25