1.String类的特点

1.java程序中,只要是双引号字符串,就都是String类的对象 如图

只有String这一个类有这种特殊的创建对象方法

我们知道,只有对象才可以通过 点什么来调用方法,而图中s.toString等方法都可以调用,所以s就是String的对象

.

2.字符串在创建之后,内容不可更改 如图

这该如何解释?我们不妨先看看下图

上图中,stu原本是18,张三的,但是却被新创建的对象20,李四给覆盖掉了,导致最终打印出来的是新的对象

所以,上图中的s并不是被改变了内容,而是因为"def"也是双引号字符串,也是一个新的对象,s被新的对象覆盖了,所以打印的是def,但原来的"abc"是没有被改变的

3.String字符串虽然不能改变,但可以共享

如图 打印出来的是false还是true呢?

答案是true,在回答为什么是true之前,我们需要知道一个新的知识——字符串常量池

4.字符串常量池

我们使用内存图对刚才的s1,s2比较进行解释

当执行到s1时,创建出双引号对象"abc",这时,程序会去字符串常量池检查是否有"abc"这个对象,发现没有abc,所以在字符串常量池里创建"abc",然后产生地址,记录给s1

接着执行s2,还是创建双引号对象"abc",程序依旧去字符串常量池检查是否有"abc"这个对象,这时发现存在,那就直接把地址赋给s2

s1和s2的地址都一致,引用数据类型使用==进行比较,比较的是地址值,所以打印的true

.

字符串常量池所在的内存位置

所以,以后字符串常量池基本都出现在堆内存中

String类的特点的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

  8. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

  10. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

随机推荐

  1. 前端学习openLayers配合vue3(加载矢量图标)

    今天我们来进行矢量图标的加载 关键代码 有一个比较注意的点就是,图片路径必须引入不能直接写路径,我找半天也没发现问题所在 let anchorLayer=new VectorLayer({ sourc ...

  2. 获取不同型号手机小程序导航栏的高度(uniapp)

    uni.getSystemInfo({ success: function(e) { Vue.prototype.StatusBar = e.statusBarHeight; let custom = ...

  3. (十一)关于之前写过的Demo源码

    .NET6.0合集(一)到(十)中的源代码我已上传到Gitee,当然部分代码并不完全代表我的编程风格,更加优雅的实现方式我会在后续慢慢更新.欢迎大家互相讨论. 仓库地址:https://gitee.c ...

  4. Quartz调度框架详解、运用场景、与集群部署实践

    以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...

  5. ESP32 idf常用脚本命令及git命令

    一.Linux环境 1.下载并安装相关的工具 ./install.sh 2.添加ESP-IDF工具到PATH中 . ./export.sh 3.打开配置界面 idf.py menuconfig 4.设 ...

  6. 从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群

    从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群 AlwaysOn集群是SQL Server里唯一推荐的高可用性架构, 在AlwaysOn高可用性架构中,有非 ...

  7. Luogu P3899 湖南集训 更为厉害 题解 [ 紫 ] [ 可持久化线段树 ] [ dfs 序 ] [ 线段树合并 ]

    更为厉害:可持久化做法有点意思,但线段树合并做法就很无脑了. 线段树合并做法 显然有三种 \(b\) 的位置的分类讨论. 当 \(b\) 为 \(a\) 的祖先时 从祖先里选 \(b\),从儿子里选 ...

  8. tomcat配置用户名密码

    1.配置tomcat-user.xml<role rolename="manager-gui"/><role rolename="manager-scr ...

  9. 管理虚拟机(virtual-manager)

  10. WPF无边框的一个方案(保留默认窗口的拖动、阴影等效果)

    使用 WindowStyle="None" AllowsTransparency="True" 的方式达成无边框的效果有很多无法忽视的缺陷,比如失去了拖动效果. ...