关于Java中String类字符串的解析

目录
  • 一、前言
  • 二、String类概述
  • 三、字符串的特点
  • 四、String 构造方法
  • 五、String类对象的特点
  • 六、比较字符串的方法
  • 七、判断两个字符串地址是否相等

一、前言

java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们一起来学习一下。

二、String类概述

string在软件包java.lang下,所以不需要导包。

String字符串是java中的重点,String 类表示字符串类 ,所有的字符串(如"adf")都属于

此类,也就是说有" "双引号括起来的都属于此类,

三、字符串的特点

字符串不可变,他们的值在创建之后不能被改变。

虽然String的值的不可变的,但是他们可以被共享。共享就是其他成员也可以拥有这个值,

字符串效果相当于数组(char[] ),但是底层原理是字节数组(byte[]

jdk8以前是字符数组,jdk9以后是字节数组。

四、String 构造方法

public String()  //创建一个空白字符串对象,不含有任何内容。

public String(char[] ch)//根据字符数组的内容来创建字符对象。

public String (byte[] b)//根据字节数组的内容来创建字节对象。

String s=“abc”         //字节赋值的方式创建对象,内容就是abc。

图示:

代码演示:

public class StringDemo {
    public static void main(String[] args) {
        String s1=new String();//创建空的字符串,其中不包括任何内容
        System.out.println("s1:"+s1);
        char[]chs={'a','b','c'};
        String s2=new String(chs);//给chs创建对象
        System.out.println("chs:"+s2);//输出ch:abc
        byte[]bys={97,98,99};
        String s3=new String(bys);
        System.out.println("bys:"+s3);//输出bys:abc,他会 转化成对应的Ascll码值
        String s4="abc";
        System.out.println("s4:"+s4);//输出s4:abc
    }
}

综上看,推荐使用直接赋值的方式得到字符串对象。

五、String类对象的特点

通过new创建的的字符串对象,每一次new都会申请一个内存空间,虽然内容一样,但是地址不同

通过直接赋值的方式来创建对象,赋值相同的值,因为是常量在堆内存的常量池中,进入常量池的规则是:如果常量池中没有这个常量,则在常量池中创建一个,如果有,则把已经存在的常量地址赋值给他,所以创建不同的变量去接受相同的值,他的内容是一样的,地址也是一样的 。

六、比较字符串的方法

我们在比较两个数字是否相同时,一般用的是==来判断,那么要比较两个字符串相等

用的是什么呢,答案是用equals

==用来判断两个字符串的地址是否相同,相同返回true,不同返回false

equals用来比较两个字符串的值是否相同,相同返回true,不同返回false

用法:

public class String1 {
    public static void main(String[] args) {
        String s1="hello";
        String s2="world";
        String  s3= "helloworld";
        String s4=s1+s2;
        System.out.println(s7==s8);//0
        System.out.println(s3==s4);//比较两个字符串的地址是否相同
        System.out.println(s3.equals(s4));//比较两个字符串中的值是否相同
    }
}

代码图示:

原因下文分析。

七、判断两个字符串地址是否相等

在字符串中,两个字符串相加可以的到一个新的字符串,这是我们知道的,但是地址会是一样的吗

看下列代码:

public class String1 {
    public static void main(String[] args) {
        String s1="hello";
        String s2="world";
        String  s3= "helloworld";
        String s4=s1+s2;
        String s5="he"+"llo";
        String s6="hello"+"world";
        String s7="hello"+s2;
        String s8=s1+"world";
        System.out.println(s3==s6);//比较两个地址是否相同
        System.out.println(s1==s5);
        System.out.println(s3==s7);
        System.out.println(s3==s8);
        System.out.println(s7==s8);
        System.out.println(s3==s4);
        System.out.println(s3.equals(s4));//比较两个字符串中的值是否相同
    }
}

我们仔细分析:

第一个:

   String  s3= "helloworld";
   String s6="hello"+"world";

s3首先在常量池中创建了一个helloworld的常量,s6是有两个新的字符串连接起来的,

这两个字符串常量创建新的字符串常量,存储在常量池中时,因为helloworld已经存在,

所以常量池就不会创建新的字符串了,直接把已经存在的s3地址赋值给s6,所以他们地址

相同。

第二个:

String s1="hello";
 String s5="he"+"llo";

这个分析和第一个一样,地址相同。

第三个:

  String s2="world";
String  s3= "helloworld";
String s7="hello"+s2;

s2在常量池中创建world,s3在常量池中创建helloworld,s7是由一个变量s2连接一

个新的字符串"world",首先会在常量池创建字符串"world",然后两者之间进行"+"

操作,根据字符串的串联规则,s7会在堆内存中创建StringBuilder(或StringBuffer)

对象,通过append方法拼接s2和字符串常量"world”,此时拼接成的字符串"helloworld"

是StringBuilder(或StringBuffer)类型的对象,通过调用toString方法转成String对

象"helloworld",所以s7此时实际指向的是堆内存中的"helloworld"对象,堆内存中对

象的地址和常量池中对象的地址不一样。

StringBuilderStringBuffer的区别

  • 1.StringBuffer 对几乎所有的方法都实现了同步,线程比较安全,在多线程系统中可以保
  • 证数据同步。
  • 2.StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder
  • 3.当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场
  • 景下可以使用 StringBuilder

第四个:

 String s1="hello";
String  s3= "helloworld";
 String s8=s1+"world";

解释同上,重新简单的说一下,s3在先在常量池中创建helloworlds8是由变量s1和常量

world加起来的,会先在常量池中创建world,然他他们现在之后会在堆内存中存在,所以

他们的地址不同。

总结:一般带有变量的相加操作是在堆中创建的

 第五个:

       String s1="hello";
        String s2="world";
        String s7="hello"+s2;
        String s8=s1+"world";

解释和上面有些相似之处,他们都是有变量加常量,所以他们都是在堆内存中创建的,

堆内存的地址是不会相同的。

 第六个:

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

首先在常量池中创建唯一的常量,然后再,s4进行两个变量的相加操作,所生成的是在
堆内存中的,所以地址不同。

到此这篇关于关于Java中String类字符串的解析的文章就介绍到这了,更多相关Java中String类字符串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 辨析Java中的String与StringBuffer及StringBuilder字符串类

    1 String String:字符串常量,字符串长度不可变. 2 StringBuffer StringBuffer:字符串变量(Synchronized,即线程安全).如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法. Java.lang.StringBuffer线程安全的可变字符序列.在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容.可将

  • Java String类简单用法实战示例【字符串输出、比较】

    本文实例讲述了Java String类简单用法.分享给大家供大家参考,具体如下: 一 String类的实例化方式 1 代码 public class NewString { public static void main(String args[]) { String str1= "Hello World!"; // 直接赋值建立对象str1 System.out.println("str1:" + str1) ; //输出 String str2 = new St

  • Java8优雅的字符串拼接工具类StringJoiner实例代码

    StringJoiner是Java8新出的用于处理字符串拼接的工具类,可以让你的代码看起来更优雅,不拉跨. 假设现在遍历一个字符串集合,需求是每个元素按照 "." 分开. String a = "w", b = "d", c = "n", d = "m", e = "d"; List<String> list = new ArrayList<>(); list.a

  • Java中char数组(字符数组)与字符串String类型的转换方法

    本文实例讲述了Java中char数组(字符数组)与字符串String类型的转换方法.分享给大家供大家参考,具体如下: 在Java语言编程时,使用"口令字段"jPasswordField组件时,如果要获得密码值,就需要使用该组件的getPassword()方法.jPasswordField的getPassword()方法返回一个char类型的数组,我们经常需要将这个数组转换为String类型,以便进行诸如口令匹配或口令赋值等操作.这时,就需要将char类型的数组进行转换.当然也经常会遇到

  • 详解Java中字符串缓冲区StringBuffer类的使用

    StringBuffer 是一个线程安全的可变的字符序列.它继承于AbstractStringBuilder,实现了CharSequence接口. StringBuilder 也是继承于AbstractStringBuilder的子类:但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的. StringBuffer 和 CharSequence之间的关系图如下: StringBuffer类和String一样,也用来代表字符串,只是由于StringB

  • Java String类字符串的理解与认知

    目录 一.前言 二.String类概述 三.字符串的特点 四.String 构造方法 图示: 代码演示: 五.String类对象的特点 六.比较字符串的方法 用法: 代码图示: 七.判断两个字符串地址是否相等 StringBuilder和StringBuffer的区别 一.前言 在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们 一起来学习一下. 二.String类概述 string在软件包java.lang下,所以不需要导包. String字符串是java中的重

  • java字符串格式化(String类format方法)

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. format()方法有两种重载形式. 显示不同转换符实现不同数据类型到字符串的转换,如图所示: 测试用例: public static void main(String[] args) { String str=null; str=String.format("Hi,%s", "王力"); System.out.println(str); str=String.fo

  • java常用工具类 Reflect反射工具类、String字符串工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 Reflect反射工具类 package com.jarvis.base.util; /** * * * @Title: ReflectHelper.java * @Package com.jarvis.base.util * @Description: 反射工具类 * @version V1.0 */ public class ReflectHelper { /** * 提指定的类载入以系统中 * * @param n

  • java将String字符串转换为List<Long>类型实例方法

    在一些应用场景当中,我们可能会遇到以下的场景,我们要使用的类型是List类型,但是接收到的参数是Stirng类型如1,2,3,4等这样的形式 那么我们可以通过采用以下的代码完成以上需求的转换 private static Log log = LogFactory.getLog(Demo.class); @Test public void test() { String ids = "1, 3, 5, 7, 9"; // 首先去除空格 String idsWithNoBlank = id

  • 关于Java中String类字符串的解析

    目录 一.前言 二.String类概述 三.字符串的特点 四.String 构造方法 五.String类对象的特点 六.比较字符串的方法 七.判断两个字符串地址是否相等 一.前言 在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们一起来学习一下. 二.String类概述 string在软件包java.lang下,所以不需要导包. String字符串是java中的重点,String 类表示字符串类 ,所有的字符串(如"adf")都属于 此类,也就是说有&q

  • Java中String类常用方法总结详解

    目录 一. String对象的比较 1. ==比较是否引用同一个对象 2. boolean equals(Object anObject) 3. int compareTo(String s) 4. int compareToIgnoreCase(String str) 二. 字符串查找 三. 转化 1. 数值和字符串转化 2. 大小写转化 3. 字符串和数组的转换 4. 格式化 四. 字符串替换 五. 字符串拆分 六. 字符串截取 七. 其他操作方法 1. String trim() 2. b

  • Java中String类使用方法总结

    一.Java中关于String类的常用方法 本文只用来自己做笔记,随便写写,方便自己理解,谢谢各位的指正.下面是摘抄慕课的一部分 1.使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符. 2.字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1 3.使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引:如果没有匹配结果,返回 -1 4.整

  • 详解Java中String类的各种用法

    目录 一.创建字符串 二.字符.字节与字符串的转换 1.字符与字符串的转换 2.字节与字符串的转换 三.字符串的比较 1.字符串常量池 2.字符串内容比较 四.字符串查找 五.字符串替换 六.字符串拆分 七.字符串截取 八.String类中其它的常用方法 九.StringBuffer 和 StringBuilder 1.StringBuilder与StringBuffer的区别 2.StringBuilder与StringBuffer常用的方法 十.对字符串引用的理解 一.创建字符串 创建字符串

  • Java中String类常用类型实例总结

    目录 1.创建字符串的方法 1.1构造 1.2引用对象  2.字符串的比较 3.字符串的不可改变性 4.数组转字符串  5.判断是否是数字字符串  isNumberChar(  )  6.字节变字符串  7.字符串的查找 8.字符的替换 9.字符串的分割 9.1以单个符号来分割  9.2多个分隔符分割  9.3特殊符号分割 10.提取子串str.substring(  )  11.去空格 12.字符串的拼接 13.StringBuffer   13.1字符串的拼接 13.2方法的返回类型 总结

  • Java中String类常用方法使用详解

    目录 一.length() 二.equals 三.charAt() 四.indexOf() 五.trim() 六.compareTo() 七.toLowerCase() 八.toUpperCase() 九.replace() 十.substring(int beginIndex) 十一.substring(int beginIndex, int endIndex) 总结 一.length() 返回此字符串的长度 public static void main4(String[] args) {

  • Java中String类的常用方法总结

    目录 概述 特点 使用步骤 常用方法 判断功能的方法 获取功能的方法 转换功能的方法 分割功能的方法 概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例. 类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻 译为大写或小写的所有字符的字符串的副本. 特点 字符串不变:字符串的值在创建后不能被更改. String s1 = "abc&quo

  • Java中String类(字符串操作)的10个常见问题和解决方法

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比Stri

  • JAVA中String类与StringBuffer类的区别

    在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类). 下面先简单的说一下两者的区别. String类和StringBuffer类都提供了相应的方法实现字符串的操作,但二者略有不同. (1) String类 该类一旦产生一个字符串,其对象就不可变.String类的内容和长度是固定的.如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现.虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例.系统为Stri

  • 深入剖析Java中String类的concat方法

    目录 Java String类的concat方法 String的两点特殊性 源码分析 String类中concat()方法笔记及底层实现 Java String类的concat方法 在了解concat()之前,首先需要明确的是 String的两点特殊性 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private final char[] value ; 其中final对应值的不可更改的特性:而char[]对应String是长度不可更改的特性. 因此,当我们对String进

随机推荐