基本程序设计语法
字符串
标准Java类库中提供了一个预定义类——String。每个用双括号括起来的字符串都是String类的一个实例。
String e = "";// an empty string
String greeting = "Hello";
- 子串
- String类的substring方法可以从一个较大的字符串中提取一个子串。
String greeting = "Hello"; String s = greeting.substring(0,3);//输出“Hel”组成的字符串
- substring方法的第二个参数和Python中截取字符串类似,到第二个参数位置截止但不包含第二个参数的所指示的字符(突然想起去心邻域^ V ^)
- 这样的工作方式便于计算字符串的长度,即参数2-参数1所得即是子串长度
- String类的substring方法可以从一个较大的字符串中提取一个子串。
- 拼接
- 与绝大多数程序设计语言一样,Java允许使用 + 连接(拼接)两个字符串
String expletive = "Expletive"; String PG13 = "deleted"; String message = expletive + PG13;// message = Expletivedeleted 中间没有空格,+ 号按照给定的次序将两个字符串拼接起来
- 当讲一个字符串与另一个非字符串的值进行拼接时,后者被转换成字符串
int age = 13; String rating= "PG"+ age;// rating= PG13 System.out.println("The answer is "+answer);//字符串拼接特性常用在输出语句中
- 如果需要把多个字符串放在一起,用一个定界符分隔,可使用静态join方法
String all = String.join("/","S","M","L","XL");// all is the string "S / M / L / XL"
- 不可变字符串
- String 类没有提供用于修改字符串的方法,如果修改字符串只能替换修改字符串
greeting = greeting.substring(0,3)+p!;// greeting = "Help!"
- 由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,不可变字符串优点:编译器可以让字符串共享。
- 可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量, 原始字符串与复制的字符串共享相同的字符。总而言之,Java 的设计者认为共享带来的高效率远远胜过于提取、 拼接字符串所带来的低效率。查看一下程序会发现:很少需要修改字符串, 而是往往需要对字符串进行比较
- Java并不是字符型数组,大致类似于char* 指针,将 greeting 赋予另外一个值时,原始字符串放置在堆中,Java将自动地进行垃圾回收。如果一块内存不再使用,系统最终会将其回收。
- String 类没有提供用于修改字符串的方法,如果修改字符串只能替换修改字符串
- 检测字符串是否相等
- 使用 equals 方法检测两个字符串是否相等
s.equals(t);// 如果s与t相等则返回true,否则,返回false "Hello".equals(greeting);// 除使用字符串变量也可使用字符串的字面量进行比较 "Hello".equalsIgnoreCase("hello");// 检测两个字符串是否相等,且不区分大小写
- 一定不要使用=运算符检测两个字符串是否相等! 这个运算符只能够确定两个字串是否放置在同一个位置上。当然, 如果字符串放置在同一个位置上, 它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
- 如果虚拟机始终将相同的字符串共享, 就可以使用=运算符检测是否相等。但实际上只有字符串常量是共享的,而 + 或 substring 等操作产生的结果并不是共享的。因此,千万不要使甩== 运算符测试字符串的相等性, 以免在程序中出现糟糕的 bug。
- 空串与Null串
- 空串 “” 是长度为0的字符串,空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联
if(str.length()==0)//检查一个字符串是否为空 if(str.equals(""))//检查一个字符串是否为空 if(str==null)检查一个字符串是否为null if(str != null && str.length() != 0)// 检查一个字符串既不是null也不是空串,首次检查是否为空串避免在空串上调用方法出错
- 码点与代码单元
- Java 字符串由 char 值序列组成。,char 数据类型是一个采用 UTF-16 编码表示 Unicode 码点的代码单元。大多数的常用 Unicode 字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
- length 方法将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量。
// 给定字符串所需要的代码单元数量 String greeting = "Hello"; int n = greeting.length();// is 5 // 实际长度,即码点数量 int cpCount = greeting.codePointCount(0,greeting.length()); // 返回特定位置 n 的代码单元,n 介于0 ~ s.length()-1之间,Java 对字符串中的代码单元和码点从 0 开始计数 char first = greeting.charAt(0)// first is 'H' char last = greeting.charAt(4)// last is 'o' //第i个码点 int index = greeting.offsetByCodePoints(0,i); int cp = greeting.codePointAt(index);
- 遍历一个字符串,并且依次查看每一个码点,使用codePoints方法,生成一个 int 值得“流”,每一个 int 值对应一个码点。可以将它转换成一个数组,再完成遍历
int[] codePoints = str.codePoints().toArray();
- 将一个码点数组转换成一个字符串,可以使用构造函数
String str = new String(codePoints, 0, codePoints.length);
- 构建字符串
- 有些时候, 需要由较短的字符串构建字符串, 例如, 按键或来自文件中的单词。采用字符串连接的方式达到此目的效率比较低。每次连接字符串, 都会构建一个新的 String 对象,既耗时, 又浪费空间。使用 StringBuildeir 类就可以避免这个问题的发生。
- 如果需要用许多小段的字符串构建一个字符串, 那么应该按照下列步骤进行。 首先, 构建一个空的字符串构建器
StringBuilder builder = new StringBuilder(); // 当每次需要添加一部分内容时,调用append方法 builder.append(ch)// append a single character builder.append(str)// append a string //在需要构建字符串时就凋用 toString 方法, 将可以得到一个 String 对象, 其中包含了构建器中的字符序列。 String comletedString = builder.toString();