String类

2023-11-09

一、字符串: 

  • C语言中,字符串用字符数组来实现。

  • Java语言中,用类来实现,该类共分为两大类:
    1. 字符串常量:不可修改的字符串,存放在String类的对象中;
    2. 字符串变量:可以修改的字符串,存放在StringBuffer类的对象中。

二、String类:

        2.1 String类的特征:

                1. 字符串常量用String类表示。

                2. 对于所有用双引号括起来的字符串常量,系统都会为其创建一个无名的String类型对象                       (匿 名对象)。

                3. Java不允许对字符串对象进行操作,但是有一个例外,+ 运算符,他可以将两个字符串                      连接起来。

        2.2 字符串常量池的位置分布:                            

         2.3 创建String类对象:

        2.3.1 直接赋值:

        Java虚拟机会先在字符串常量池中查找有没有“hello这个字符串对象,如果有,直接将字符串 常量池中这个“hello”的对象地址返回,赋给变量str;如果没有,在字符串常量池中创建“hello”这个对象,然后将其地址返回,赋给变量str。

public class String对象 {
    public static void main(String[] args){
        String str1 = "hello";
        String str2 = "hello";
        String str3 = "hello";
        System.out.println(str1 == str2);   //true
        System.out.println(str1 == str3);   //true
        System.out.println(str2 == str3);   //true
        //三个输出结果均为true,说明三者地址相同,地址指向的对象也就相同
    }
}

           2.3.2 用构造方法对对象实例化

        当使用new关键字创建对象时,JVM仍然首先检查字符串池中是否存在要创建的字符串,如果不存在,则在字符串池中创建字符串对象,然后在堆内存中继续创建一个字符串对象,返回该对象的引用地址。如果存在,则只在堆内存中创建一个字符串对象,返回该对象的引用地址。
        凡使用String类,建议采用第一种方法。因为本身占用内存空间少,而且以后再声明与之一样的字符串的话不会重新开辟新的内存空间。

public class String对象 {
    public static void main(String[] args){
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2);   //false
    }
}

         2.3.3 字符串的" + "运算

public class String对象 {
    public static void main(String[] args){
        String str1 = "hello";
        String str2 = "world!";
        String str3 = "hello" + "world!";
        String str4 = str1 + str2;
        System.out.println(str1 == str3);   //false
        System.out.println(str2 == str3);   //false
        System.out.println(str1 == str4);   //false
        System.out.println(str2 == str4);   //false
        System.out.println(str3 == str4);   //false
    }
}

 字符串字面量拼接操作是在Java编译器编译期间执行,直接将拼接的这个常量放入字符串池。

字符串引用的+运算是在Java运行期间执行的,会被转为StringBuilder,并且拼接。

String str4=(new StringBuilder0).append(str1).append(str2).toString()字符串连接之后的对象在堆空间,不会自动进入常量池。intern()方法手动将字符串加入常量池中,首先查询常量池中是否有字符串存在,如果存在,则返回常量池中的引用,当字符串常量池中找不到对应的字符串时,而只是生成一个对该字符串的引用在字符串常量池。

public class String对象 {
    public static void main(String[] args){
        String str1="hello";
        String str2=" world!";
        String str3 = str1+str2;
        str3.intern();
        String str4 = "hello world!";
        System.out.println(str3==str1);    //false
        System.out.println(str3==str2);    //false
        System.out.println(str3==str4);    //true
    }
}

String str3 = str1 + str2在堆空间中创建对象,str3.intern()先在常量池中寻找有没有“hello world1”这一常量值,发现没有,然后在常量池中创建这一对象,返回这一对象的引用(堆中的地址)。str4发现常量池中有“hello world!”这一常量值,便将其地址赋值给str4,因此str3和str4的地址值相同。

public class String对象 {
    public static void main(String[] args){
        String str1="hello";
        String str2=" world!";
        String str3 = str1+str2;
        String str4 = "hello world!";
        str3.intern();
        System.out.println(str3==str1);     //false
        System.out.println(str3==str2);     //false
        System.out.println(str3==str4);     //false
    }
}

str4在常量池中创建“hello world!”这一常量,str3.intern()发现常量池中有“hello world!”这一常量,直接将“hello world!”给返回出去,但是返回值并没有被str3所接受,所以此时str3中的地址仍然为堆中的地址,所以str3==str4输出false,如果是str3 = str3.intern(),那么此时str3==str4输出true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String类 的相关文章

  • Java EE 6 和单例

    谁能解释一下在 Java EE 6 应用程序中实现 Singleton 的完整过程 我假设我不应该以声明静态变量的典型方式创建单例 而应该使用 Singleton注解 我必须这样做吗 难道只是声明一下的情况 Singleton就是这样 我还
  • Android:对于具有 LinearLayout 定义的成员的 ListView,上下文菜单不显示?

    我有一个 ListActivity 和 ListView 并且我已将一些数据绑定到它 数据显示得很好 而且我还为视图注册了一个上下文菜单 当我将列表项显示为简单的 TextView 时 它工作正常
  • 检查从 arrayadapter 获取的复选框

    我有标题清单 CheckBox 我想控制默认检查哪一个 所以我试图获得正确的视图并检查它 但由于某种原因它不起作用 知道为什么吗 form checkbox item xml
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • 解析 (yyyy-MM-dd) 格式的字符串日期

    我有一个 2013 09 18 形式的字符串 我想将其转换为 java util Date 我正在做这个 SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd Date converted
  • 像 Google Play 商店一样在垂直 RecyclerView 中动态不同图像水平 RecyclerView

    我一直在关注这个教程 http android pratap blogspot co za 2015 12 horizo ntal recyclerview in vertical html http android pratap blog
  • Glassfish 4 - JDBC 领域

    Glassfish 4 中的密码加密算法和摘要算法有什么区别 因为Password加密算法不能为空 所以我使用了MD5 Encoding使用了Hex 摘要算法为空 因此默认为 SHA 256 但是 如果我使用 JAAS 制作一个简单的登录应
  • 在 json 中解析尾随字符

    我正在尝试检查 json 是否有效 并且我遇到了奇怪的行为 当我将一些字符附加到可解析的 json 时 jackson 和 gson 都会解析它 并且它们会忽略尾随字符 我想检查 json 是否严格有效 请帮忙 我尝试了几个标志mapper
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • 为什么不自动装箱泛型的 Java 基本类型?

    Java 不允许在通用数据结构中使用原始类型 例如 不允许使用 ArrayList 原因是 原始类型不能直接转换为Object 然而 Java 1 5 确实支持自动装箱 并且包装类在通用数据结构中工作 那么为什么编译器不能将其自动装箱到 A
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • Java ArrayList 和 HashMap 动态

    有人可以提供一个创建Java的例子吗ArrayList and HashMap在飞行中 所以而不是做一个add or put 实际上在类实例化时为数组 哈希提供种子数据 举个例子 类似于 PHP 的例子 array array 3 1 2
  • 自 JRE 1.7.0_25 起,Batik 无法进行转换

    自从我更新到 JAVA 1 7 0 25 以来 蜡染在应用转换时会抛出异常 堆栈跟踪是 java awt image ImagingOpException Unable to transform src image at java awt
  • 为什么replaceAll在这行代码中不起作用? [复制]

    这个问题在这里已经有答案了 String weatherLocation weatherLoc 1 toString weatherLocation replaceAll how weatherLocation replaceAll wea
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • Eclipse 如何创建一个未解决编译问题的类?

    当我尝试使用 javac 编译此类时 出现编译错误并且未创建 Test class public class Test public static void main String args int x 1L lt this cannot
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request

随机推荐

  • Centos下安装gitolite+git

    一直以来我都是用SVN的 但最近做迭代开发 多分支时 发现SVN使用起来极不方便 因此打算换成git做源码管理 git的理论以及特性本文就不做讲解了 本主主要讲解怎么安装 配置git 以及git权限管理服务gitolite 组网结构 git
  • 计算机视觉基础(八)—— LBP特征描述算子之人脸检测

    1 简介 LBP指局部二值模式 Local Binary Pattern 是一种用来描述图像局部特征的算子 具有灰度不变性和旋转不变性等显著优点 LBP常应用于人脸识别和目标检测中 在OpenCV中有使用LBP特征进行人脸识别的接口 也有用
  • python opencv imread()中文路径返回为空None的解决办法 (imdecode函数的使用)

    本质原因并非网上某些地方说的是中文编码UNICODE UTF 8之类的问题 其实是python版opencv不接受NON ASCII的中文路径 为了使用中文路径 可以借助一些其他的库 本文首先介绍一种通过numpy库 毕竟这个是python
  • 编程问题(持续记录)

    问题记录 一 vue问题记录 1 vue elementui项目 build后在ie下报 Promise 未定义错误 2 elementui ie下icon不显示 3 npm run dev 时 报babel runtime core js
  • 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中

    oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多 在这介绍两个 第一种 把oracle查询的数据导出为sql文件 执行sql文件里的insert语句 如下 第一步 导出sql文件 第二步 用PL Sql Develo
  • 快速幂理解

    2 9 gt gt 2 2 8 2 2 8 gt gt 2 4 4 2 4 4 gt gt 2 16 2 2 16 2 gt gt 2 256 1 思想 通过降阶的方式每次将幂除 2 将底数每次乘方 因为幂不能为奇数 所以如果幂为奇数必须处
  • 数据筛选特征方法-方差法

    在数理统计中 方差是测算随机变量离散趋势最重要 最常用的指标 方差是各变量值与其均值离差平方的平均数 它是测算数值型数据离散程度的最重要的方法 当数据分布比较集中时 各个数据与平均数的差的平方和较小 当数据分布比较分散 即数据在平均数附近波
  • 正确理解层次方框图

    正确的层次方框图示例 图片来源 https blog csdn net qq 15037231 article details 60467793 注意 在网上搜索层次方框图会出现很多类似的图 但很多都是错的 层次方框图用树形结构的一系列多层
  • 重定向与请求转发

    分享一下在华清远见学习的知识点 重定向与请求转发也是面试中容易问到的问题 目录 一 重定向 二 请求转发 三 请求转发与重定向数据传递 四 请求转发与重定向的区别 总结 一 重定向 重定向是指由原请求地址重新定位到某个新地址 原有的 req
  • Java培训班学费一般多少?Java自学成功率是多少?

    Java培训班学费一般多少呢 Java自学成功率是多少 很多想学Java的新手对培训学费很是好奇 同时也想知道自学成功率 毕竟能不花钱就能学好的话 没必要花巨款学习 关于Java培训费用与自学成功率的答案请往下看 Java培训班学费一般多少
  • 鼠标移入背景图片放大(还原)

  • maven 配置 Tomcat7 插件和启动

    如果想使用 在 maven中使用 Tomcat7 来启动的话 可以这样配置
  • ORBSLAM2计算描述子距离——C++ 位操作得到二进制32位int值中有多少个1

    看ORBSLAM2时算描述子之间的距离时看到的神奇的位操作 特此记录一哈 unsigned int v pa pb v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 d
  • 如何解析EML(邮件)格式的文件以及一款小巧的EML邮件阅读工具

    在理解EML格式的时候 先回顾一下历史 这样有助于理解邮件的格式 比如邮件传输时为何会有多种编码方式 此外 理解EML格式也有助于理解HTTP协议 历史溯源 由于历史原因 我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式 也
  • 用java写一个权限系统的框架

    Java是一种强大的编程语言 可以用来构建复杂的软件系统 包括权限系统 下面是一个简单的Java权限系统的框架 定义用户和角色 首先需要定义用户和角色 比如管理员 普通用户等 分配权限 为每个角色分配不同的权限 比如管理员有所有权限 普通用
  • 58,滴滴,京东等大厂都在用的抓包工具:Fiddler。软件测试工程师必会技能

    前言 Fiddler是一个http协议调试代理工具 它能够记录并检查所有你的电脑和互联网之间的http通讯 设置断点 查看所有的 进出 Fiddler的数据 例如cookie html js css等文件 换句话说就是Fiddler可以拦截
  • java jdbc 时间段和日期段查询

    首先先创建1000条随机日期数据 package jdbc import java sql Connection import java sql Date import java sql DriverManager import java
  • 顺序表的操作及实现(C++)

    顺序表的操作是大家在学习数据结构的第一个模块 也是最简单的一个 下列是顺序表的六种基本操作详解 希望能对您有所帮助 1 建立一个顺序表 输入n个元素并输出 define MAXSIZE 100 确定最大值 define OK 1 defin
  • 世界十大美女城市排行榜出炉:荷兰首都居首位

    中新网6月4日电 据俄罗斯媒体报道 在旅游旺季到来之际 世界著名的 游客文摘 杂志日前公布了在男性游客心目中拥有世界最漂亮女性的十大城市排行榜 荷兰的阿姆斯特丹 以色列的特拉维夫和加拿大的蒙特利尔位列三甲 俄罗斯首都莫斯科位列第五 高居十大
  • String类

    一 字符串 C语言中 字符串用字符数组来实现 Java语言中 用类来实现 该类共分为两大类 字符串常量 不可修改的字符串 存放在String类的对象中 字符串变量 可以修改的字符串 存放在StringBuffer类的对象中 二 String