Java小白一文简单普及Java中的String关键字

news2024/9/21 2:42:59

String类

  • String对象用于保存字符串,也就是一组字符序列

  • 字符串常量对象是用双引号括起的字符序列,例如 “Kerwin”

  • 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节

  • String类较常用构造方法

    String s1 = new String();

    String s2 = new String(String original);

    String s3 = new String(char[] a);

    String s4 = new String(char[] ,int startIndex,int count);

String 实现了Serializable和Comparable 接口,说明String可以串行化,String对象可以比较大小

​ 可串行化:可以在网络传输

  • String是final 类,不能被其他的类继承
  • String有属性private final char value[]; 用于存放字符串内容
  • 一定要注意: value 是一个final类型,赋值之后不可修改;
    • 这里的不可修改是指地址不可修改,不是指字符串内容不可修改,即value不能指向新的地址,但是单个字符内容是可以变化
        final char[] value = {'a','b','c'};
        value[0]= 'H';//这样修改value数组中的值是可以的,不会报错
        char[] value2 = {'t','o','m'};//再创建一个char数组
//        value = value2;//此时就会报错,不能再value指向新的数组了
        //但是,如果把上面的final去掉,则上面的语句不会报错

在这里插入图片描述

创建String 对象的两种方式

  • 直接赋值String s = “essence”;

    • 先从常量池查看是否有“essence”数据空间,如果有,直接指向;如果没有则重新创建,

      然后指向,s 最终指向的是常量池中的空间地址

  • 调用构造器String s = new String(“essence”);

    • 先在堆中创建空间,里面维护了value属性,指向了常量池中的“essence”空间,如果常量池中没有“essence”,

      重新创建,如果有,直接通过value指向,最终指向的是堆中的空间地址
      在这里插入图片描述

练习

在这里插入图片描述

//输出如下
true  //String已经重写了equals方法,所以二者内容相同,返回true
true  //a和b二者都是先到常量池去看有没有“abc”,发现有,则二者指向的地址是一样的,所以return  true

在这里插入图片描述

//输出如下
true  //重写equals后,比较的是内容,二者内容相同,所以true
false	//二者指向的地址不同
true
false
    String a = "hsp";// a 指向常量池中的“hsp”;
	String b = new String("hsp");//b 指向堆中的对象,堆中对象的value再指向常量池中的“hsp”;
	System.out.println(a.equals(b));//此时重写之后,比较的是字符串内容,返回true
	System.out.println(a==b);//a指向的是常量池中的“hsp”,b是指向堆的,堆中有个对象,对象中有个value。
			//value指向常量池中的“hsp”,而a、b指向的对象不同,所以return  false
	System.out.println(a==b.intern());
		//a的内容是“hsp”,b.intern()会去看对象b的内容是什么,是hsp,它就到常量池中看,有没有一个字符串也是hsp
		// 之前已经放进去了hsp到常量池中,此时是有的,如果有的话,它就直接把这个hsp返回,此时再比较,
		//二者都是hsp,自然就相等,返回true了
	System.out.println(b==b.intern());
		//此中的b指向的是堆中的对象,而b.intern()则指向的是常量池中的“hsp”,
		//二者不一样,所以return false
//拓展普及
	当调用intern方法时,如果池中已经包含了一个等于此String对象的字符串(equals(Object)方法确定),则返回池中的字符串,
    否则,将该String对象添加到池中,并返回此String对象的引用
        //b.intern()方法最终返回的是常量池的地址(对象)

在这里插入图片描述

//输出如下
false
    //二者指向的对象不同,前者指向常量池中的“Java”,而后者指向堆,堆中的value指向常量池中的“Java”
true
    //二者的内容相同,所以指向常量池中的同一位置,so相等
true
    //equals比较的是内容,二者内容相同,所以true
false
    //二者内容都不同,就要各自在常量池中创建,二者指向常量池中的指向不同

在这里插入图片描述
在这里插入图片描述

//输出如下
true
    //equals比较内容,所以相等
true
    //二者的name指向的都是常量池中的“hspedu”,指向相同,so true
true
    //前者指向常量池中的“hspedu”,后者本就是在常量池中,so true
false
    //二者是指向两个不同的对象,指向不同,无非二者的name属性值相同罢了

在这里插入图片描述

字符串的特性

说明:

  • String是一个final类,代表不可变的字符序列
  • 字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的

在这里插入图片描述

//千万不要认为第二个语句是把常量池中的“hello”给直接覆盖替换了,
//第二个语句,它会先看常量池中有没有“haha”,如果有,那就直接指向,反之,
//它就会在常量池中创建“haha”,然后让s1重新指向“haha”,原先指向“hello”的那条线就莫得了
    //综上,在常量池中创建了两个对象

在这里插入图片描述

//String a = "hello" + "abc",这个语句编译器会将其优化为String a = "helloabc"
	//所以,综上,创建了一个对象 

//分析
	1.编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向
        	//如果创建了3个,那么单个的hello、abc,没人用,你说创建它干什么
    2.String a = "hello"+"abc"; ---> String a = "helloabc"; 

在这里插入图片描述

//注意,此中的String c = a+b 和 String "hello"+"abc"是不一样的哈
	String c = a + b;
	//剖析底层执行流程
	1.创建一个StringBuilder sb = StringBuilder();
	2.执行  sb.append("hello");
	3.sb.append("abc");
	4.String c = sb.toString();//	toString()方法底层仍然是new
	5.最后,其实是c指向堆中的String类型对象,其中的value数组再指向池中的"helloabc"
//所以,综上创建了3个对象,a、b指向常量池中对象,c指向堆
        如果此时再来句String  d = "helloabc";试问下面这句的返回值
            System.out.println(d==c);

//答案是false,因为c指向的是堆中的对象,而d指向的是常量池中的"helloabc";

//重要规则:
	String c = "ab" + "cd"; 常量相加,看的是池;String  c1 =  a + b ;变量相加,是在堆中;
再来多问一句:
    	String d = "helloabc";
    	System.out.println(d==c);//此时返回的就是true哟,因为二者都是指向池的;

在这里插入图片描述
在这里插入图片描述

//输出入下
true
true
解析:
    //s6是指向常量池中的hspedujava

在这里插入图片描述
在这里插入图片描述

//
hsp and hava
    /**
    new String("hsp") 这一行首先在常量池中查找是否有 "hsp" 字符串。如果没有,
    则在常量池中创建 "hsp"。
    然后通过 new String("hsp") 在堆中创建一个新的 String 对象,并将该对象的值设为 "hsp",
    并且 str 引用指向这个堆中的 String 对象。inal char[] ch = {'j', 'a', 'v', 'a'} 
    创建了一个字符数组 ch,该数组存储在堆中。数组的内容为 {'j', 'a', 'v', 'a'},
    ch 引用指向这个堆中的数组。调用 ex.change(ex.str, ex.ch); 时,
    ex.str 和 ex.ch 被传递到 change 方法中。
    在 Java 中,参数传递是按值传递的。对于引用类型,传递的是引用的副本。
    在 change 方法中,str 变量指向了一个新的字符串 "java",
    这个字符串查找常量池中是否有 "java",如果没有,则在常量池中创建 "java" 字符串,
    并让 str 变量指向这个常量池中的 "java"。
    需要注意的是,这里 change 方法中的 str 是 ex.str 的副本,
    对它的修改不会影响 ex.str 原本的引用。
    因此,ex.str 仍然指向堆中那个值为 "hsp" 的 String 对象。
    ch[0] = 'h'; 这行代码修改了数组 ch 的第一个元素,将其从 'j' 改为 'h'。
	由于 ch 是一个引用,传递的是引用的副本,但它仍然指向堆中的同一个数组,
	因此这个修改会影响到 ex.ch 数组。
	最终,ex.ch 的内容变为 {'h', 'a', 'v', 'a'}。
	因为在 change 方法中对 str 的修改没有影响到原始的 ex.str,
	所以此时输出语句中ex.str 仍然是 "hsp"。
	而ex.ch 数组被修改过,因此其内容为 {'h', 'a', 'v', 'a'},打印时会输出 "hava"。
	因此,最后的输出结果是    hsp and java									*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

婚宴座位号怎样查?

在婚宴的温馨氛围中,快速准确地找到座位是每位宾客的期待。本文将带您领略如何通过一系列简单步骤,在电脑端和小程序中查询座位号,确保每位宾客都能享受到这场庆典的每一个细节。 第一章:电脑端查询信息上传 1. 官网登录&#x…

基于状态机实现的按键释放、消抖、单击、双击、长按等功能

状态机理论: 每次只能执行状态机中的一个状态 注意:状态转移时有时会根据需要发生不同的动作(可根据不同条件发生不同的动作),此处的发生动作指返回按键码值(代表那个按键的对应状态) 如果是在长按状态在向释放状态迁…

分享一个基于python的内蒙古旅游景点数据分析与采集系统(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

【算法进阶1】贪心算法、背包问题(0-1背包、分数背包)、拼接最大数字问题、活动选择问题

1 贪心算法 2 背包问题 2.1 0-1背包问题 2.2 分数背包 3 拼接最大数字问题 4 活动选择问题 1 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑,他所做出…

基于虚拟下垂控制的分布式电源并网建模仿真

针对并联逆变器间的环流和功率分配不均的问题,提出了一种基于改进虚拟阻抗的微电网逆变器下垂控制策略,对传统下垂控制算法的有功功率和无功功率进行分析,虚拟阻抗引入到电压电流双环控制策略。 在MATLAB中建立了逆变器并联运行的分布式仿真模…

【Qt】贪吃蛇

目录 贪吃蛇小游戏 一.项目介绍及演示 1. 项目介绍 2. 项目演示 3. 窗口介绍 3.1 游戏大厅窗口 3.2 游戏关卡选择窗口 3.3 游戏房间窗口 二、创建项目及资源配置 1. 创建项目(QWidget) ​编辑 2. 资源配置(图片声音素材&#xff0…

文心快码助力项目实战开发

文章目录 前言支持的编程语言 Language安装方法使用方法 项目实践代码运行流程出行方案查询JSP 指令与标签库指令页面上下文路径设置表单部分查询结果显示部分 使用感受优点改进建议 前言 提示:这里可以添加本文要记录的大概内容: 文心快码Baidu Comat…

《黑神话:悟空》爆火,作为普通人,该怎么抓住这波风口赚到钱?

目录 一、游戏视频 1.1、游戏教程视频 1.2、游戏剧情视频 二、游戏直播 三、游戏视频出海 四、AI黑神话悟空 大家好,我是小奇,一名热衷于分享AI副业项目的普通博主。不管你是AI小白还是老手,我都能帮你轻松上手,用AI技术赚钱…

【C++ Primer Plus习题】4.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Pizza {string companyName;float diameter;float wieght; }Pizza;int main() {Pizza p;cout << "请输入披萨的公司名: ";getline(cin, p.companyName);…

uniapp+vue3的ifdef实现多端配置客服消息

在微信小程序预览&#xff0c;实现客服消息&#xff0c;因是个人版&#xff0c;不支持 button | uni-app官网 (dcloud.net.cn) 条件编译处理多端差异 | uni-app官网 (dcloud.net.cn) uni.makePhoneCall(OBJECT) | uni-app官网 (dcloud.net.cn) //my.vue <template> &l…

10大国产AI绘画软件,每一款都挺好用 ,你用过吗?

在这个科技与艺术交织的时代,AI绘画软件正以惊人的速度改变着我们的创作方式。今天,就让我们一起探索那些你绝不能错过的10大国产AI绘画神器,它们不仅让创作变得前所未有的简单高效,更让每一位艺术家和爱好者都能享受到创作的无限乐趣! 1️⃣触站A🎨——语音创作,未…

循环结构程序设计-找出指定数量学生的最高分

**7-1-1 #include <stdio.h>int main(){int n,score,max;scanf("%d",&n);max 0;for(int i0;i<n;i){scanf("%d",&score);if(score>max){max score;}}printf("%d",max);return 0; }

一文迅速上手 ESP32 bluedroid 蓝牙从机开发

前言 个人邮箱&#xff1a;zhangyixu02gmail.com该博客主要针对希望迅速上手 ESP32 蓝牙从机开发人员&#xff0c;因此&#xff0c;很多蓝牙技术细节知识并不会进行介绍&#xff0c;仅仅介绍我认为需要了解的 API 函数和回调内容。本文主要是基于gatt_server demo来微调进行进…

# ‘telnet‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘telnet’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 一、报错描述&#xff1a; 1、当使用 telnet 命令&#xff0c;连接本地 tomcat 的 8005 端口时报错。 2、报错解释 这个错误表明系统无法识别telnet命令&#xff0c;因为它不是内置命令&#xff0c;也没有…

跳马(华为od机考题)

一、题目 1.原题 马是象棋(包括中国象棋和国际象棋)中的棋子&#xff0c; 走法是每步直一格再斜一格&#xff0c; 即先横着或直着走一格&#xff0c;然后再斜着走一个对角线&#xff0c; 可进可退&#xff0c;可越过河界&#xff0c;俗称“马走‘日’字。 给顶m行n列的棋盘&…

人工智能在专业领域的斗争

介绍 ChatGPT 等大型语言模型 (LLM) 在用自然语言讨论一般话题的能力方面令人印象深刻。然而&#xff0c;他们在医学、金融和法律等专业领域却举步维艰。这是由于缺乏真正的理解&#xff0c;并且注重模仿而不是智力。 大语言模型正处于炒作的顶峰。由于能够用自然语言回答和讨…

“Docker中部署Kibana:步骤与指南“

博主这篇文章是跟Elasticsearch那篇文章是有关系的&#xff0c;建议大家先去看&#xff1a; 轻松上手&#xff1a;Docker部署Elasticsearch&#xff0c;高效构建搜索引擎环境_docker 启动 es-CSDN博客 这篇博文&#xff0c;还有镜像下载不下来的情况&#xff0c;大家可以去看…

攻破:重定向 缓冲区

文章目录 前言&#xff1a;认识读文件read认识重定向&&缓冲区重定向现象及分析&#xff1a;dup2的介绍&#xff1a; 缓冲区的引入&#xff1a;缓冲区的理解&#xff1a; 前言&#xff1a; ​ 从上一章开始&#xff0c;我们进入了文件IO的学习&#xff0c;认识了文件描…

浅谈C# RabbitMQ

一、基本介绍 RabbitMQ——Rabbit Message Queue的简写&#xff0c;但不能仅仅理解其为消息队列&#xff0c;消息代理更合适。 RabbitMQ 是一个由 Erlang 语言开发的AMQP&#xff08;高级消息队列协议&#xff09;的开源实现&#xff0c;其内部结构如下&#xff1a; RabbitMQ作…

今年秋招太吓人了。(20届,在得物做Java开发)

有个学弟来问我诉苦最近好忙好累&#xff0c;说竞争压力特别大&#xff0c;让我给点建议&#xff0c;要不要放弃实习闷头搞秋招&#xff0c;我才意识到时间太快了&#xff0c;想想我都毕业几年了&#xff0c;感慨颇深&#xff0c;整理一下我的求职经验和目前的心得吧&#xff0…