表达式陷阱(字符串,表达式类型,输入法,注释字符,转义字符,正则表达式)

Java 转义字符全解析:从基础语法到安全编码实践 转义字符是以反斜杠开头的特殊字符序列,用于表示那些无法直接输入或具有特殊含义的字符。换行符无法在字符串中直接“换行”,需用\n表示双引号在字符串中会提前结束字符串,需用\"转义Java 编译器在编译期就会将这些转义序列转换为对应的字符或字节。转义字符看似微不足道,却贯穿于 Java 开发的每一个角落——从最简单的println到最复杂的 Web 安全防护。掌握它,你不仅能写出正确运行的代码,更能构建安全可靠的系统。“优秀的程序员,既关注宏大的架构,也敬畏微小的细节。 阅读详情

1.    表达式中的陷阱

1.1  关于字符串的陷阱

1. 在创建一个String s = new String("java");的时候,JVM会到常量池中去检查看是否有一个"java"对象了,如果没有则在常量池中创建一个。之后会在堆内存中分配了一个空间,放置这个new出来的String对象,形式如下:java.lang.String@123b, 常量池是在编译期生成的,而new一个对象是在运行时进行的,有一个先后顺序。

2. Java程序中创建对象的常规方式有如下四种:

ü  通过new调用构造器创建java对象。

ü  通过Class对象的newInstance()方法调用构造器创建java对象。

ü  通过java的反序列化机制从IO流中恢复java对象。

ü  通过java对象提供的clone()方法复制一个新的java对象。

3. 对于java程序中的字符直接量,JVM会使用一个字符串池来保存它们:当第一次使用某个字符串直接量时,JVM会将它放入字符串池进行缓存。在一般情况下,字符串池中字符串对象不会被垃圾回收,当程序再次需要使用字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的字符串。

4. 关于以直接量的方式来创建java对象的一些问题:

String str1 = "liyafang";
	     String str2 = "liyafang";
	     System.out.println(str1==str2);//true
	     //虽然str4的值不是直接量,但因为它的值可以在编译时确定,
	     //所以str4也会直接引用字符串池中对应的字符串。
	     String str3 = "liyafang2";
	     String str4 = "li"+"yafang"+2;//只创建了一个字符串对象
	     System.out.println(str3==str4);//true
	     //str6的值包含了方法调用,不能再编译时确定,所以无法利用JVM的字符串池
	     String str5 = "liyafang8";
	     String str6 = "liyafang"+"liyafang".length();
	     System.out.println(str5==str6);//false
	     //str8的值使用了变量,不能再编译时确定,所以无法利用JVM的字符串池
	     int len = 1;
	     String str7 = "liyafang1";
	     String str8 = "liyafang"+len;
	     System.out.println(str7==str8);//false
	     //字符串连接运算中的所有变量都可执行"宏替换",
	     //那么JVM一样可以在编译时就确定字符串连接表达式的值
	     final String temp = "li";
	     String str9 = "liyafang";
	     String str10 = temp+"yafang";
	     System.out.println(str9==str10);//true
	     final int leng = 8;
	     String str11 = "liyafang8";
	     String str12 = "liyafang"+leng;
	     System.out.println(str11==str12);//true

 

5.       不可变的字符串:

			String str = "I";
	 		System.out.println(System.identityHashCode(str));
	 		//该静态方法用于获取某个对象唯一的hashCode值,这个方法的返回值与该类是否重写
	 		//hashCode方法无关。只有当两个对象相同时,它们的identityHashCode值才会相等。
	 		str = str+" love ";
	 		System.out.println(System.identityHashCode(str));
	 		str = str+"java!";
	 		System.out.println(System.identityHashCode(str));



运行结果:

31843011

25860399

5184781

看起来str对应的字符串序列可以发生改变。但是要记住,str只是一个引用类型变量,它并不是真正的String对象,只是指向String对象而已,真正发生改变的是str变量本身,它改变了指向,指向了一个新的String对象。以上程序总共会创建3个字符串对象,“I”,“I love ”,“I love java!”,其中前两个将一直存在于字符串常量池中-这就是java内存泄漏的原因之一。

6.优先考虑使用StringBuilder:

其与StringBuffer唯一的区别在于StringBuffer是线程安全的,也就说StringBuffer类里绝大部分方法都增加了synchronized修饰符。在单线程环境下,优先考虑StringBuilder,因其效率高。

7.String类实现了Comparable接口:

可以通过compareTo()方法比较两个字符串之间的大小,当两个字符串所包含的字符序列相等时,返回值为0。比较规则:先将两个字符串左对齐,然后从左向右依次比较两个字符串所包含的每个字符,包含较大字符的字符串的值比较大。

1.2  表达式类型的陷阱

1.表达式类型的自动提升:

byte->short;

short,char->int->long->float->double

eg: short a = 5; a = a -2;此时将会发生错误,因为int赋给short类型的变量将发生错误。

2.复合赋值运算符的陷阱:

    short a = 5; a -=2; 没有错误,根据java语言规范,复合赋值运算符包含了一个隐式的类型转换,所以a-=2等价于a = (a的类型)(a-2);与此类似的有+=,*=,/=,%=,<<=,>>=,>>>=,&=,^=和|=等。

    再看下面这个例子:

             short st = 15;

             st += 90000;

             System.out.println(st);//输出结果不是900015,而是24479

    因为short类型的变量只能接受-32768~32767之间的整数,因此上面程序会将高位“截断”。

    复合赋值运算符简单,方便,而且具有性能上的优势,但复合赋值运算符可能有一定的风险:它潜在的隐式类型转换可能不知不觉中导致计算结果的高位被截断,为了避免潜在的危险,如下情况需要额外注意:

    将复合赋值运算符应用于byte,short,char等类型的变量;应用于int类型的变量,而表达式右边是long,float,double类的值;应用于float类型的变量,而表达式右侧是double类型的值。

    当+用于字符串连接符时,则+=的变量只能是String类型的,而不可是String的父类型(如Object或CharSequence)。

1.3  输入法导致的陷阱

基本上如果在编译java程序时提示形如:“非法字符:\xxxxx”的错误提示,那么就可断定该java程序中包含“全角字符”,逐个删除他们即可。

1.4  注释的字符必须合法

Java要求注释中所有的字符必须是合法的字符。Java程序允许直接使用\uXXXX的形式代表字符,它要求\u后面的4个字符必须是0~F字符,如果注释中出现“\unit5”,这不符合java对Unicode转义字符的要求。

1.5  转义字符的陷阱

Java程序提供三种方式表示字符:

直接使用单引号括起来的字符值,如’a’;

使用转义字符,如’\n’;

使用Unicode转义字符,如’\u0062’。

不过转移字符得慎用,如下:

System.out.println(“abc\u000a”.length());这句话无法通过编译,提示:未结束的字符串字面值。引起这个原因是java对Unicode转移字符不会进行任何特殊的处理,只是简单的将其替换成相应的字符。对于\u000a而言,相当于一个换行符(\n),因此上边的程序相当于:

System.out.println(“abc

”.length());

这样就不难理解出现的编译错误了。

类似的情况如下边的注释将通不过编译:

//\u000a代表一个换行符。

因为对于java编译器来说相当于

//

代表一个换行符。

1.5  正则表达式的陷阱

以下程序不会输出任何东西,想想为什么?

String str = "www.baidu.com";

                   String[] str1 = str.split(".");

                   for(String s:str1){

                            System.out.println(s);

                   }

从JDK1.4开始,java的String类提供了split()方法进行字符串的分割。JDK1.0原来提供的StringTokenizer基本上已经成为“历史遗物”了。

对于上面的程序,需要注意两点:

1.String提供的split(String regex)方法需要的参数是正则表达式;

2.正则表达式中的点号(“.”)可以匹配任意字符。

所以上面程序实际上不是以“.”作为分隔符,而是以任意字符作为分隔符。为了实现以“.”作为分隔符的目的,必须对“.”号进行转义,将上面的程序改为

String[] str1 = str.split("\\.");即可得到想要的结果。

从JDK1.4开始,Java加入了对正则表达式的支持,String类也增加了一些方法用于支持正则表达式,具体方法如下:

matches(String regex):判断该字符串是否匹配指定正则表达式。

String replaceAll(String regex,Stringreplacement):将字符串中所有匹配指定正则表达式的子串替换成replacement后返回。

String replaceFirst(String regex,Stringreplacement):将字符串中第一个匹配正则表达式的子串替换成replacement后返回。

String[] split(String regex):以regex正则表达式匹配的子串作为分割符来分割该字符串。

replace(CharSequence target,CharSequencereplacement):将字符串中所有target子串替换成replacement后返回。这个普通的replace()方法不支持正则表达式,开发中必须区别对待replaceAll和replace两个方法。

例如:

                   String str = "www.baidu.com";

                   String str1 = str.replace(".", "\\");

                   String str2 = str.replaceAll("\\.", "\\\\");

                   System.out.println(str1);//输出结果:www\baidu\com

                   System.out.println(str2);//输出结果:www\baidu\com












        
反斜杠的深度解析:从转义字符到跨平台编程的核心原理与实践 在计算机编程与数据处理中,转义字符是一种基础且关键的语言构造,它通过赋予特定字符序列特殊含义,实现对非打印字符、特殊符号的表示与控制。其核心原理在于词法分析阶段,编译器或解释器对源代码中的转义序列进行预处理,将其转换为内存中的实际值。这一机制的技术价值在于确保了代码的精确表达与数据的安全传输,是构建健壮软件的基础。在应用场景上,转义字符广泛应用于字符串处理、正则表达式匹配、文件路径操作以及数据序列化(如JSON)等领域。本文聚焦于反斜杠(\)这一典型代表,深入剖析其在正则表达式(涉及元字符控制与模式匹配)和 阅读详情

相关推荐

Java中读取并提取文件内引号包围的字符串实战详解

别用敷衍事!做个专业的@Override带上行号、位置、原始内容,排查问题快如闪电⚡️。回头看,我们从最简单的FileReader出发,逐步深入到状态机、转义处理、国际化适配、异常恢复,最终构建了一个完整可靠的引号提取系统。这背后体现的是一种工程思维:把复杂问题拆解成小模块,每个模块做到极致,最后组合成强大系统。更重要的是,我们没有依赖任何第三方库,完全掌控每一个细节。这种能力,在关键时刻能救你一命。

weixin_34598113的博客 994

Java表达式的陷阱——关于字符串的陷阱

1、关于字符串的陷阱        字符串是Java程序中使用最广泛的一种对象,虽然它具有简单易用的特征,但是实际使用字符串时也会有一些潜在的陷阱,这些陷阱往往会给实际开发带来潜在的困扰。 1、1 JVM对字符串的处理 String str = new String("Java对象");       对于上面常见的Java语句,常见的问题是,上面语句创建了几个字符串?答案是:上面的

Never_Blue的博客 655

pycharm添加Anaconda解释器显示不出来

因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。

2202_75803271的博客 4006

No.5 表达式中的陷阱

1. 关于字符串的陷阱 JVM对字符串的处理 String java = new String("Java");创建了几个对象? 2个。“Java”直接量对应的字符串对象;new String()构造器返回的字符串对象 java.intern()可以字符串池中的直接量对象。 字符串及基本类型的包装类,Java允许通过直接量的方式来创建对应的Java对象;...

146

无符号整数、带符号整数溢出问题

让我们详细讲解一下带符号整数溢出和无符号整数溢出问题中,符号标志位 (SF)、零标志位 (ZF) 和进位标志位 (CF) 的行为方式

weixin_49342084的博客 2084

Win11系统下Abaqus 2025子程序开发环境一站式配置指南

本文详细介绍了在Win11系统下配置Abaqus 2025子程序开发环境的完整流程,包括VS2022和Intel oneAPI的安装与优化,以及Abaqus 2025的目录规划与环境联调。通过避坑指南和实战案例,帮助用户高效完成开发环境配置,避免常见错误,提升工作效率。

weixin_28717431的博客 332

Java转义字符

文章系统介绍了Java中各类转义字符的用法,包括标准转义序列(如\n、\t)、Unicode转义(\u)以及特殊场景应用。重点讲解了字符串处理、正则表达式、文件路径中的常见陷阱与正确写法,并提供了ANSI颜色输出、SQL处理等高级应用示例。文章还强调了编译时处理机制、性能优化建议,推荐使用专用库处理HTML/XML/JSON等结构化数据。最后指出合理使用转义字符对代码质量、安全防护的重要价值,是Java开发者必须掌握的核心技能。

weixin_74120671的博客 2940

【网络】Ikuai中如何添加/更换虚拟机(图文)

Ikuai 添加虚拟机教程

qq_20623849的博客 6533

Java转义字符,零基础入门到精通,收藏这篇就够了

转义字符(Escape Character)是以反斜杠()开头,后跟一个或多个字符的特殊序列,用于表示无法直接输入的字符或具有特殊含义的字符。掌握Java转义字符是成为专业开发者的必备技能。正确处理特殊字符提高代码可读性避免安全漏洞(如SQL注入)实现更丰富的文本处理功能。

Python_0011的博客 484

【人工智能】 WebDev Arena:实时AI Web开发竞赛的技术探索与价值

《AI编程竞赛推动Web开发技术创新》摘要:WebDev Arena作为聚焦Web开发领域的实时AI编程竞赛,通过标准化竞技环境检验AI模型在代码生成、问题解决等方面的能力。竞赛覆盖前端、后端等全流程开发环节,采用实时评分机制,推动AI对复杂Web需求的理解和多元技术栈适配。该赛事不仅促进AI编程技术创新,更为Web开发行业与AI技术融合搭建桥梁,有望提升开发效率、降低技术门槛。未来将拓展Web3.0等前沿技术主题,持续推动行业智能化发展。(150字)

奶爸的编程之路,也就一周冷个三天 255

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

PHPStan attribute.target 错误详解:属性目标不匹配的静态检测

> PHP 属性(Attributes)是 PHP 8.0 引入的元数据机制,但很多开发者在使用时都会遇到"属性被应用到不支持的目标上"这类问题。PHPStan 提供的 `attribute.target` 错误标识正是为了在编译期提前捕获这类运行时错误。本文将以 PHPStan 官方错误文档为基础,深入剖析 `attribute.target` 的触发原理、修复方案,并结合仓库中的源码与测试,帮

gitblog_00269的博客 831

Android 13.0 framework默认沉浸式导航栏功能实现

​ 在13.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app 能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现 ​

安卓兼职framework和app工程师的博客 467

JavaScript注释精准匹配:正则表达式实战与避坑指南

在编程语言中,注释是开发者用于解释代码意图的重要元素。其语法规则要求解析工具必须准确区分注释与代码中的其他文本。正则表达式作为一种强大的文本模式匹配工具,通过定义特定模式,能够高效实现字符串的搜索与替换。在代码处理领域,这一技术对于实现代码压缩、文档生成和静态分析等自动化任务具有核心价值。例如,在构建代码格式化工具或进行源码分析时,需要安全地移除或提取注释而不破坏字符串和正则表达式字面量。本文深入探讨了如何运用**多轮扫描策略**和**状态机解析**思想,构建健壮的正则表达式,以精准匹配JavaScript

benben 336

使用Android Studio调试系统应用之TvSettings(一):移植

对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 *aosp* 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑!

上周的博客 2054

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java表达式--读《疯狂java》 笔记

java表达式1. 字符串2. 表达式类型的陷阱3.输入法导致的陷阱4. 注解5. 转义字符的陷阱6.慎用字符的Unicode转义形式7. 中止行注释的转义字符8. 泛型可能引起的错误原始类型变量的赋值原始类型带来的擦除 表达式是Java程序里最基本的组成单元,各种表达式是Java程序员最司空见惯的内容, 只是在这些简单用法背后,依然有一些很容易让人出错的陷阱。 1. 字符串 String java = new String("疯狂Java"); 上面语句实际上创建了 2个字符串对象,一个是“疯狂Java

352

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Python 正则表达式(Regex)

python 正则表达式

abe_abd的博客 5189

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

正则表达式匹配代码注释:从基础原理到实战避坑指南

正则表达式作为文本处理的强大工具,其核心原理在于通过模式匹配实现字符串的搜索、替换与验证。在编程语言处理领域,正则表达式常被用于词法分析、语法高亮和代码格式化等场景,其技术价值在于能以简洁的语法高效处理复杂的文本模式。然而,当面对编程语言中具有特定结构的元素——如代码注释时,简单的模式匹配往往不足以应对嵌套、转义和上下文依赖等边界情况。本文以JSDoc注释和单行注释的精准匹配为例,深入探讨了如何构建健壮的正则表达式,避免在代码压缩、文档生成等应用场景中误匹配字符串或正则表达式字面量,从而确保工具链的稳定性和

weixin_34344403的博客 337

转义字符实战:从入门到精通,避开那些让你抓狂的坑

本文深入解析转义字符的核心用法与常见陷阱,从基础概念到高级应用全面覆盖。通过12个核心转义字符详解和5个典型问题场景分析,帮助开发者掌握字符串处理中的转义技巧,避免路径、正则表达式等场景下的常见错误,提升代码健壮性。

weixin_30315723的博客 261

疯狂java05--表达式中的陷阱

5.1关于字符串的陷阱 1)JVM对字符串的处理 java对于字符串以及包装类,允许以直接量的方式来创建java对象。 对于这些直接量,jvm会使用一个字符串池来保存它们。字符串池中字符串对象不会被垃圾回收。 如果不是直接量,只要可以在编译时确定下来,结果也一样。 字符串的拼接,如果各部分都是直接量,那么在编译时就可以确定,所以jvm在编译时就计算出值,然后直接放入字符串池中,因此只创建...

little_____white的博客 166

Python 中的正则表达式全部用法速查

正则表达式 正则语法 特性 正则表达式可以拼接,如果 A 和 B 都是正则表达式,那么 AB 也是正则表达式.如果字符串 p 匹配 A 并且另一个字符串 q 匹配 B, 那么 pq 可以匹配 AB.这就构成了由简单构建复杂的基础.除非: A 或者 B 包含低优先级操作 A 和 B 存在边界条件 存在命名组引用。 字符 元字符 : 特殊字符 它们不匹配自己,在正则中具有其它的意义,匹配自己需要转义. 元字符的完整列表: 基础字符 字符 功能 \ 转义 [ ] 匹配一类单个字符,

weixin_43758603的博客 1192

VSS视频摘要性能剖析:从1分钟到12小时视频,延迟如何变化

VSS(Video Search and Summarization,视频搜索与摘要)是 NVIDIA 推出的 GPU 加速 AI Blueprint,本文基于官方基准数据,完整剖析其**视频摘要性能**:1 分钟短视频到 12 小时长视频的端到端延迟、GPU 拓扑扩展效果与最大并发能力,帮助你快速选型 GPU 并规划部署规模。 ## VSS 视频摘要是什么? VSS 的 Video Summ

gitblog_01139的博客 644

C语言转义字符全解析:从原理到实战应用与安全陷阱

在编程语言中,字符编码与字符串处理是基础且核心的概念。其原理在于,计算机通过特定的编码规则(如ASCII、Unicode)将字符映射为二进制数值进行存储与处理。为了在字符串字面量中表示那些具有特殊功能或难以直接输入的字符(如换行、引号),高级语言引入了转义字符机制。这项技术的价值在于,它使得代码能够精确、安全地表达控制指令和特殊符号,是构建健壮软件、实现数据序列化、进行文本格式化以及处理文件路径与网络协议的基础。在C语言中,转义字符的应用尤为广泛且关键,涉及**格式化输出**、**内存操作**以及**安全编

weixin_30411239的博客 426

《java解惑》读书笔记3——更多字符串之谜

1.字符串替换: 问题: 下面这段程序把类全路经名中的"."替换为"/",代码如下: package com.javapuzzlers; public class Test { public static void main(String[] args){ System.out.println(Test.class.getName().replaceAll(".", "/") +

Tony Chen的专栏 2331

Java反斜杠转义全解析:从字符串到正则表达式的三层上下文

转义字符是编程中处理特殊符号的基础概念,其核心原理是通过特定符号改变后续字符的默认解释方式。在Java等语言中,反斜杠(\)作为转义引导符,其技术价值在于确保字符串中的特殊字符(如引号、换行符)能被正确解析。然而,当字符串处理涉及正则表达式时,反斜杠的转义逻辑会变得复杂,因为它需要在字符串字面量和正则表达式引擎两层上下文中分别进行转义,这直接关系到代码的健壮性和开发效率。典型应用场景包括文件路径处理、文本模式匹配与替换,以及数据序列化。本文聚焦于Java中String.replaceAll方法引发的Patt

weixin_33997389的博客 344

Java字符串分割完全指南:从split()基础到实战

通过平台的一键运行功能,可以快速对比不同正则表达式的分割效果,这种即时反馈对理解抽象的正则规则帮助很大。实践时,发现它的即时运行环境特别适合验证字符串处理逻辑。是Java中String类提供的方法,用于将字符串按照指定规则拆分成字符串数组。于是决定整理这份从入门到实战的完整指南,帮助大家系统掌握这个高频使用的功能。最近在辅导新人学习Java时,发现很多初学者对字符串处理中的。- 跳过连续匹配的分隔符(除非使用特殊参数)- 空字符串处理:末尾分隔符可能产生空元素。- 扫描原始字符串,寻找分隔符匹配的位置。

OnyxPanther23的博客 312
上一篇: java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)
下一篇: 流程控制陷阱(Switch语句,标签,if语句,for循环,foreach循环的循环计数器)
方方
博客等级 码龄15年 6粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值