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

转载于:https://www.cnblogs.com/gg128/p/9210674.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值