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

Java核心技术 卷I # 阅读笔记 二 字符串

作者君水平有限,如有疏漏(也可能是时间的缘故导致文章中的一些东西有误)还请和善指出~Thanks♪(・ω・)ノ如果有帮助的话麻烦点个赞hh或者推荐给其他需要的人,转载注明出处(最好在评论区写一下~) 即可。
本系列文章可以作为C++转Java的程序员阅读的参考材料或者学过java复习的时候需要注意的一点东西,但是面向群体不是刚刚接触编程的朋友哈~所以详略上有所取舍(基础知识可以自己先看书鸭,然后我这里稍稍总结了一下下坑点)。


字符串的操作在很多书和语言里都是重头戏~那让我们一起来看一看java里的字符串操作又是怎样的呢hh

由于有很多前辈有相关的讲述本块内容的文章,所以本文就不再转述,直接贴参考材料,由大家自行阅读。

字符串处理集锦

问:java中的空串和null有什么区别?
答:实践出真知。

public class tmp{
    public static void main(String[] args){
     String s="";
     String p=null;
     System.out.println(s.length());
     System.out.println(p.length());
    }
}

System.out.println(p.length())这一句会报java.lang.NullPointerException的错误。
解析:

空串是一个已经实例化之后的对象,是有内存空间的,只不过内存空间中存储的值为空。
而null表示的是没有实例化的对象,不占内存空间。

这里有个小实验,可以去看一看
几个需要明确的概念:(需要阅读一下编码的参考材料)*
(原书p35)*

码点(code point):一个编码表中的某个字符对应的代码值。
代码级别(code plane):unicode对码点的划分
基本的多语言级别(basic multilingual plane)(BMP):第一个代码级别,码点从U+0000到U+FFFF,其余的16个级别的码点从u+10000到u+10FFFF,包括一些辅助字符。
辅助字符(supplementary character)
代码单元(code unit)在BMP中每个字符有16位表示被称为代码单元。
替代区域(surrogate area)

java中的空串""和null有什么区别
拓展阅读:
Java 语言中 equals 和 == 的区别(补上一篇文章)
详述 String 类中的 空串 和 Null 串
聊聊Java中codepoint和UTF-16相关的一些事
说说Unicode,UTF8,UTF16,BOM,Big endian,Little endian
java检查空串:

if(str.length()==0){
}
//or..
if(str.equals("")){
}

java检查null串:

if(str==null){
}

所以如果要检查非空且非null要用:

if(str!=null&&str.length!=0){
}

然而,length()方法返回的是采用UTF-16编码表述的给定字符串所需要的代码单元数量。
要想得到实际的码点数量用codePointCount()方法。
eg.

String str = "abcd";
int n = codePointCount(0,str.length());

书的作者的观点:在java中尽量别用char,因为这太底层了。
在处理码点和代码单元时会有一些奇怪的问题。
所以尽管有方法.charAt(n)但不推荐使用。(含义如其名)
得到码点方法:

int index = str.offsetByCodePoints(0,i);//得到第i个码点的下标
int cp = str.codePointAt(index);//访问第i个码点

拓展阅读:
Java 7之基础类型第4篇 - Java字符类型
深入理解Java中的String(ps:这篇文章写的很好,我就不当搬运工啦,大家自己翻过去看~)

问:java如何遍历一个字符串并依次查看每一个码点?
答:

int cp = sentence.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp))i+=2;
else i++;

回退操作:

i--;
if(Character.isSurrogate(sentence.charAt(i)))i--;
int cp = sentence.codePointAt(i);

SomeExperiment>>>

     String s="一二三";
     System.out.println("String:"+s);
     System.out.println("Char[0] at String:"+s.charAt(0));
     System.out.println("Char[1] at String:"+s.charAt(1));
     System.out.println();
     System.out.println("CodePoints of String:"+s.codePointCount(0, s.length()));
     //获取第n个码点
     int index = s.offsetByCodePoints(0,1);
     int cp = s.codePointAt(index);
     System.out.println("index is:"+index);
     System.out.println("CodePoint:"+cp);

output:
输出

相关文章:

  • Java核心技术 卷I # 阅读笔记 三 eclipse的使用技巧(非书上内容)
  • LeetCode # Two Sum
  • Git常用命令
  • windows系统 # 1.快捷键
  • JS 输出空格
  • JS 消息框
  • JS 窗口操作
  • JS 改变HTML样式
  • 常见的计算机专业相关词汇汇总
  • JS 入门篇·编程挑战代码
  • 前端中的英语词汇
  • Win10 Edge 下载文件时文件名乱码 解决方案
  • sublime3 web开发环境配置
  • P1553 数字反转(升级版)
  • 贝塞尔公式为什么分母是n-1
  • [Vue CLI 3] 配置解析之 css.extract
  • laravel5.5 视图共享数据
  • Python中eval与exec的使用及区别
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 简单数学运算程序(不定期更新)
  • 码农张的Bug人生 - 见面之礼
  • 入门级的git使用指北
  • 十年未变!安全,谁之责?(下)
  • 微信支付JSAPI,实测!终极方案
  • 在Mac OS X上安装 Ruby运行环境
  • puppet连载22:define用法
  • raise 与 raise ... from 的区别
  • ​香农与信息论三大定律
  • !!java web学习笔记(一到五)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (poj1.3.2)1791(构造法模拟)
  • (二)学习JVM —— 垃圾回收机制
  • (黑马C++)L06 重载与继承
  • (力扣)1314.矩阵区域和
  • (转) 深度模型优化性能 调参
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .gitattributes 文件
  • .NET Framework .NET Core与 .NET 的区别
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net连接MySQL的方法
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Autowired和@Resource的区别
  • @Resource和@Autowired的区别
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [android] 看博客学习hashCode()和equals()
  • [Android]Tool-Systrace
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BJDCTF2020]The mystery of ip1
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [C语言]一维数组二维数组的大小