Java的字符串及格式化输入输出

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方法来实现

原文地址:https://www.cnblogs.com/gg128/p/9210674.html