Java中的String

字符串常量的存储位置:常量池

  1. 常量池中不允许存放两个相同的字符串常量,如果定义的两个字符串值相同,那么他们指向的是同一个地址
    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1 == s2); // true
    
  2. 常量池在jdk7版本之前是存放在方法区中的;jdk7及之后就放进了中。为什么会有这样一个变化?是因为堆中垃圾回收机制处理的比较频繁,而方法区中一般存放类,不会经常的垃圾回收,所以为了防止内存泄漏,就放进了堆中。

String的不可变性

  1. 当对字符串常量重新赋值时,是在常量池中开辟一块新空间,将新地址赋给了变量
    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1 == s2); // true
    s2 = "h1"; // 新地址
    System.out.println(s1 == s2); // false
    
  2. 当对字符串常量做拼接或replace操作时,是在中开辟一块新空间(底层调用的是new String,则会在堆中开辟空间),将新地址赋给了变量
    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1 == s2); // true
    s2 += " world";
    String s3 = s1.replace("l", "w");
    System.out.println(s1); // hello
    System.out.println(s2); // hello world
    System.out.println(s1 == s2); // false
    System.out.println(s3); // hewwo
    

String s = new String("hello");在内存中创建了2个对象

  1. 第一个:在堆中创建的String类型的对象
  2. 第二个:在字符串常量池中创建的字面量,内部存放了字符串的byte型数组
    注:如果在常量池中已经存在同名的字符串,则只会创建第一个对象,然后直接指向的是那个字符串的地址值

String s1 = "hello world";与String s2 = "hello" + "world";的区别

二者最终都指向的是常量池中的同一个地址,因为后者在编译完之后就变成前者那样了

final修饰的String,可以看成是一个常量,因此会在字符串常量池中直接创建

final String s1 = "hello";
String s2 = "hello world";
String s3 = s1 + " world";
System.out.println(s2 == s3); // true

String中的常用方法

  1. isEmpty():判断字符串是否为空

    String s1 = "";
    String s2 = new String("");
    String s3 = new String();
    System.out.println(s1.isEmpty()); // true
    System.out.println(s2.isEmpty()); // true
    System.out.println(s2.isEmpty()); // true
    
  2. length():返回字符串的长度

  3. concat(String s):拼接两个字符串,返回一个新字符串(会在堆中new String()

    String s1 = "hello";
    String s2 = "world";
    String s3 = "helloworld";
    String s4 = s1.concat(s2);
    String s5 = "hello".concat(s2);
    System.out.println(s3 == s4); // false
    System.out.println(s3 == s5); // false
    System.out.println(s4 == s5); // false
    
  4. equals(String s):判断两个字符串的内容是否相同,区分大小写

    String s1 = "hello";
    String s2 = "Hello";
    System.out.println(s1.equals(s2)); // false
    
  5. equalsIgnoreCase(String s):判断两个字符串的内容是否相同,不区分大小写

    String s1 = "hello";
    String s2 = "Hello";
    System.out.println(s1.equalsIgnoreCase(s2)); // true
    
  6. compareTo(String s):比较两个字符串的大小,按照ASCII比较,区分大小写,前者大返回正数,后者大返回负数,相同返回0;

    String s1 = "f";
    String s2 = "ABC";
    String s3 = "acd";
    String s4 = "f";
    System.out.println(s1.compareTo(s2)); // 37
    System.out.println(s2.compareTo(s3)); // -32
    System.out.println(s1.compareTo(s4)); // 0
    
  7. compareToIgnoreCase(String s):与compareTo的区别是不区分大小写

    String s1 = "abc";
    String s2 = "ABC";
    System.out.println(s1.compareToIgnoreCase(s2)); // 0
    
  8. toUppercase()和toLowerCase():将字符串全部转为大写/小写

  9. trim():去除字符串前后空格

  10. intern():返回字符串常量中的地址,存在返回地址,不存在会生成一个字面量并返回

    String s1 = "hello";
    String s2 = "hello world";
    String s3 = s1 + " world";
    System.out.println(s2 == s3); // false
    String s4 = s3.intern();
    System.out.println(s2 == s4); // true
    
  11. contains(String s):判断字符串中是否包含s

    String s1 = "hello";
    System.out.println(s1.contains("llo")); // true
    
  12. indexOf(String s, int fromIndex):【从前往后】判断s在字符串中首次出现的索引位置,未找到返回-1;第二个参数是可选参数,表示从下标为fromIndex的位置开始寻找

    String s1 = "hello world";
    System.out.println(s1.indexOf("o")); // 4
    System.out.println(s1.indexOf("f")); // -1
    System.out.println(s1.indexOf("o", 5)); // 7
    
  13. lastIndexOf(String s, int fromIndex):【从后往前】其他与indexOf功能一致

    String s1 = "hello world";
    System.out.println(s1.lastIndexOf("o")); // 7
    System.out.println(s1.lastIndexOf("o", 6)); // 4
    
  14. substring(int beginIndex, int endIndex):按照区间[beginIndex, endIndex)截取字符串,第二个参数是可选参数,不写的话,从beginIndex开始,截取到末尾

    String s1 = "abc123def";
    System.out.println(s1.substring(3)); // 123def
    System.out.println(s1.substring(3, 6)); // 123
    
  15. charAt(int index):取出指定索引的字符

    String s1 = "abcdef";
    System.out.println(s1.charAt(2)); // c
    
  16. toCharArray():将字符串转为char型数组

    String s1 = "hello";
    char[] arr = s1.toCharArray();
    for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t"); // h e l l o	
    }
    
  17. String.valueOf(char[] arr):将char[]转为String

  18. startsWith(String s, int index):判断字符串是否以s字符串开头的,第二个参数是可选的,表示从index索引位置开始判断是否以s字符串开头

    String s1 = "abcbef";
    System.out.println(s1.startsWith("a")); // true
    System.out.println(s1.startsWith("b", 3)); // true
    
  19. endsWith(String s):判断字符串是否以s字符串结束的

    String s1 = "hello word";
    System.out.println(s1.endsWith("d")); // true
    
  20. replace(old, new):将old字符或字符串替换为new,返回一个新字符串

    String s1 = "hello world";
    System.out.println(s1.replace("wor", "QQQQQQ")); // hello QQQQQQld
    

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

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

相关文章

【教程】Git 标准工作流

前言 Git 是日常开发中常用的版本控制工具&#xff0c;配合代码托管仓库&#xff08;如&#xff0c;Github&#xff0c;GitLab&#xff0c;Gitee 等&#xff09;用来实现多人多版本的协作开发。 但是 Git 的命令纷繁复杂&#xff0c;多如累卵&#xff0c;不可能也不需要全部搞…

Vue 3 Vite 项目打包优化:自动删除指定文件的方法

程序员必备宝典https://tmxkj.top/#/ 在 Vue 3 项目中&#xff0c;如果你需要在打包之前删除指定的文件&#xff0c;可以使用 Node.js 的 fs 模块来实现。这可以通过在 vue.config.js 文件中配置一个自定义的 Webpack 插件来完成。 1.安装必要的依赖&#xff08;如果还没…

前端通过nginx部署一个本地服务的方法

前端通过nginx部署一个本地服务的方法&#xff1a; 1.下载ngnix nginx 下载完成后解压缩后运行nginx.exe文件 2.打包你的前端项目文件 yarn build 把生成的dist文件复制出来&#xff0c;替换到nginx的html文件下 3.配置conf目录的nginx.conf文件 主要配置server监听 ser…

Windows下Jenkins自动启动jar包

本来以为是挺简单的一件事&#xff0c;没想到折腾了这么久&#xff0c;遇到各种坑&#xff0c;记录一下&#xff1a; set BUILD_IDdontkillmyass set port9035 for /f "tokens1-5" %%i in (netstat -ano ^|findstr ":%port%") do ( echo kill the pro…

【网络面试篇】TCP与UDP类

目录 一、综述 1. TCP与UDP的概念 2. 特点 3. 区别 4. 对应的使用场景 二、补充 1. 基础概念 &#xff08;1&#xff09;面向连接 &#xff08;2&#xff09;可靠的 &#xff08;3&#xff09;字节流 2. 相关问题 &#xff08;1&#xff09;TCP 和 UDP 可以同时绑定…

DNS(Domain Name System)解析过程

DNS&#xff08;Domain Name System&#xff09;解析过程大致如下&#xff1a; 客户端发起请求 当用户在浏览器等应用中输入域名&#xff08;如www.example.com&#xff09;时&#xff0c;客户端&#xff08;如电脑、手机等设备上的浏览器应用&#xff09;首先会检查自身的缓…

【触想智能】工业平板电脑在智能教育设备上的应用优势分析

随着科技的快速发展&#xff0c;智能教育设备成为现代教育领域的新宠。其中&#xff0c;工业平板电脑作为一种重要的智能教育设备&#xff0c;正逐渐在教育领域得到广泛应用。 工业平板电脑在智能教育设备上的应用具有以下几个优势。 1、工业平板电脑具备便携性。相比传统的教学…

java项目之协力服装厂服装生产管理系统的设计与实现(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的协力服装厂服装生产管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; …

华为认证到底管用不?有人说巨坑,有人说不可或缺

华为认证在找工作时确实是个加分项&#xff0c;下面来详细聊聊它在求职路上的好处&#xff1a; 首先&#xff0c;增加竞争力 华为认证是华为推出的专业技能认证&#xff0c;能证明你在华为技术领域的实力。有了这个认证&#xff0c;你在求职市场上的竞争力自然更强&#xff0c…

C语言之写一个修改数组内容的函数

问题代码: 函数ltrim是为了消除buf字符数组中左边空格&#xff0c; memmove函数介绍 如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼&#xff0c;你会发现为什么需要返回&#xff0c;buf不用接收返回值&#xff0c;执行这个函数后buf中的内容就已经…

基于SSM+VUE宠物医院后台管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

Cisco Packet Tracer 8.0 路由器静态路由配置

文章目录 静态路由简介一、定义与特点二、配置与命令三、优点与缺点四、应用场景 一&#xff0c;搭建拓扑图二&#xff0c;配置pc IP地址三&#xff0c;pc0 ping pc1 timeout四&#xff0c;配置路由器Router0五&#xff0c;配置路由器Router1六&#xff0c;测试 静态路由简介 …

代码上线经常出问题 正常吗

代码上线后经常出现问题并不是一个正常现象。虽然软件开发过程中难免会遇到错误和缺陷&#xff0c;但频繁的代码上线问题通常指示了开发、测试或部署流程中的某些不足之处。 以下是一些可能导致代码上线经常出问题的原因&#xff0c;以及相应的改进建议&#xff1a; 代码质量…

MPSK(BPSK/QPSK/8PSK)调制解调的Matlab仿真全套

一、概述 MPSK(BPSK、QPSK、8PSK)等是常用的相位调制方式,本文对数据获取、比特流组织、基带调制、上变频发送、添加噪声、接收下变频、基带解调、数据还原等过程进行仿真。 模块化、通用化设计,将函数分为(1)数据读取转比特流;(2)基带调制【参数控制调制类型】;(…

Python-创建并调用自定义文件中的模块/函数

背景&#xff1a;在Python编程中&#xff0c;我们常常需要创建自己的专属文件&#xff0c;以便帮助我们更高效&#xff0c;快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件&#xff0c;通常是指调用自己编写的Python模块…

CSS 动画:网页设计的动态之美

CSS 动画&#xff1a;网页设计的动态之美 CSS 动画是现代网页设计的重要组成部分&#xff0c;它能够让网页元素动起来&#xff0c;创造出更加生动和吸引人的用户体验。本文将深入探讨 CSS 动画的原理、应用和最佳实践&#xff0c;帮助读者掌握这一强大的网页设计工具。 什么是…

基于STM32的智能窗帘控制系统设计

引言 本项目将基于STM32微控制器设计一个智能窗帘控制系统&#xff0c;用户可以通过按钮或遥控器控制窗帘的开关&#xff0c;并且系统能够根据光照强度自动调节窗帘的开合状态。该项目展示了STM32微控制器在家居自动化中的应用&#xff0c;以及与光照传感器、直流电机和红外接…

鸿蒙ArkTS中的image组件

开发文档很详尽&#xff0c;就在DevEco中的API参考&#xff0c;可以随时调出来进行学习。 在鸿蒙官网也有非常详尽的资料&#xff0c;地址&#xff1a;开发说明-API参考概述 - 华为HarmonyOS开发者 (huawei.com) 这里&#xff0c;就学习image组件的一般用法以及使用SVG图标和字…

opencv 图像预处理

图像预处理 ​ 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;以下是一些常见的图像预处理操作&…

kafka里的consumer 是推还是拉?

大家好&#xff0c;我是锋哥。今天分享关于【kafka里的consumer 是推还是拉&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka里的consumer 是推还是拉&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消费者&…