文章目录
一些注意点
-
当参与 / 运算的两个操作数都是整数时, 表示整数除法;否则, 表示浮点除法。
-
数值类型之间的精度转换(实线表示没有精度缺失,虚线表示精度缺失)

- 普通强制转换可以使用 (转换后类型)原变量 的方式,对于浮点数进行四舍五入计算时,可以使用Math.round(x);
- && 和||运算符是按照“ 短路” 方 式来求值的: 如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。{使用&和|则需要都计算}
例如 A&&B,若A为假,则无需计算B
A||B,若A为真,则无需计算B.
- 字符串提取子串,使用substring(start,end),截取start~end-1
字符串拼接,使用join(A,B,C)或者"+"
- Java中字符串不可修改,String类称为不可变字符串.即字符串String temp=“world”,"world"是一个整体,不可修改,但可以将temp引向新的字符串.例如 temp=“china”;
注:C,C++中可以修改字符串的某个字符
Java中修改方法之一(本质是将temp引向新的拼接的字符串)
String temp=“hello”;
temp=temp.substring(0,3)+“abc” //得到"helabc";
- 不可变字符串的一个大优点: 编译器可以让字符串共享
理解为:Java维护一个公共的字符串常量存储池,字符串变量指向存储池中对应位置,当想要复制一个变量时,只需要将新的变量指向对应位置即可,提高效率,空间利用率
-
Java中检查字符串是否相等 s.equals(t),s和t可以是变量或者字面量(“hello”); 不区分大小写时,可以使用equalsIsIgnoreCase(),验证码可以使用;
-
不可以使用’=='检查字符串相等,比较的是变量地址位置是否相等, Java对应字符串常量共享,对于substirng或"+"等产生的结果不共享 ,所有使用= =会产生错误
-
空串是长度为0的字符串,可以调用 strength()==0或者str.equals("")判断,String 可以存放一个null,表示目前变量与任何对象无关. str= =null可以判断
-
当即要检查字符串是否为null也要检查字符串是否为空串可以使用str!=null&&str.length()!=0判断,顺序不可颠倒,因为str如果为空,那么调用str.length()会报异常.
注:根据&&"短路方式"规则,如果str为空,那么不执行后面的str.length()
- 码点和代码单元
- 已知char数据类型是一个采用UTF-16编码表示的Unicode码点的代码单元.
- 已知大部分普通Unicode字符使用一个代码单元.辅助字符需要两个代码单元
length方法返回采用UTF-16编码表示的给定字符串所需要的代码单元数量
charAt()方法也是返回指定的代码单元(从0开始) 如果输出中遇到辅助字符,会产生错误.
==码点:==对存在辅助字符的字符串,使用码点表示每一个字面量符号,对于存在辅助字符的字符串返回码点不会出现代码单元的错误
例如(暂时没找到辅助字符,引用下书中的):
⑪ is the set of octonions 使用 UTF-16 编码表示字符⑪(U+1D546) 需要两个代码单元。
调用 char ch = sentence.charAt(1) 返回的不是一个空格,而是⑪的第二个代码单元,此时可以使用sentence.codePointAt(0),
- 如果想要同时对多个码点进行操作,使用codePointAt(int i)不方便,可以使用str.codePoints(),方法返回一个int值的流,每个int值对应一个码点,可以转换为一个数组.
例如:
int []codePoints=str.codePoints().toArray();//字符串转int
String str=new String(codePoints,0,codePoints.length)//码点数组转换为一个字符串
- Java中常见StringAPI
char charAt(int index)//返回指定位置代码单元,不推荐使用
int codePointAt(int index)//5.0之后使用,返回给定位置的码点
int offetByCodePoints(int start,int count)//5.0后使用,返回从start后的,位移为count的码点索引
int compareTo(String other)//按照字典顺序比较,如果字符串在other前,返回一个负数,反之,返回正数,相等返回0
IntStream codePoints() //8.0后使用,将字符串的码点返回一个int流,可以接着调用.toArray()生成一个数组
new String(int []codePoints,int offset,int count)//5.0 用数组从offset开始的count个码点构造一个字符串
boolean equals(Object other)//判断字符串和other内容是否相等.==不可用于判断内容相等,
//原因: ==判断的是变量的地址,而对于substring()等得到的字符串和字符常量地址不同,
//例如:
String other="hello";
System.out.println(other.substring(0,3)=="hel");//结果为false;
boolean equalsIgnoreCase(String other)//忽略大小写判断内容
boolean startsWith(String prefix)
boolean endsWith(String suffix) //判断字符串是否是prefix为开头,或者suffix为结尾;
int indexOf(String str)
int indexOf(String str,int fromIndex)
int indexOf(int cp)
int indexOf(int cp,int fromIndex)
//返回str或者cp码点匹配的第一个子串的开始位置,从索引0或者fromIndex开始计算,如果没有返回-1;
"hello".indexOf("ll")//结果为2
"hello".indexOf("ll",1)//结果为2
"hello".indexOf("ll",3)//结果-1,从3索引位置后没有"ll"
int lastIndexOf(String str)
int lastIndexOf(String str,int fromInex)
int lastIndexOf(int cp)
int lastIndexOf(int cp,int fromIndex)
//返回字符串str或代码点cp匹配的最后一个子串的开始位置,这个位置从开始串或者从fromIndex开始,
String toLowerCase()//转小写
String toUpperCase()//转大写
String trim()//删除头尾空格
String join(CharSequence delimiter,CharSequence... elements)//8,返回一个新字符串,使用给定的定界符连接所有的元素 字符串属于CharSequence接口
//例如:
String str = "abc";
String temp="hello";
System.out.println(String.join("@",str,temp));
//结果:abc@hello
- 构建字符串,使用字符串连接的方式效率比较低,可以使用StringBuilder类构建
例如:
StringBuilder builder=new StringBuilder();
builder.append("a");
builder.append("hello");
System.out.println(builder.toString());
- 对于StringBuilder,5.0后引入,前身为StringBuffer,如果在单线程中编辑那么使用StringBuilder,如果在多线程中使用StringBuffer(效率较低但是允许多线程)
StringBuilder常用API
int length();//返回长度
StringBuilder append(String str);
StringBuilder append(char c);
StringBuilder appendCodePoint(int cp); //追加一个String,Char,或者codePoint到字符串
void setCharAt(int i,char c); //设置第i个代码单元
StringBuilder insert(int offset,String str);
StringBuilder insert(int offset,Char c);//在offset插入Char或者String
StringBuilder delete(int startIndex,int endIndex);
//删除startIndex~endIndex-1
String toString() //转为字符串