javaSE - 认识字符串(String class)上半部分

news2025/2/28 19:42:03

前言

字符串:
在C语言里面 是 没有字符串类型的!
但是,在 Java 和 C++ 里,有字符串类型【String】

什么是字符串?什么是字符?

在java里面有表示字符串的类 String
使用双引号,且双引号中包含任意数量的字符【“abcdef”,“a”】,就是字符串。
使用单引号,且单引号中,只包含一个字符【‘a’,‘强’】,就是字符。

注意问题

1、在java中没有以“\0”结尾这种说法,比如说:String str = “abccdef”; ,那这个str字符串里面只要“abccdef”,这几个字符,没有“\0”
2、String 不能被继承
在这里插入图片描述

一、创建字符串

1、直接赋值
2、new 对象,调用构造方法
3、将字符数组转换成字符串

1.1、直接赋值

在这里插入图片描述

1.2、new 对象,调用构造方法

在这里插入图片描述

1.3、将字符数组转换成字符串

在这里插入图片描述

在官方文档上https://docs.oracle.com/javase/8/docs/api/index.html我们可以看到 String 还支持很多其他的构造方式, 我们用到的时候去查就可以了

这是怎样去将字符数组转换成字符串的呢???
在这里插入图片描述

注意事项

“hello” 这样的字符串字面值常量, 类型也是 String.
String 也是引用类型. String str = “Hello”; 这样的代码内存布局如下
在这里插入图片描述
当我们进入String这个类里面,发现了两个属性 private int hash; 和 private final char value[ ]; 这两个属性表示的是什么意思???
在这里插入图片描述

看下面一段代码,传引用不能解决一切问题,主要看这个引用做什么

public static void func(String s, char[] array){
        s = "gaobo";
        array[0] = 'p';
    }

    public static void main(String[] args) {
        String str = "abcdef";
        char[] chars = {'b', 'i', 't'};
        func(str, chars);
    }

在这里插入图片描述

1.4、比较两个字符串(地址(==)和内容(equals方法))

例1:比较地址,用引用直接进行比较的时候,比较的是两个的地址,因为是两个不同的对象,所以这结果是false

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

在这里插入图片描述

比较两个字符串的内容是否相等

public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");
        System.out.println(str1.equals(str2));
    }

在这里插入图片描述

1.5、字符串常量池

由双引号引起的字符串就是字符串常量,比如说:“hello” ,“word”
这些由双引号引起的字符串就会放到字符串常量池里面

常见的池有:

  • 1、Class常量池:静态常量池,也叫 class文件常量池,主要存放编译期生成的各种 字面量(Literal)和符号引用(Symbolic References) 。
    字面量:例如文本字符串、fina修饰的常量。
    int b = 2; int c = "abcdefg";
    符号引用:例如类和接口的全限定名、字段的名称和描述符、方法的名称和描述符

  • 2、运行时常量池:当类加载到内存中后,JVM就会将class常量池中的内容存放到运行时常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等。
    类加载在链接环节的解析过程,会符号引用转换成直接引用(静态链接)。此处得到的 直接引用 也是放到运行时常量池中的。
    运行期间可以动态放入新的常量。

  • 3、字符串常量池:字符串常量池,也可以理解成运行时常量池分出来的一部分。类加载到内存的时候,字符串会存到字符串常量池里面。利用池的概念,避免大量频繁创建字符串。字符串常量池本质上是一个哈希表(StingTable)

  • 4、数据库连接池

  • 5、线程池

各种池,这些池有什么用???
提高效率!这么说吧,当你要创建一个数据的时候,如果池里面有那你就不用创建了,直接去池里面拿来用,这样就提高效率了,因为创建数据的时候也会浪费时间和空间

1.6、了解哈希表

唯一的不同就是,池里面的东西,是可以重复使用的,也就是说不同的字符串类型,池子里就需要一个就够了。如果一个程序里,前面和后面都用到相同的字符串,请不要怀疑,就是同一个字符串。

在这里插入图片描述

实例1:解析比较两个字符串是否相同

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

JDK1.8之后,哈希表是放在堆里面的
在这里插入图片描述

实例2

public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "hello";
        System.out.println(str1 == str2);
    }

在这里插入图片描述

实例3

public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "he" + "llo";
        System.out.println(str1 == str2);
    }

String str2 = “he” + “llo”; ,此时这个在编译的时候,就编译成"hello ",所以此时还是双引号的hello,那都是同样的常量,所以结果是true
我们可以验证一下,打开powershell 窗口,反编译一下
输入命令:javap -c + 文件名
在这里插入图片描述

实例4

public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "he";
        String str3 = str2 + "llo";
        System.out.println(str1 == str3);
    }

在这里插入图片描述

实例5

public static void main(String[] args) {
        String str1 = "11";
        String str2 = new String("1")+ new String("1");
        System.out.println(str1==str2);
    }

String str2 = new String(“1”)+ new String(“1”);
此时拼接好的 str2 还没有入池
在这里插入图片描述

实例6

public static void main(String[] args) {
        String str2 = new String("1")+ new String("1");//str2还没有入池
        String str1 = "11";
        System.out.println(str1==str2);
    }

在这里插入图片描述

实例7,手动入池

如果 我在程序中,在 str2后面加上一句代码 str2.intern(); 呢?
intern() 的作用:将它的调用者,手动入池。

public static void main(String[] args) {
        String str2 = new String("1")+ new String("1");//str2还没有入池
        str2.intern();//手动入池
        String str1 = "11";
        System.out.println(str1==str2);
    }

在这里插入图片描述

1.7、数组的整体赋值 ,在Java中,只有一次机会,就是在定义数组的时候

例1

在这里插入图片描述

例2

在这里插入图片描述

例3、被final修饰的数组,指向是不能改的

在这里插入图片描述

1.8、理解字符串不可变

字符串是一种不可变对象. 它的内容不可改变.

String 类的内部实现也是基于 char[] 来实现的, 但是 String 类并没有提供 set 方法之类的来修改内部的字符数组
在这里插入图片描述

1.8、String 类型的数据,可以通过反射修改

还是上一个程序,如果我非要把字符串"abcde"的 a 改成 g 呢?
可以,前面我们也看到,String类型的数据,是数组的形式存储在对上,既然是数组,那么我们可以通过下标去修改它,
但是问题是 value 的权限是private 是 私有的
在这里插入图片描述
所以,即使我们拿到了对象,都拿不到value的
在这里插入图片描述
但是 反射 就可以走到,反射的功能异常强大。
反射 是什么?
举一个很形象的例子:
我们每次坐地铁,我们所带的行李箱,都需要进过安检,了解过的都知道,安检的机器,会发射一中光谱的曲线,通过反射,就能知道我们的行李箱中装了什么东西。从这里就体现出了 “反射” 的 概念
在这里插入图片描述
这里是类比一下, 通过"反射"。我们能看到类里面存储的一些属性,哪怕是私有的,又或者是上锁了。我都能看到,
也就是说:通过反射,我们能获取其中所有信息。

在这里插入图片描述

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

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

相关文章

42 | iptables的使用方法

1 iptables简介 iptables是一个linux下的防火墙工具,能帮助我们基于规则进行网络流量控制。它可以做到,但不限于以下功能: 允许/拒绝某种协议的链接建立,比如TCP,UDP允许/拒绝 来自某个ip的访问允许/拒绝某个端口被访…

田径运动会成绩管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:通知类型、通知信息、裁判信息、运动员信息、项目类型、项目信息、场地信息、项目安排、报名信息、…

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集训练代码) 1. 前言 本篇博客,我们将手把手教你搭建一个基于YOLOv5的红绿灯目标检测项目。目前,基于YOLOv5s的红绿灯检测精度平均值mAP_0.50.93919,mAP_0.5:0.950.63967&…

_9LeetCode代码随想录算法训练营第九天-C++栈和队列

_9LeetCode代码随想录算法训练营第九天-C栈和队列 理论基础232.用栈实现队列225.用队列实现栈 基础知识 C标准库版本 HP STL 其他版本的C STL,一般是以HP STL为蓝本实现出来的,HP STL是C STL的第一个实现版本,而且开放源代码。P.J.Plauge…

【软件测试】测试面试,面试官其实想要的答案......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试经理 保障xxx的…

Python入门自学进阶-Web框架——29、DjangoAdmin项目应用-整表只读、自定义用户认证

一、整表只读 对于readonly_fields是对单个字段设置只读,现在要对整个表使用只读,也做成可配置的。在自己项目的admin.py中进行配置,如在mytestapp_admin.py中对Customer进行整表只读配置,在基类BaseAdmin中增加readonly_table …

juc-1-进程/线程/创建线程代码

1 场景: 1:执行的任务,短而快。不能是很耗时的任务。 2:异步写日志(日志框架底层就是)。 3:异步发送邮件,短信。 用MQ 最好。 4:多线程下载 2 进程与线程 进程: 进程&#xff1…

Centerfusion算法环境配置及模型训练

Centerfusion算法环境配置及模型训练概述1. 配置conda环境1.1 新建conda环境1.2 安装cuda1.3 安装cudnn1.4 安装pytorch1.5 安装cocoapi2. 配置Centerfusion2.1 克隆CenterFusion的github库2.2 安装依赖包2.3 安装DCNv22.4 下载nuscenes-devkit包3. 数据集准备3.1 下载数据集3.…

细粒度图像分类论文研读-2019

文章目录Cross-X Learning for Fine-Grained Visual Categorization(by end-to-end)AbstractIntroductionApproachPreliminariesCross- Category Cross-Semantic RegularizerCross-Layer RegularizerOptimizationLearning a Mixture of Granularity-Spec…

公司刚来的京东架构师:看完我写的 spring 笔记,甩给了我一份文档

Spring 是分层的 full-stack(全栈) 轻量级开源框架,以 IoC 和 AOP 为内核,提供了展现层 SpringMVC 和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多…

优维助力国内某省级商业银行同城异地灾备自动化建设

银监会在《商业银行数据中心监管指引》中明确要求“商业银行每年至少进行一次重要信息系统专项灾备切换演练,每三年至少一次重要信息系统全面灾备切换演练,以真实业务接管为目标,验证灾备系统有效接管生产系统与安全回切的能力,并…

SpringSecurity概念以及整合ssm框架

基本概念 Spring中提供安全认证服务的框架,认证:验证用户密码是否正确的过程,授权:对用户能访问的资源进行控制 用户登录系统时我们协助 SpringSecurity 把用户对应的角色、权限组装好,同时把各个资源所要求的权限信息…

毕业设计-基于大数据技术的旅游推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

前端基础(十一)_Float浮动、清除浮动的几种方法

浮动 1、什么是浮动? 目的:为了让多个块级元素在同一行显示; 文档流:可显示的对象在排列时所占的位置; 浮动:使元素脱离正常的文档流,按照指定的顺序,方向发生移动,直到…

疫情下景区管理

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):模块划分:公告类型、公告信息、用户信息、用户咨询、地区信息、景区信息、景区开放、景区预约、统计…

【Flask框架】——17 Flask蓝图

在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开? 例如从业务角度上,可将整个应用划分为用户模块单元、商品模块单元、订单…

应急响应-windows/Linux主机加固

windows/Linux主机加固 1,账户安全 首先要确保电脑上的账户均为经常使用的账户,要禁止Guest用户,禁用其他无用账户,一段时间后无反馈即可删除,同时要留意是否有隐藏账户存在。 查看本地用户和组:右键此电脑>计算机管…

PG::FunboxEasy

nmap -Pn -p- -T4 --min-rate1000 192.168.58.111 nmap -Pn -p 22,80,33060 -sCV 192.168.58.111 查看80端口的页面,未发现可用信息。 对路径进行爆破 gobuster dir -u http://192.168.58.111/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt…

Vue3 —— 使用Vite配置环境变量

文章目录 一、为什么要配置环境变量?二、在Vite中配置环境变量 1.环境变量和模式2.环境变量3.生产环境替换4.env 文件总结一、为什么要配置环境变量? 在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然…

后疫情时代,VR全景创业的应用场景有哪些?

在数字化转型的进程中,VR技术可以帮助各个行业领域的企业商家更便捷地搭建沉浸式服务体验,帮助商家提高展示以及加快企业沟通效率。后疫情时代,企业数字化转型加速发展,VR技术已经成为企业云服务的标配工具,因此VR全景…