4 Java的基本程序设计结构(基本语法3)- 字符串、面向对象(进阶)

文章目录

  • 前言
  • 一、java中的 == 究竟比较的是什么?
  • 二、字符串
    • 1 String
      • (1)String的两种构造方式
      • (2)字符数组转字符串、字节数组转字符串
      • (3)字符串的 + 拼接
      • (4)字符串的内存结构
      • (5)字符串的比较
        • s.equals(要比较的字符串):不忽略大小写比较(比较内容)
        • s.equalsIgnoreCase(要比较的字符串):不忽略大小写比较(比较内容)


前言

一、java中的 == 究竟比较的是什么?

Python中 == 究竟在比较什么?参考博客

  • 对于基本数据类型(如int, char等),== 比较的是它们的值。
    因为java中的基本数据类型是直接存在栈空间,存的直接就是值,他们压根就没有地址,自然只能比较值,不能比较引用了
  • 对于对象类型(如String, List等),== 比较的是它们的内存地址。
    对于String还有一点小细节留到 下面字符串的比较里面去说明

二、字符串

java为我们提供了很多的字符串API接口,常见的有·String 、StringBuilder、StringJomier等等

1 String

【注】:
1 开始学习字符串前,我们需要知道在java中字符串String是引用数据类型,并且是不可变的,这个不可变单独解释一下,java中的字符串对象一旦创建就不可变,要修改只能重新创建一个字符串对象重新绑定变量。
2 String这个类是定义在java最基本的类java.lang包下的,并且不需要手动导入就可以用
3 String是一个类,实例化就是对象,下面会有具体演示

String是Java中的一种特殊的引用类型,但是为了方便使用,Java设计了字符串字面量(string literals)和String对象之间的自动转换。这使得我们可以像使用基本数据类型一样使用String,而无需显式地创建对象实例。
字符串字面量:在Java中用双引号括起来的字符串字面量(例如:“Hello”)会被自动转换为String对象。
最后关于 int这些为什么能直接声明变量,不用想了,这肯定是java的语法设计,java虚拟机识别到这种语法就会内部自动进行一些操作就是了,不用想太多,这种就纯粹就是一种语法了。(看完下面String的两种构造方式就知道基本舒服了关于这个疑惑)

(1)String的两种构造方式

前面讲对象实例化语法有下面两句话

  • 对象通用实例化语法:类名 变量(对象)名 = new 类名(参数)
    除了少部分特殊类(String等),有更加简单的实例化方法,都能使用这个通用的实例化语法(不管你有没有更加简单实例化语法,反正这个一定行)

这里就专门来讲String的两种不同实例化语法了

  • 简单实例化语法(用习惯了,今后也更加常用(直接创建)):String s = “hello world”
    Java设计了字符串字面量(string literals)和String对象之间的自动转换。这使得我们可以像使用基本数据类型一样使用String,而无需显式地创建对象实例。— Python中万物皆对象,列表、元组、字典这些对象实例化的语法都有这种自动转换机制。
  • 通用实例化语法(通过new创建):String s = new String(“hello world”) ,另外,如果括号里面不传参数就是创建空字符串
    显式地创建对象实例,当然还是可以的。
// 1. 简单常用String实例化方式
String s1 = "hello";
System.out.println(s1);     // hello// 2. 通用使用new关键字(类)实例化String对象方式
String s2 = new String("hello world");
System.out.println(s2);     // hello world

(2)字符数组转字符串、字节数组转字符串

下面介绍一种使用字符数组转换成字符串和字节数组转字符串的用法,刷算法题可能会碰到这种用法,这里也提一下。

// 字符数组转字符串
char[] chars = {'a', 'b', 'c', 'd', 'e'};
String str = new String(chars);
System.out.println(str);  // abcde// 字节数组转字符串
byte[] bytes = {97, 98, 99, 100, 101};
String str2 = new String(bytes);
System.out.println(str2);  // abcde

【注】:需要特别指出如果Python用str([‘a’, ‘b’, ‘c’, ‘d’, ‘e’])会将整个列表转成一个字符串,而不是这种拼接的方式,这是区别

(3)字符串的 + 拼接

前面的练习我们以及知道了,字符串可以和几乎所有类型数据拼接。

System.out.println("Hello World!"+ 1111 + "你好!"); //  Hello World!1111你好!

这个功能甚至比Python中的 f " " 这种方式都要好用。

(4)字符串的内存结构

前面已经讲过字符串的两种创建方式:

  • 简单实例化语法(直接创建):String s = “hello world”

  • 通用实例化语法(通过new创建):String s = new String(“hello world”) ,另外,如果括号里面不传参数就是创建空字符串

下面主要讲直接创建的语法,实际上这种比new更常用是因为在内存结构中更加节省内存。
实际上这种直接创建的方式的String对象会放在堆空间的StringTable(串词)这个区域创建String对象,并且有一个特定就是直接创建的这种方式创建过的字符串分配地址后,如果后面还会创建同样的字符串对象就会直接拿之前的地址来用,不会浪费内存重新创建,而new关键字创建对象会发生这种浪费内存的行为。

直接创建内存图
在这里插入图片描述
记住一点:当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。

  • 不存在:创建新的
  • 存在:复用

【特别注意】:上述这个规则对于Python中的整数、字符串这些简单的对象也是适用的,但是对于列表这样比较复杂的对象就不太使用了,反正了解一下这个就可以了,这个内存地址变不变没有什么关系,增加一下奇奇怪怪的知识。

new关键字创建内存图
在这里插入图片描述
记住,每new一次就是开辟了一个新的内存空间,每new一次就会产生一个新的地址值。

(5)字符串的比较

在将字符串的比较前,我们需要先了解,java中 == 究竟比的是什么。显然前面我们已经讲过引用数据类型 == 比较的是引用。但是由于String的直接创建和new创建有点小区别在内存上(上面的内存模型),由于直接创建如果是创建已存在的直接复用,但new关键字每new一次就会产生一个新的地址。因此, 二者在混合用时 == 下面有几个细节要注意:
在这里插入图片描述
可以看到,这就有问题了。为了解决这种混合用的比较问题,java提供了专门的方法,不比较地址,比较字符串的内容。

s.equals(要比较的字符串):不忽略大小写比较(比较内容)
s.equalsIgnoreCase(要比较的字符串):不忽略大小写比较(比较内容)
String a = "Hello";
String b = "hello";
System.out.println(a.equals(b));                // false
System.out.println(a.equalsIgnoreCase(b));      // true

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

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

相关文章

【Android面试八股文】荣耀面试算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵

文章目录 1. 算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵1.1 题目描述1.2 算法实现1.2.1 步骤说明:1.2.2 算法实现1.2.3 代码实现:1.2.4 程序说明:1.2.5 示例详细讲解如何将一个矩阵顺时针旋转90度1. 算法题:输入一个N阶方…

Spring -- 三层架构

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

Oracle小白菜鸟从入门到精通教程

前言 Oracle公司&#xff08;甲骨文&#xff09;是全球最大的信息管理软件及服务供应商&#xff0c;成立于1977年&#xff0c;总部位于美国加州Redwood shore&#xff0c;面向全球开放oracle认证。Oracle开发的关系数据库产品因性能卓越而闻名&#xff0c;Oracle数据库产品为财…

Hi6274 反激式20瓦电源芯片

HI6274为高性能多模式 PWM 反激式20瓦电源芯片。HI6274较少的外围元器件、较低的系统成本可设计出高性能的"无Y"开关电源。HI6274提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、过载保护、软启动、芯片过温保护、可编程输出过压保护功能…

【Langchain大语言模型开发教程】记忆

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Langchain的历史记忆 ConversationBufferMemory 2、基于窗口限制的临时记忆 ConversationBufferWindowMemory 3、基于Token数量的临时记忆 ConversationTokenBufferMemory 4、基于历史…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

《从C/C++到Java入门指南》- 17.命令行参数

命令行参数 一直写代码的童鞋可能留意到了&#xff0c;main函数中会传入一个String args[]的字符串数组。 这个数组由JVM接收用户输入并传给main函数。 import java.util.*; public class Main {public static void main(String[] args) {for (String arg : args) {System.out…

FLINK-运行架构

为什么要学习Flink运行架构&#xff1f; 虽然现在大厂的开发工具都非常高效、只需要进行参数配置、Flink-sql写业务逻辑&#xff0c;但是在资源配置逻辑优化上不可避免需要了解底层的组件配置。面试时可能也会被问到FLINK是如何进行资源分配、作业运行的等。 以下是在学习时记录…

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…

Python学习—open函数,json与pickle知识点,Os模块详解

目录 1. Open函数 2.json与pickle模块 json模块 1. json.dumps() 2. json.dump() 3. json.loads() 4. json.load() pickle 模块 1. pickle.dumps() 2. pickle.dump() 3. pickle.loads() 4. pickle.load() 3.Os模块 1. Open函数 在Python中&#xff0c;open() 函数…

Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署

目录 环境准备 导入项目包 配置jenkins 构建项目 配置项目上线 修改项目代码测试 环境准备 本实操项目环境基于https://blog.csdn.net/Lzcsfg/article/details/140359830 首先在node01主机中操作&#xff0c;本次操作需要java8的版本&#xff0c;将之前安装的java17卸…

IoTDB 分段查询语句详解:GROUP BY + 时序语义

GROUP BY 查询子句的时序语义展开&#xff0c;IoTDB 支持的分段方式总结&#xff01; 存储的数据通过分析来发挥价值&#xff0c;当一组被存储的数据通过查询得到分析后的结果时&#xff0c;这些数据才真正在数据库中实现了价值闭环。 在关系型数据库中&#xff0c;GROUP BY 子…

陀螺仪LSM6DS3TR-C的简单使用

文章目录 一、前言二、硬件1.引脚说明2.原理图 三、软件1.IIC读写函数1.1 读函数1.2 写函数 2.初始化2.1 检测设备是否存在2.2 读取LSM6DS3TRC器件ID2.3 LSM6DS3TRC重启&#xff0c;重置寄存器2.5 LSM6DS3TRC设置块数据更新2.6 LSM6DS3TRC设置加速度计的数据采样率2.7 LSM6DS3T…

剪画小程序:刷到好听的音频怎么将音频保存到手机里

在这个短视频盛行的时代&#xff0c;相信很多朋友都和我一样&#xff0c;常常会被那些精彩视频中的背景音乐深深吸引。 比如我&#xff0c;特别喜欢听歌&#xff0c;这段时间在短视频平台上刷到了好多好看的视频&#xff0c;里面的背景音乐简直绝绝子&#xff01; 那么&#x…

【数据分享】2013-2022年我国省市县三级的逐年SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000——2022年的省市县三级的逐年PM2.5数据和2013-2022年的省市县三级的逐年CO数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国2013——2022年的省…

《样式设计011:模组-瓷片区》

描述&#xff1a;在开发小程序过程中&#xff0c;发现一些不错的案例&#xff0c;平时使用也比较多&#xff0c;稍微总结了下经验&#xff0c;以下内容可以直接复制使用&#xff0c;希望对大家有所帮助&#xff0c;废话不多说直接上干货&#xff01; 一、小程序&#xff1a;模组…

TeraTerm 使用技巧

参考资料 自分がよく使うTeratermマクロによる自動ログインのやり方をまとめてみたよTera Term マクロでログインを自動化してみたTera Term のススメ 目录 简介一. 常用基础设置1.1 语言变更1.2 log设置 二. 小技巧2.1 指定host别名2.2 新开窗口2.3 设置粘贴多行命令时的行间…

数学建模学习(111):改进遗传算法(引入模拟退火、轮盘赌和网格搜索)求解JSP问题

文章目录 一、车间调度问题1.1目前处理方法1.2简单案例 二、基于改进遗传算法求解车间调度2.1车间调度背景介绍2.2遗传算法介绍2.2.1基本流程2.2.2遗传算法的基本操作和公式2.2.3遗传算法的优势2.2.4遗传算法的不足 2.3讲解本文思路及代码2.4算法执行结果&#xff1a; 三、本文…

怎么使用动态IP地址上网

如何设置动态IP地址上网&#xff1f; 设置动态IP地址上网的步骤如下&#xff1a; 一、了解动态IP地址 动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分配给用户的IP地址&#xff0c;它会根据用户的需求和网络情况实时改变。相比于静态IP地址&#xff0c;动态…

基于术语词典干预的机器翻译挑战赛笔记 Task3 #Datawhale AI 夏令营

书接上回&#xff0c;上回在这捏&#xff1a; 基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读223次&#xff0c;点赞10次&#xff0c;收藏5次。基于术语词典干预的机器翻译挑战赛笔记Task2https://blog.csdn.net/qq_23311271/article/…