ThinkInJava_13_字符串

13.1 不可变 String

  • String 对象是不可变的,String 类中每一个改变 String 值的方法,实际上都创建了一个新的 String 对象
String s1 = "aaa";
String s2 = s1.toUpperCase(); //创建了新的对象值为 AAA

13.2 重载 “+” StringBuilder

String mango = "mango";
String s = "abc" + mango + "def" + 47
//实际上执行了四次StringBuilder.append(String)
  • 如果在循环中拼接字符串,最好显式定义一个 StringBuilder,若用+,每一次循环都会创建一个 StringBuilder 对象
public class WithStringBuilder {
   public String implicit(String[] fields) {
       String result = "";
       for(int i = 0;i < fields.length;i++)
           result += fields[i];
       return result;
   }
   public String explicit(String[] fields) {
       StringBuilder result = new StringBuilder();
       for(int i = 0;i < fields.length;i++)
           result.append(fields[i]);
       return result.toString();
   }
}

13.3 无意识的递归

  • toString()方法继承自Object,每个容器类都覆写了该方法
  • 若要打印对象的内存地址,应调用Object.toString(),即super.toString()

13.4 String 上的操作

length()
charAt()
getChars,getBytes()
toCharArray()
equals()
compareTo()
contains()
contentEquals()
equalsIgnoreCase()
regionMatcher()
startsWith()
subString()
concat()
replace()
trim()
valueOf()

13.5 格式化输出

int x = 5;
float y = 3.14;
System.out.format("%d %f\n",x,y);
//Formatter类
//构造器接收多种输出目的地
Formatter f = new Formatter(System.out);
String name = "aaa";
f.format("%s",name);
%[0 用于填充0][- 用来改变对齐方式][width 控制尺寸][. 小数点保留几位]格式类型,s,d,f等
类型转换字符类型转换字符
d 整数十进制e 浮点数科学计数
c Unicode字符x 整数十六进制
b Boolean值h 散列码十六进制
s String%
f 浮点数十进制
//十六进制输出二进制文件的方法
import java.io.*;
public class Hex {
    public static String format(byte[] data) {
        StringBuilder result = new StringBuilder();
        int n = 0;
        for(byte b : data) {
            if(n % 16 == 0)
                result.append(String.format("%05X: ",n));
            result.append(String.format("%02X ",b));
            n++;
            if(n % 16 == 0)
                result.append("\n");
        }
        result.append("\n");
        return result.toString();
    }
    public static void main(String[] args) throws Exception {
        if(args.length == 0) {
            System.out.println(format(new byte[] {0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
                    0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
                    0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
                    0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
                    0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30}));
        }
    }
}
/*
00000: 01 01 02 71 2B 5F 30 01 01 02 71 2B 5F 30 01 01
00010: 02 71 2B 5F 30 01 01 02 71 2B 5F 30 01 01 02 71
00020: 2B 5F 30 
 */

13.6 正则表达式

//-?\\d+
//表示整数
//-? 可能有负号
//\\表示转义反斜杠,\\\\表示一个真正的反斜杠
//\\d+ 有1个或以上数字
//(-|\\+)?\\d+
//开头带正号或负号或不带符号的整数
"-1234".matches("-?\\d+");
"+999".matches("(-|\\+)?\\d+");
String s = "xxx".split("\\W+");
//替换一个,替换所有
s.replaceFirst("f\\w","repalce_word");
s.replaceAll("f\\w","repalce_word");
  • 贪婪型,尽可能多匹配
  • 勉强型,多加一个?,尽可能少匹配
  • 占有型,多加一个+,不保存中间状态,不回溯
//正则表达式可接受CharSequence类型的参数
Interface CharSequence {
	charAt(int i);
	length();
	subSequence(int start,int end);
	toString();
}
  • java.util.regex 下的 static Pattern.compile() 方法来编译正则表达式
//创建一个正则匹配模式,表示一个编译后的正则表达式
Pattern p = Pattern.compile("abc+");
//Matcher 所有匹配的子串
Matcher m = p.matches("abcabcabc");
while(m.find()) {
	m.group(); //匹配的串
	m.start();
	m.end();
}
static boolean matches(String regex,CharSequence input);

13.7 扫描输入

BufferedReader input = 
new BufferedReader(new StringReader("xxxxx\nyyyy"));
String str = input.readLine();
//扫描类 Scanner
Scanner stdin = new Scanner(SimpleRead.input);
String name = stdin.nextLine();
int age = stdin.nextInt();
if(stdin.hasNext())
;
stdin.useDelimiter("\\s*,\\s*"); //定界符
String pattern = "正则表达式";
stdin.next(pattern);
stdin.hasNext(pattern);
MatchResult match = scanner.match(); //获取当前这条匹配结果
String ip = match.group(1);
String date = match.group(2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值