当前位置: 首页 > news >正文

Java之字符串实践

功能概述

  • 字符串是Java编程中常用的数据类型,本文对String部分常见功能做了对应实践以及分析。

功能实践

场景1:字符串比较

用例代码

@Test
public void test_string_compare() {String s1 = "abc";String s2 = s1;String s5 = "abc";String s3 = new String("abc");String s4 = new String("abc");System.out.println("s1 == s5: " + (s1 == s5));System.out.println("s1 == s2: " + (s1 == s2));System.out.println("s1.equals(s2): " + s1.equals(s2));System.out.println("s3 == s4: " + (s3 == s4));System.out.println("s1.equals(s4): " + s1.equals(s4));System.out.println("s3.equals(s4): " + s3.equals(s4));
}

运行结果

s1 == s5: true
s1 == s2: true
s1.equals(s2): true
s3 == s4: false
s1.equals(s4): true
s3.equals(s4): true

结果分析

  • “==” 比较基本类型时,判断值是否相等,比较对象类型时,判断是否指向同一内存地址。
  • equals是比较两个对象是否一样(即所有成员的值是否相同)。
  • 字符串,如"abc"是放在常量池中的,在内存中只存在一份副本,所以s1 == s5,同一个字符串,只有一个内存地址(会在常量池中检查是否存在已有的字符串,存在时,返回原有字符串的内存地址,就不会新建新的内存地址了)。
  • s3、s4指向的对象都是通过new创建的新对象,内存地址不一样,所以比较为false。

场景2:字符串intern方法使用

用例代码

@Test
public void test_intern_v1() {// 未使用intern时String s1 = new String("aaa777");String s2 = "aaa777";System.out.println(s1 == s2);// 使用intern时String s3 = new String("aaa777");s3 = s3.intern();String s4 = "aaa777";System.out.println(s3 == s4);
}

运行结果

false
true

结果分析

  • s1是指向堆中对象的引用,s2是指向常量池中字符串的引用,所以两者的内存地址不一样。
  • intern()会查找常量池中是否存在"aaa777"的引用,若存在返回,否则把String对象添加到池中,再返回在池中的引用。

场景3:String、StringBuffer、StringBuilder性能比较

用例代码

@Test
public void test_String_StringBuffer_StringBuilder_efficiency() {testString();testStringBuffer();testStringBuilder();
}private void testString() {String s = "Hello";String s1 = "World";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {s = s + s1;}long end = System.currentTimeMillis();long runtime = (end - start);System.out.println("testString runtime:" + runtime);
}private void testStringBuilder() {StringBuilder s = new StringBuilder("Hello");String s1 = "World";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {s.append(s1);}long end = System.currentTimeMillis();long runtime = (end - start);System.out.println("testStringBuilder runtime:" + runtime);
}private void testStringBuffer() {StringBuffer s = new StringBuffer("Hello");String s1 = "World";long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {s.append(s1);}long end = System.currentTimeMillis();long runtime = (end - start);System.out.println("testStringBuffer runtime:" + runtime);
}

运行结果

testString runtime:646
testStringBuffer runtime:1
testStringBuilder runtime:0

结果分析

  • 在执行方面来看:StringBuilder最高、StringBuffer次之、String最低。

场景4:StringTokenizer字符串分割

用例代码

@Test
public void test_StringTokenizer() {StringTokenizer st2 = new StringTokenizer("Hello&World&!","&"); //指定自定义分隔符while (st2.hasMoreTokens()) {System.out.println(st2.nextToken());}
}

运行结果

Hello
World
!

结果分析

  • StringTokenizer可按指定分隔符,第字符串进行分隔。

场景5:字符串与字符数组比较

用例代码

@Test
public void test_string_with_char_array_compare() {String s = "hello";String t = "hello";char c[] = {'h','e','l','l','o'};System.out.println(s.equals(t));System.out.println(t.equals(c));System.out.println(s == t);System.out.println(t.equals(new String("hello")));String s1 = "he" + "llo";System.out.println(s == s1);
}

运行结果

true
false
true
true
true

结果分析

  • s.equals(t)值为true:因为"hello"会存在堆中的字符串常量池中,并且按照享元模式,判断字符串是否存在,不存在才创建,所以s、t是同一个字符串引用
  • t.equals©值为false:按照String重写的equals方法,会判断入参是否为String类型,若不是则返回false
  • s == t值为true:==比较的是引用,因为s、t是同一个引用,所以相等
  • t.equals(new String(“hello”))值为true:因为String的比较逻辑,会去字符串中的字符数组来比较,字符都相等,则返回true
  • s == s1值为true:因为"he" + “llo"在编译器就会转化"hello”,存在常量区,因为s已经放在常量池中,与s1不会创建新的字符串,s与s1是同一个字符串引用

功能总结

  • String常量池采用了享元模式(Flyweight)即会共享字符串,判断字符串是否存在,若存在则使用,否则新创建。常量池:它是一个由数组组成的表,用来存储程序中使用的各种常量,包括Class、String、Integer等各种基本的Java数据类型

  • intern()方法分析:(intern:助理、实习生)

    • intern方法主要把字符串放入字符串常量池中。有两种情况,会将字符串放在常量池中

      • 直接使用双引号声明的String对象会直接存储在常量池中,如:String s1 = “aa” 。
      • 通过调用String提供的intern方法把字符串放在常量池中,会检查字符串在常量池中是否存在,存在则不处理,若不存在则放入字符串常量池中。
    • Returns a canonical representation for the string object. (jdk中的描述)

      • 根据jdk中描述:intern()会返回字符串对象的规范标识,即会从常量池中查找指定字符串,若能找到则返回对应引用,否则把String对象添加到池中,再返回在池中的引用。
    • 注明

      • a)字符串放入字符串常量池,需要满足上面所说的两种情况。
      • b)并不是调用了intern就会将字符串放入字符串常量池中,会先检查字符串是否存在,若存在则不处理。若不存在,要看字符串在堆中是否已存在,已存在只存对象引用,减少对象的创建 c)字符串常量池,在jdk1.7后就从Perm区迁移到堆中,这样对于字符串常量池中可以存对象引用,减少了对象的创建,就大大减少了字符串所占的空间了。
  • String、StringBuilder、StringBuffer使用总结:

    • 如果要操作的数据量比较小,优先使用String类(量多的话,String本质是使用StringBuilder处理的,会产生许多临时对象,触发垃圾回收,影响性能)
    • 如果是单线程下处理大量数据,优先使用StringBuilder类(StringBuilder是线程不安全的,单线程下可以使用,减少线程同步的开销)
    • 如果是多线程下处理大量数据,优先使用StringBuffer类(因为是线程安全的)

相关文章:

Java之字符串实践

功能概述 字符串是Java编程中常用的数据类型&#xff0c;本文对String部分常见功能做了对应实践以及分析。 功能实践 场景1&#xff1a;字符串比较 用例代码 Test public void test_string_compare() {String s1 "abc";String s2 s1;String s5 "abc&quo…...

BM20 数组中的逆序对

描述 解题思路&#xff1a;归并排序 分治&#xff1a;分治即“分而治之”&#xff0c;“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题&#xff0c;子问题继续按照这样划分&#xff0c;直到问题可以被轻易解决&#xff1b;“治”指的是将子问题单独进…...

高德猎鹰轨迹查询相关接口

高德猎鹰轨迹官网&#xff1a;服务管理-API文档-开发指南-猎鹰轨迹服务 | 高德地图API 轨迹查询 httpclient的post // post方法请求 创建轨迹 private static void createTrace() {String key "高德注册的key";String sid "服务id"; // 服务idString…...

整理总结新手开始抖音小店经营:常见问题及解决办法

抖音小店作为一种新兴的电商模式&#xff0c;在短时间内获得了广泛的关注和使用。然而&#xff0c;对于新手来说&#xff0c;抖音小店经营可能会遇到一些问题。下面是四川不若与众总结的一些常见的问题以及相应的解决办法。 问题一&#xff1a;产品选择困难 对于新手来说&#…...

4-1-netty

非阻塞io 服务端就一个线程&#xff0c;可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件...

hive 动态分区-动态分区数量太多也会导致效率下降只设置非严格模式也能执行动态分区

hive 动态分区-动态分区数量太多也会导致效率下降&只设置非严格模式也能执行动态分区 结论 在非严格模式下不开启动态分区的功能的参数&#xff08;配置如下&#xff09;&#xff0c;同样也能进行动态分区数据写入&#xff0c;目测原因是不严格检查SQL中是否指定分区或者…...

java八股文面试[JVM]——JVM调优

知识来源&#xff1a; 【2023年面试】JVM性能调优实战_哔哩哔哩_bilibili...

FairyGUI-Unity 异形屏适配

本文中会修改到FairyGUI源代码&#xff0c;涉及两个文件Stage和StageCamera&#xff0c;需要对Unity的屏幕类了解。 在网上查找有很多的异形屏适配操作&#xff0c;但对于FairyGUI相关的描述操作很少&#xff0c;这里我贴出一下自己在实际应用中的异形屏UI适配操作。 原理 获…...

Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

在启动oracle的服务OracleOraDb11g_home1TNSListener时&#xff0c;提示服务启动后又停止了。 解决方法&#xff1a; 修改oracle安装目录下的两个配置文件&#xff1a; 以上两个文件&#xff0c;对应的HOST的值&#xff0c;都改为127.0.0.1 然后再启动服务&#xff0c;启动成…...

Spring复习:(58)<context:annotation-config/>的作用

引入如下的BeanPostProcessor • ConfigurationClassPostProcessor • AutowiredAnnotationBeanPostProcessor • CommonAnnotationBeanPostProcessor • PersistenceAnnotationBeanPostProcessor • EventListenerMethodProcessor如果xml文件配置了bean中使用了Autowired注解…...

“东方杯”英特尔oneAPI黑客松大赛—参赛经验分享

目录 前言1、大赛要求2、oneMKL介绍3、准备 oneMKL基本使用1、下载&#xff1a;2、安装&#xff1a;3、初始化oneMKL环境&#xff1a;4、编译代码5、运行 所需的头文件使用oneMKL工具生成随机数使用fftw3计算FFT调用oneMKL API加速计算FFT对比两种方法的准确性输出结果结束语 前…...

win10家庭版远程桌面补丁_rdp wrapper

RDP Wrapper Library 就是可以帮你在 Windows 7、Windows 8、Windows 10 家庭版中打开远程桌面的工具。 1、把电脑上打开的安全软件与杀毒软件都关掉&#xff0c;因为这个远程桌面补丁会修改系统文件&#xff0c;所以安全软件可能会拦截。 2、下载RDP Wrapper Library补丁压缩…...

【C++设计模式】开放-封闭原则

2023年8月27日&#xff0c;周日下午 我觉得我的这篇博客还是写得很不错的&#xff0c;哈哈哈。 目录 概述举例说明用开放-封闭原则重构 概述 开放-封闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的一个重要原则&#xff0c;也是许多…...

vue+file-saver+xlsx+htmlToPdf+jspdf实现本地导出PDF和Excel

页面效果如下&#xff08;echarts图表按需添加&#xff0c;以下代码中没有&#xff09; 1、安装插件 npm install xlsx --save npm install file-saver --save npm install html2canvas --save npm install jspdf --save2、main.js引入html2canvas import htmlToPdf from …...

axios 进阶

axios 进阶 接口传参方式 使用 xhr 原生技术或者是 axios 时&#xff0c;它的 post 传参方式是键值对的形式 keyvalue。但是在实际开发中一般是使用对象的形式定义数据&#xff0c;方便读取和赋值。所以当我们需要发起请求时可以通过 qs 这一款插件将对象转成键值对形式&…...

Redis限流实践:实现用户消息推送每天最多通知2次的功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…...

uniapp 存储base64资源为http链接图片

1. 新建一个base64.js 文件 const fsm wx.getFileSystemManager(); // base64data base64资源 // name 文件名 function base64src(base64data, name, cb) {const time new Date().getTime();const filePath ${wx.env.USER_DATA_PATH}/${name}.${time}.png;const buffer …...

列表类控件虚拟化

WPF列表控件提供的最重要的功能是UI虚拟化&#xff08;WPF编程宝典说的&#xff09;。所有的WPF列表控件&#xff08;所有继承自ItemsControl的控件&#xff0c;包括ListBox、CombBox、ListView、TreeView、DataGrid&#xff09;都支持UI虚拟化。 UI虚拟化的支持实际上没有被构…...

c# 多线程Task.Run 取消正在执行的多线程

c# 异步处理&#xff0c;上次处理没有完成&#xff0c;下次有紧接着处理多线程出错 在 C# 中进行异步处理时&#xff0c;确保处理上一个任务完成后再处理下一个任务是很重要的&#xff0c;特别是在涉及多线程的情况下。如果上一个任务尚未完成&#xff0c;而下一个任务又开始执…...

sql server 如何设置主键

开始之前 限制和局限 一个表只能包含一个 PRIMARY KEY 约束。 在 PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL。 如果没有指定为 Null 性&#xff0c;则加入 PRIMARY KEY 约束的所有列的为 Null 性都将设置为 NOT NULL。 创建主键会自动创建相应的唯一群集索引、…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...