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: