Java的字符串及格式化输入输出
1.String的不可变
在浅析Java的jvm上的内存位置的分配里已经说明,String使用了常量池技术,所以在栈中的应用要么是指向常量池,要么是指向堆,String是一个常量类,不可以被继承。
String str1=”hello”;//指向常量池
String str2=new String(”hello”);//指向堆
2.String的”+”号原理如下
String str1 = "str1" + "--str2";
// 相当于如下
StringBuilder builder = new StringBuilder();
builder.append("str1").append("--str2").toString();/*假如想进一步分析可以看汇编class文件*/
备注:String的加号的缺陷是对其进行改变等同于每次生成了一个新的 StringBuilder对象,这样就会导致无用的实例较多导致GC开始工作,影响工作效率。
public class StringDemo1 { public static void main(String[] args) { String str=""; String [] fields={"1","2"}; for (int i = 0; i < args.length; i++) { //每次都需要创建StringBuilder 从而降低了效率 str+=fields[i]; } StringBuilder builder = new StringBuilder(); for (int i = 0; i < args.length; i++) { //效率比上述要高,减少了每次StringBuilder的创建 builder.append(fields[i]); } } }
3.string的==号
string的==号比较的是引用地址;//可以看class文件
System.out.println(new String ("abc")==new String("abc"));//false;
System.out.println(new String ("abc")=="abc");//false
System.out.println("abc"=="abc");//true
4.string的isempty
比较的是内容长度是否为0;//可以看源码
String str=null;
System.out.println(str.isEmpty());//运行时错误
System.out.println("".length());//0
System.out.println("".isEmpty());//true
5.String的equals
比较的是内容是不是相同;//可以看源码
System.out.println(new String ("abc").equals(new String("abc")));//true
6.Stringbuffer
StringBuffer线程安全的可变字符序列,主要使用的方法是append以及insert,保证线程安全主要有两种方式(暂且不论)
7.Stringbuilde线程是不安全的,主要使用的方法同stringbuffer,效率高于stringbuffer
8.格式化输出(实现国际化等)
%s 字符串 %d整数 %f 浮点型小数 %% 百分比类型 %tx日期与时间类型(x代表不同的日期与时间转换符) < 格式化前一个转换符所描述的参数 ("%f和%<3.2f", 99.45) 99.450000和99.45 $ 被格式化的参数索引 等
转换符:c包括全部日期和时间信息 F “年-月-日”格式 D “月/日/年”格式
r “HH:MM:SS PM”格式(12时制)T “HH:MM:SS”格式(24时制)
R “HH:MM”格式(24时制)等
//上述格式可以具体的区查看java.util.Formatter类
9.实例
实例1(实现国际化)
文件1:i18n_en_US.properties
name=name
age=age
文件2:i18n_zh_CN.properties
name=u540Du79F0
age=u5E74u9F84
文件3:login.txt
张三,18
李四,24
代码
ResourceBundle bundle = ResourceBundle.getBundle("i18n", Locale.US);
String name = bundle.getString("name");
String age = bundle.getString("age");
String filePath = "F:\eclipse\eclipse\StringTest\src\login.txt";
try {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(new File(filePath));
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] infoSplit = line.split(",");
String info = String.format("%s:%s %s:%s", name,infoSplit[0], age,infoSplit[1]); System.out.println(info);
/*当然也可以System.out.format的方式输出,上述也可以 用 DateFormat, MessageFormat, NumberFormat去做,大同小异。*/
}
} catch (FileNotFoundException e) {
throw new Exception(filePath + "路径不存在!");
}
实例二(实现日期的格式化)
Date date = new Date();
System.out.format("%1$tF %1$tT",date);
正则
判断是否匹配给定的正则表达式用于验证matches(String regex)
System.out.println("123abc".matches("\d+[a-zA-Z]+"));
//具体查看java.util.regex.Pattern。
替换所有的相应的字符replaceAll(String regex, String replacement)
System.out.println("i love you i love you ".replaceAll("love", "sick"));
// replaceFirst(String regex, String replacement) 替换第一个
截取需要的内容
String str= "12344567890jk1234567890111fgf123456";
Pattern compile = Pattern.compile("\d{11,}");
Matcher matcher = compile.matcher(str);
while(matcher.find()) {
String group = matcher.group();
if(group.length()==11) {
System.out.println(group);
}
}
//matcher相应的还有start end方法,匹配开始和结束的位置,lookat从开始位置找(这也是与find的区别)等
改变类默认的输出方式
可以通过改变tostring方法来实现