字符串
可以证明,字符串操作是计算机程序设计中对常见的行为。
String是不可变的。
// fianl修饰,意味着String不能被继承public final class String implements java.io.Serializable, Comparable, CharSequence
String对象是不可变的,String类中每个修改String对象的方法,实际上都是创建了一个新的String对象。(可以看JDK源码)
// 传递的name其实是引用的一个拷贝 // 原本的引用还是没有变的 // 其实当把String对象作为方法的参数时,都会复制一份引用 public static String upCase(String name) { // 这里赋值其实就是将name引用的地址改了 // “Jack”还是在那个原来的物理位置 name = name.toUpperCase(); return name; } public static void main(String[] args) { String name = "Jack"; String newName = StringMain.upCase(name); System.out.println(name); System.out.println(newName); }
因为String对象具有只读特性,所以,一个String可以被多个引用所引用(可以加任意多的别名),因为所以引用都不可能改变它的值。
不可变性会带来效率问题,为对象重载的“+”操作符就是一个例子。重载的意思是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的“+”和“+=”是Java仅有的两个重载过的操作符,Java不允许编程人员重载任何操作符)
StringBuilder
如果需要衔接很多字符串的话,推荐使用StringBuilder类来储存字符串,创建StringBuilder时还能允许你为其指定大小。指定StringBuilder的大小可以避免多次分配缓存(可看JDK源码得知)。
public static String upCase(StringBuilder name) { return name.append("!").toString(); } public static void main(String[] args) { // 指定StringBuilder的大小可以避免多次分配缓存 // StringBuilder name = new StringBuilder(10000); // 直接添加String对象,将会让StirngBuilder容器的大小为字符串长度 StringBuilder name = new StringBuilder("Jack"); String newName = StringMain.upCase(name); System.out.println(name);// Jack! System.out.println(newName);// Jack! }
从上述代码可知,StringBuilder.append是真的在字符串所在的缓存地址里添加字符串进去。
无意识的递归
Java中每个类从根本上是继承Object类的,所以都有toString()方法,并且覆盖了该方法。 例如ArrayList.toString()输出的是包含的所有对象。 注意:如果你想打印出对象的内存地址,应该使用Object.toString()。
格式化输出
System.out.format("%s", "24"); // printf方法内部调用了format方法 System.out.printf("%s", "24");
在Java中,所有新的格式化功能都是由java.util.Formatter类来处理(上述的format方法内部调用formatter.format方法)
// 在实例化Formatter时,可以添加参数用来作为输出方式常用的有PrintStream、OutputStream、File。 Formatter formatter = new Formatter(System.out); formatter.format("my name is %s\n", "Jack"); formatter.format("my name is %s\n", "Merry"); // 在插入数据时,如果想要控制空格和对齐,// 需要更精细复杂的格式修饰符。语法如下: // %[argument_index$][flags][width][.precision]conversion formatter.format("%-15s %15s %5.2f\n", "my name is", "Jackson", 1.2222f); formatter.format("%-15s %15s %5.2f\n", "your name is", "Wal", 1.222f); formatter.format("%-15s %15s %5.2f\n", "his name is", "Jack", 0f); /*output: my name is Jackson 1.22 your name is Wal 1.22 his name is Jack 0.00 */
正则表达式
正则表达式提供非常强大的文本处理功能。比如处理字符串是否合乎规范等。 语法如下:
^为限制开头^java 条件限制为以java为开头字符$为限制结尾java$条件限制为以java为结尾字符.条件限制除\n以外任意一个单独字符java..条件限制为java后除换行外任意两个字符[a-z]条件限制在小写a to z 范围中一个字符[A-Z]条件限制在大写A to Z范围中一个字符[a-zA-Z]条件限制在小写a to z或A to Z范围中一个字符[0-9]条件限制在0到9范围中的一个字符[0-9a-z]条件限制在小写0到9或a to z 范围中的一个字符[0-9[a-z]]条件限制在小写0 to 9 或 a to z 范围中的一个字符(交集)[]中加入^后加再次限制条件[^][^a-z]条件限制在非小写a-z范围中的一个字符[^A-Z]条件限制在非小写A to Z范围中的一个字符[^a-zA-Z]条件限制在非小写a-z或A to Z范围中的一个字符[^0-9] 条件限制在非小写0 to 9范围中一个字符[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)在限制条件为特定字符出现0次以上时,可以使用[*]j* 0个以上j.* 0个以上任意字符j.* d j与d之间0个以上任意字符在限制条件为特定字符出现1次以上时,可以使用[ + ]j+ 一个以上j.+ 一个以上任意字符j.+d j与d之间一个以上任意字符在限制条件为特定字符出现有0次或1次以上时,可以使用[?]ja? j或者ja出现限制为连续出现指定次数字符 [{a}]j{2} jjj{3} jjj文字a个以上,并且[{a,}]j{3,} jjj jjjj jjjjj(三次以上j并存)a个以上,b个以下[{a,b}]j{3,5} jjj或jjjj或jjjjj两者取一[|]j|a j或ajava|hello java或hello[()]中规定一个组合类型
在Java中,比起String类,我们更愿意构造功能强大的正则表达式对象。只需要导入java.util.regex包,然后用static Pattern.compile()方法来编译你的正则表达式即可。他会根据你的String类型的正则表达式生成一个Pattern对象,接下来把你要检索的字符串传入matcher()方法。matcher方法会生成一个Matcher对象。,例如replaceAll()方法,将所有匹配的部分都替代为你传入的参数。
System.out.println(Pattern.matches("[1-9]{3}", "123"));// truePattern pattern = Pattern.compile("[1-9]+");Matcher matcher = pattern.matcher("1235 123 2f");System.out.println(matcher.matches()); // false// 将输出1235 123 2while (matcher.find()) { System.out.print(matcher.group() + " ");}
关于正则表达式、Pattern、Matcher这里就不再介绍了,同学可以去网上搜索相关语法、方法。