Java 字符串处理的一些小细节

STM32环境监测系统实战:从原理图到仿真完整开源方案 嵌入式系统开发中,环境监测是经典的综合实践场景,它串联起传感器采集、数据处理、外设驱动与实时响应等核心环节。单片机作为主控核心,通过GPIO、ADC、I2C等接口与温湿度、空气质量传感器协同工作,并驱动显示与告警单元,构成完整的数据链路。本文以STM32F103C8T6为平台,系统讲解环境质量监测项目的软硬件设计:从最小系统电路、DHT11与MQ-135传感器接口,到单总线时序、ADC采集与污染等级换算,再到OLED显示和蜂鸣器告警的状态机逻辑,并借助Proteus仿真验证整体功能。该项目覆盖了从原理图绘制 阅读详情

转载请注明出处:王亟亟的大牛之路

讲今天的内容之前温故一些理论知识?(部分理论知识来源于网上,谢谢开源大家庭)

1.什么是指针? 
—指针是指向内存中的地址,该地址就是存储变量的值。

2.Java中没有了指针,那以什么东西来替代指针相应的功能? 
—java中我们所谓的对象引用就是指针,只是没有像C/C++中给出了一个明确的定义。java是为了避免指针带来的使用上的麻烦,所以就使用对象的引用来代替了指针。

3.那么这些对象的引用又存放在哪? 
—java中的内存分为堆内存(heap)和栈内存(stack)。堆就是用来存放对象的,而栈则是存放一些数据基本类型的值。


一.引用

平时字面量创建就是简单的

String wjj = "Hello";
 
  • 1
  • 1

JVM检测这个字面量,这里我们认为没有内容为Hello的对象存在。JVM通过字符串常量池查找不到内容为Hello的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量wjj。

然后又给第二个对象赋值,如:

String wjj1 = "Hello";
 
  • 1
  • 1

因为在我们的常量池中已经有了hello这个对象,所以把已经存在的字符串对象的引用返回给变量wjj1。

测试下这两个对象指向同一个Hello:

 String Wjj= "Hello";
 String Wjj2="Hello";
 System.out.println(Wjj==Wjj2);
 System.out.println(Wjj.equals(Wjj2));
 结果:    
 true
 true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

那除了直接 String Wjj= “Hello”;我们还用 new String的 方式,像这样:

  String Wjj2=new String("Hello");
 
  • 1
  • 1

结果还是一样的给我们的Wjj2这个对象赋值了Hello,那么打印的结果会有区别么?

  String Wjj= "Hello";
  String Wjj2=new String("Hello");
  System.out.println(Wjj==Wjj2);
  System.out.println(Wjj.equals(Wjj2));

  结果:
  false
  true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

“==”和equals的区别只后会再加解释,基础还是很重要的哈哈!

我们可以看到当我们使用了new来构造字符串对象的时候,这两个变量指向的为不同的对象,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建。


二.修改值相同但地址不同的引用

对于上面使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量池,可以使用intern方法。

调用intern后,首先检查字符串常量池中是否有该对象的引用,如果存在,则将这个引用返回给变量,否则将引用加入并返回给变量。

String Wjj1=Wjj.intern();
System.out.println(Wjj1==Wjj);

结果:
true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

-概念: 
1.字符串常量池中存放的时引用还是对象,这个问题是最常见的。字符串常量池存放的是对象引用,不是对象。在Java中,对象都创建在堆内存中。

2.因为字符串常量池中持有了共享的字符串对象的引用,这就是说是不是会导致这些对象无法回收? 
首先问题中共享的对象一般情况下都比较小。据我查证了解,在早期的版本中确实存在这样的问题,但是随着弱引用的引入,目前这个问题应该没有了。


那么String Wjj3="a"+"b"+"c";又等于"abc"么?

   String Wjj= "abc";
   String Wjj2="a"+"b"+"c";
   System.out.println(Wjj==Wjj2);
   System.out.println(Wjj.equals(Wjj2));
   结果:
   true
   true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其实是在编译之前就已经进行了优化所以他们指向了同一个对象


三.String对象

在Java中,String对象是不可变的(Immutable)。在代码中,可以创建多个某一个String对象的别名。但是这些别名都是的引用是相同的。 
比如wjj2和wjj都是”hello”对象的别名,别名保存着到真实对象的引用。所以wjj2 = wjj

 String Wjj= "hello";
 String Wjj2=Wjj;
 System.out.println(Wjj==Wjj2);
 System.out.println(Wjj.equals(Wjj2));
 结果:
 true
 true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在Java中,唯一被重载的运算符就是字符串的拼接相关的。+,+=。除此之外,Java设计者不允许重载其他的运算符。

字符串操作的性能问题

  String s1="a" ;
  String s2="b";
  String s3="c";
  String s4=s1+s2+s3;
  System.out.println(s4);
  结果:
  abc
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

要得到上面的S4,就会S1和S2拼接生成临时一个String对象t1,内容为ab,然后有t1和s3拼接生成最终我们需要的s4对象,这其中,产生了一个中间的t1,而且t1创建之后,没有主动回收,势必会占一定的空间。如果是一个很多(假设上百个,多见于对对象的toString的调用)字符串的拼接,那么代价就更大了,性能一下会降低很多。

编译器的优化处理

真的会有上面的性能代价么,字符串拼接这么常用,没有特殊的处理优化么,答案是有的,这个优化进行在编译器编译.java到bytecode时。

一个Java程序如果想运行起来,需要经过两个时期,编译时和运行时。在编译时,Java 编译器(Compiler)将java文件转换成字节码。在运行时,Java虚拟机(JVM)运行编译时生成的字节码。通过这样两个时期,Java做到了所谓的一处编译,处处运行。

Java编译器做的优化,当Java编译器遇到字符串拼接的时候,会创建一个StringBuilder对象,后面的拼接,实际上是调用StringBuilder对象的append方法。这样就不会有我们上面担心的问题了。

SO,我们来测试一下:

    public static void main(String[] asa) {
        String value="";
        long a=System.currentTimeMillis();
        for(int k=0;k<9000;k++){
            value=value+k;
        }
        System.out.println("a的时间差= "+(System.currentTimeMillis()-a));

        StringBuilder stringBuilder=new StringBuilder();
        long b=System.currentTimeMillis();
        for(int f=0; f<9000; f++){
            stringBuilder.append(f);
        }
        System.out.println("b的时间差="+(System.currentTimeMillis()-b));
    }

结果:
a的时间差= 1137
b的时间差=4

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

性能差距明显哦!!!

Java编程中忽略这些细节,错误肯定会找上你 Java编程中忽略这些细节,错误肯定会找上你在Java编程中,细节是至关重要的。忽这些细节,错误肯定会找上你在Java编程中,细节是至关重要的。忽略甚至微小的细节可能会导致程序中的错误,这些细节,错误肯定会找上你在Java编程中,细节是至关重要的。忽略甚至微小的细节可能会导致程序中的错误,这些错误可能会在运行时引发异常这些细节,错误肯定会找上你在Java编程中,细节是至关重要的。忽略甚至微小的细节可能会导致程序中的错误,这些错误可能会在运行时引发异常或产生不正确的结果。因此,作这些细节,错误肯定会找上你在J 阅读详情

相关推荐

Java中字符串String类型的细节

Java中String类型细节 一 . String两种初始化方式1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效在字符串缓冲区中检测”abc”是否存在若存在则不重复创建,将地址赋值给str1.若不存在,则在字符串缓冲区中创建对象并赋地址给str1.2 . String str1= new String( “abc”); //构造函数初始化 或者 char [] ch={‘a’,’b’,’c’}; String str1=new String (ch);先有

我写写哈的博客 161

JAVA学习——字符串的操作以及注意事项(String)

一、字符串 String:在Java中属于引用类型。 关于String在JDK API中的描述: API描述:Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。 其实就是说:程序当中所有的双引号字符串,都是String类的对象(就算没有new也照样是)。 二、字符串的特点: 1.字符串的内容永不可变。【重点】 2. 正是因为字符串永不可变,所以字符串是可以共享使用的。 3. 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。 创建字符串的常见3+1种方式:

zhangyongbaba的博客 860

【一】Android MediaPlayer整体架构源码分析 -【初始化和创建】

本系列文章分析的安卓源码版本:【Android 10.0 版本】 一、MediaPlayer的简单调用关键流程 【这只是一个简单使用过程示例】 // 此处变量声明省略 private void play() { // 先获取SurfaceHolder mSurfaceView = findViewById(R.id.surface_view); mSurfaceHolder = mSurfaceView.getHolder(); mSurfac

CloverLHao的博客 4347

Java语言:字符串的总结和需要注意的地方

目录 String类 创建String对象 String常用方法简介 String常用方法(上) String常用方法(下) 字符串与byte数组间的转换 等于运算符与equals方法的区别 字符串的不可变性 StringBuilder概述 StringBuilder常用方法 String类 创建String对象 创建String对象不只是下面这三种方法 String常用方法简介 String常用方法(上) length(用于计算字符串的长度...

日出印象 578

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

LAMMPS实战指南 - 从in文件到分子动力学模拟的完整流程解析

本文详细解析了LAMMPS分子动力学模拟的完整流程,从理解in文件的核心作用与基础结构开始,逐步指导如何创建模拟体系、选择势函数、进行能量最小化与初始化,并深入讲解了NVT/NPT系综弛豫与生产模拟的关键步骤。文章还提供了常见问题的避坑指南与实战技巧,帮助初学者快速掌握从编写in文件到成功运行模拟的全过程。

weixin_28365523的博客 395

String的equals与contentEquals区别

String中的equals与contentEquals,这2个方法都可以用来比较String对象内容是否相同。 但是equals只能对2个String对象内容比较,否则返回false; contentEquals比较类型为java.lang.CharSequence的对象内容是否相同。 equals()源码 contentEquals()源码 常用的String、StringB...

2万+

[ROS] rviz 可视化工具

[ROS] rviz 可视化工具 摄像头没讲 文章目录[ROS] rviz 可视化工具1. todo2. todo*. 参考*. 问题解决*. rough 1. todo 2. todo *. 参考 *. 问题解决 *. rough roscore + rviz

weixin_37834269的博客 2049

java 操作字符串需注意的几个问题

1、了解“==” 和 “equals”的区别。 在java中,所有的对象名其实中一个引用,这一点在字符串比较中可以很清楚的看到。如下: String s1=new String("hello"); String s2=new String("hello"); boolean b1=(s1==s2)?true:false;//b1=false; b1=(s1.equal

gddghs 775

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 446

【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)

随着打印技术的快速发展,镭射打印技术也开始得到越来越广泛的应用。这种技术可以被用于在木材、塑料、皮革、织物等各种材料上进行图形打印,并且通常比传统机器更快、更准确和更灵活。

嵌入式技术开发 7198

【Java字符串编程避坑指南】:lines()方法中的空行处理,一个被长期误解的细节

掌握Java 11 String lines()方法对空行的处理机制,解决字符串分割时的遗漏问题。适用于日志解析、文本读取等场景,精准识别换行符边界,避免数据丢失。深入剖析JDK 11+行为变化,提供兼容性建议。值得收藏

ByteShoal的博客 628

Python 爬虫实战:手机应用商店评论数据爬取与分析

移动应用市场蓬勃发展,用户的评论数据包含了大量有价值的信息,如用户满意度、功能反馈、改进建议等。通过分析这些评论,我们可以挖掘应用的优缺点,甚至预测用户趋势。由于 Apple App Store 评论是动态加载的,我们使用。本篇博客将详细介绍如何使用 Python 爬取。爬取大量数据时,可能会遇到反爬机制。库获取 Google Play 评论。评论数据是动态加载的,需要使用。

2201_76125261的博客 2322

Java字符串处理合集

package com.feng.share; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 有关字符串处理的工具类。 * * * 这

窗边的倒影 1419

人工智能训练师三级考试大纲深度解读|理论+实操分值分布+六大模块占比

三级人工智能训练师考试分为理论和实操两大模块(各100分,合格线60分)。理论考试包含AI基础(30%)、数据标注(25%)、模型训练(20%)、测试(15%)和系统运维(10%),题型为客观题;实操考核侧重数据标注(40%)、模型测试(35%)和系统运维(25%),采用现场操作形式。复习应优先关注AI基础和数据标注等高分值模块,实操需重点掌握标准流程和结果准确性(占评分70%)。考试要求两模块均达标,理论侧重概念理解,实操强调规范执行与文档完整。

白话机器学习 1089

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JAVA——字符串的处理(总结)

创建字符串 1.创建带内容的字符buffer对象:StringBuffer s =new StringBuffer(内容)会创建一个s内容是“内容”的 2.创建一个可变的string类型:StringBuilder x = new StringBuilder(); 字符串的方法 1.将对象转换成字符串:String str=(String)obj、obj.toString()、String...

qq_35706707的博客 650

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java字符串操作及处理

Java字符串操作http://Java字符串操作。

皮皮blog 4812

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JAVA->JNI 传递字符串数组

对一些小的知识点做一点记录; 里面用了一些伪代码; java: void test_java(){         String strKey[] = new String[infoMap.size()];         String strVal[] = new String[infoMap.size()];      //给字符串填写数据;         nati

gavin_liang的专栏 1203

Java字符串处理的几个常用方法

字符串 1、获取字符串的长度 length() 2 、判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s) 后缀 endsWith(String s) 3、比较两个字符串 equals(String s) 4、把字符串转化为相应的数值 int 型 Integer.parseInt(字符串) long 型 Long.parseLong(字符串

zolalad的专栏 5984

蓝桥杯 1094 java 字符串的输入输出处理 坑点

问题 1094: 字符串的输入输出处理 时间限制: 1Sec 内存限制: 64MB 提交: 11304 解决: 3958 题目描述 字符串的输入输出处理。 输入 第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。 输出 先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依...

小渣渣的博客 651

Java编程中那些需要注意的细节

常言道:“细节决定成败”,编程更是如此。 近期,我参加的一个项目,让我体会更是如此。 这个项目属于推荐系统的一部分,我负责的一块是进行MapRedcue编程,计算视频之间的相似度!另一个同事就把我计算出来的结果用Sqoop导入到数据库中,供线上调用。 在导入数据的过程中,总是爆出java.lang.NumberFormatException异常,我认为是他那里的原因,他的Sqoop没有进行空

lsrmake的专栏 1809

Java字符串网站,Java中的字符串

Java语言中,把字符串作为对象来处理,类String就可以用来表示字符串(类名首字母都是大写的)。1.字符串常量字符串常量是用双引号括住的一串字符。例如:"Hello World"2.String表示字符串变量String用来可以创建字符串对象,String使用示例:1 String s=new String() ; //生成一个空串2 String s1="Hello World"; //...

weixin_42335570的博客 127

关于Java中的字符串

在Java字符串处理中,不不少使用length和charAt方法

tiewen的专栏 3227

Java字符串split方法的坑

先来看几行简单的Java代码,如下: System.out.println("1,2".split(",").length); System.out.println("1,2,".split(",").length); System.out.println("".split(",").length); System.out.println(",".split("...

weixin_34367257的博客 92

Java中Jackson字符串序列化和反序列化细节

Jackson是一个流行的Java库,用于序列化和反序列化JSON数据。它提供了一套强大的API,可以方便地在Java对象和JSON之间进行转换。

2401_88195314的博客 966
上一篇: 使用Handler容易产生的内存泄露以及介绍下Java的4种引用
下一篇: Vim 是什么?
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值