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=\u540D\u79F0
age=\u5E74\u9F84

文件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\t%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方法来实现