No.5 表达式中的陷阱

1. 关于字符串的陷阱

  • JVM对字符串的处理
    • String java = new String("Java"); 创建了几个对象?
      • 2个。“Java”直接量对应的字符串对象;new String()构造器返回的字符串对象
      • java.intern() 可以字符串池中的直接量对象。
    • 字符串及基本类型的包装类,Java允许通过直接量的方式来创建对应的Java对象;除此之外,简单的算术表达式、连接计算(编译时可以确定具体值)也可以直接创建对应的Java对象
    • 字符串直接量,JVM会使用一个字符串池保存,第一次使用该直接量时,会将其放在字符串池进行缓存(缓存的意思就是以后再用的话,就直接从池中取,而不会新建啦),一般情况下不会对缓存池中的字符串进行垃圾回收
    • 只要是编译时就可以确定其具体值的字符串直接量,JVM会在编译时确定其具体值,并让它指向字符串池中对应的字符串,否则,就不能利用JVM的字符串池了
      • 何为编译时确定具体值?
        • 没有方法调用;没有变量引用
        • 当然,“宏替换”的变量除外
    • String str = "hello" + “world”; 创建了几个字符串对象
      • 1个。因为在编译时就可以确定其计算后的值,因此就直接把计算后的值放到池中就好了,其它的也没有必要啊
    • 在使用字符串、基本类型包装类的对象实例时,尽量通过  直接量 来创建实例。可以少创建一个对象,提升性能。
  • String是典型的不可变类。可变字符串推荐使用StringBuilder
  • 字符串比较
    • 底层是字符串数组
    • 两个字符串左对齐,依次比较二者的每个字符

2. 表达式类型的陷阱

  表达式也是具有制定的数据类型的

  • 表达式类型的自动提升
    • 当算事表达式中含有多个基本数据类型时,整个表达式的数据类型会自动提升,提升到与表达式中最高等级操作数同样的类型。
    • 操作数的等级排列如图示

  • 复合赋值运算符的陷阱(+=、-=、/=、...)
    • E1 op= E2 等价于  E1  = (E1的类型)(E1 op E2)
    • eg:a += 5  等价于 a = (a的类型)(a + 5)
    • 陷阱:它潜在的隐式转换  可能 导致计算结果的   高位“截断”(结果强制转换发生溢出时)

3. 输入法导致的陷阱

  • 代码中 含有   全角空格。。。提示:“非法字符:\12288”
  • java程序中不能包含  全角字符  ,但  字符串中和注释中可以

4注释的字符必须合法

  • 大部分情况,编译器会直接忽略掉注释部分,例外:要求注释部分为合法字符,Java允许直接使用\uXXXX形式来表示字符,其中X必须为0~F间的字符
  • // \unit5\5.4\Hello.javaInvalid unicode

5. 转义字符: Java对待转义字符的处理:直接替换成对应的字符

  • 慎用Unicode转义形式
    • System.out.println("abc\u000a".length());String literal is not properly closed by a double-quote  因为\u000a表示一个换行符
  • 中止行注释的
    • // \u000a代表一个换行符 ,会造成错误:代表一个换行符 cannot be resolved to a type

6. 泛型可能引起的错误

  • 如果使用带泛型声明的类时没有传入类型实参,那么这个类型参数默认是声明该参数时指定的第一个上限类型,这个类型参数也被称为raw type(原始类型)
  • 原始类型带来的擦除
    • 当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有尖括号之间的类型信息都将被丢弃。例:讲一个List<String>类型的对象转为List,则该List对集合元素的类型检查变成了类型变量的上限(即 Object)
    •  1 package test1;
       2 
       3 import java.util.ArrayList;
       4 import java.util.List;
       5 
       6 public class Test<T extends Number> {
       7     T size;
       8     public Test(){}
       9     public Test(T size){
      10         this.size = size;
      11     }
      12     public T getSize() {
      13         return size;
      14     }
      15     public void setSize(T size) {
      16         this.size = size;
      17     }
      18     public List<String> getStrings(){
      19         List<String> list = new ArrayList<>();
      20         for (int i = 0; i < 3; i++) {
      21             list.add(new Test<Integer>(10 * i).toString());
      22         }
      23         return list;
      24     }
      25     
      26     public static void main(String[] args) {
      27         Test<Integer> test1 = new Test<>(6);
      28         for (String string : test1.getStrings()) {
      29             System.out.println(string);
      30         }
      31         
      32         
      33         Test test2 = test1;
      34         //test2.getStrings()方法中List<String>的String也会丢失;因此是所有尖括号中的泛型信息都会丢失
      35         for (String string : test2.getStrings()) {//Type mismatch: cannot convert from element type Object to String
      36             System.out.println(string);
      37         }
      38         
      39     }
      40 }

7. 正则

  • split()方法中传入的是正则,正则中“.”匹配任何字符,故需要对其转义 str.split("\\.");
  • ps:"\"  <mine>
    • 字符串中、正则中的“\”都表示各自的转义,要用真正的斜线“\”时,需要用"\\"表示。两者均是如此
    • Java中又是用字符串来表示正则,故表示正则中的斜线时,需要用“\\\\”前两个斜线表示正则中的第一个斜线,后两个代表第二个
    • (\\)(\\)即是(\)(\),因为字符串中表示斜线,需要用\\。另,各自的转义符\是各自的,正则不能利用字符串的转义符,正则的转义符在字符串看来就是一个“\”,两者互不干扰,只是可以互相表示
    • ——> 方法:先写出来普通的正则表达式,在Java的字符串中用“\\”将正则表达式的斜杠一一表示出来就可以了,有几个就替换几次
      • 例:正则:\d  Java中字符串“\\d”,即“(\\)d”的意思;正则:\\  字符串“\\\\”,即“(\\)(\\)”;正则:\\\d,字符串“\\\\\\d”,即“(\\)(\\)(\\)d”

 8. 多线程

  • start()方法启动线程,而不是run()方法
  • 静态同步方法的同步监视器为  当前类本身(类对象)
  • 分析一个程序不能仅仅停留在静态的代码上,而是应该从程序执行过程来把握程序的运行细节

 

转载于:https://www.cnblogs.com/fang--/p/6266472.html

正则表达式的底层实现原理是什么 参考:https://www.cnblogs.com/Renyi-Fan/p/9694695.html 正则表达式里的底层原理是什么 https://www.cnblogs.com/chanshuyi/p/9197164.html 藏在正则表达式里的陷阱 一、总结 一句话总结:简单地说,实现正则表达式引擎的有两种方式:DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和NFA 自动机(Non determi... 阅读详情

相关推荐

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1183

正则表达式回溯陷阱

判断一个句子是不是正规英文句子一个正常的英文句子如上,英文单词 + 空格隔开= 多个英文字符 [a-zA-Z]用 \s 表示那么一个句子就是单词空格(一个或者多个,最后那个单词是0个)(可能有多个单词+空格)+ 最后一个句号 .那正则就是。

Sword52888的博客 604

深入解析Android14应用安装权限:从声明到授予的完整适配指南

本文深入解析Android14应用安装权限的适配方法,重点介绍了从权限声明到授予的完整流程。与Android13相比,Android14在权限管理机制上进行了重要调整,特别是通过AppOpsManager实现权限的对象化封装。文章详细讲解了权限声明的基础配置、Framework层适配方案、运行时权限授予方法以及常见问题排查指南,帮助开发者高效完成Android14权限适配。

o9p0q1的博客 643

正则表达式 —— 回溯陷阱

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法。 很奇怪,一个...

a572893208的博客 925

藏在正则表达式里的陷阱

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法。 很奇怪,一个正则表达式...

1224

隐藏在正则中的陷阱你中招了吗?

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法。 很奇怪,一个正则表达式怎么会导致 CPU 利用率居高不下。为了弄清楚复现问题,我们将其中的关键代码摘抄出来,做了个简单的单元测试。

weixin_48892733的博客 217

藏在正则表达式陷阱

大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了分布式锁,今天给大家分享一下正则表达式的知识。 前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。通过 Java 自带的线程 Dum...

weixin_30338743的博客 188

藏在阿里面试中Java里正则表达式隐藏的陷阱

正则表达式是一个很方便的匹配符号,但要实现这么复杂,功能如此强大的匹配语法,就必须要有一套算法来实现,而实现这套算法的东西就叫做正则表达式引擎,下面给大家分享藏在正则表达式里的陷阱,一起看看吧

alovelyguido的博客 394

hck正则表达式进阶:复杂分隔符处理的技巧与陷阱

hck作为一款强大的文本处理工具,其最突出的功能就是支持正则表达式分隔符,让复杂的文本分割变得轻而易举。🚀 与传统的`cut`命令相比,hck在处理不规则数据格式时展现出惊人的灵活性。本文将深入探讨hck正则表达式的高级用法,帮助您掌握复杂分隔符处理的技巧,同时避开常见的陷阱。 ## 为什么选择hck的正则表达式功能? hck的正则表达式功能让文本处理变得更加智能和高效。传统`cut`命令只

gitblog_01139的博客 637

JavaScript中的"陷阱":wtfjs项目有趣案例解析

wtfjs项目([README.md](https://link.gitcode.com/i/9bdcc809fc97053ee9a41684c1d5465a))是一个收集有趣且棘手JavaScript示例的开源项目,通过实际代码案例展示JavaScript中那些令人惊讶的行为。本文将介绍几个典型案例,帮助开发者避免在日常编码中遇到类似问题。 ## 经典案例解析 ### 空数组与逻辑非的奇妙关...

gitblog_00931的博客 311

No.2 宏定义的小陷阱

==【注意】== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度 本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所...

weixin_34240520的博客 76

《你真的了解C++吗》No.002. 宏的真正威力与陷阱:预处理器是如何工作的?

在 C++11 之前,宏是许多功能的权宜之计被const和enum class取代。被inline函数和函数模板取代。仍在使用,如或头文件卫士。和##在某些低层系统编程和元编程中仍有特殊用途。宏赋予了 C++ 极大的灵活性,但在 C++03 时代,其类型不安全和副作用是导致 Bug 的主要根源之一。离开了原始内存与宏,我们将进入 C++ 类型系统的基石:const关键字。它如何实现复杂的语义链,确保代码的“常量正确性”?➡️003.const的语义链 (The Semantic Chain of。

腾TO的技术博客 683

Java开源在线考试系统怎么选?从技术选型到落地部署的完整指南

Java开源在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java开源在线考试系统的选型要点。

麦塔在线考试培训系统 344

yolo11-pyqt5-gui安全带检测-驾驶安全监控和行为规范执行+数据集+训练好的模型+pyqt5可视化界面.zip

yolo11-pyqt5-gui安全带检测-驾驶安全监控和行为规范执行+数据集+训练好的模型+pyqt5可视化界面

上一篇: No.14 程序调试
下一篇: No.6 流程控制的陷阱
dingdi7404
博客等级 码龄9年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值