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

版权声明:转载请注明原文地址即可,要是本文对您有些许帮助的话,请您在下方点个赞,谢谢啦ヾ(o◕∀◕)ノヾ https://blog.csdn.net/qq_33583069/article/details/86749600

作者君水平有限,如有疏漏(也可能是时间的缘故导致文章中的一些东西有误)还请和善指出~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:
输出

猜你喜欢

转载自blog.csdn.net/qq_33583069/article/details/86749600
今日推荐