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

  • 相关阅读:
    [工控安全][原创]施耐德某PLC模块用户密码相关漏洞
    [工控安全][原创]施耐德某PLC模块敏感信息泄露漏洞
    [工控安全][原创]西门子PLC固件逆向之定位s7comm协议的一个切入口
    [安全工具][原创]保存IDA Pro中生成的函数调用关系(图)
    [工控安全][原创]西门子PLC固件逆向之socket API(总览)
    [工控安全][原创]面向开环控制的震网病毒恶意载荷探究
    [工控安全][翻译]Rogue7:西门子s7comm-plus协议全解析
    [工控/IOT安全][笔记]ARM设备固件装载基址定位的研究
    Tor源码阅读与改造(一)
    Java WebDriver 使用经验
  • 原文地址:https://www.cnblogs.com/gg128/p/9210674.html
Copyright © 2020-2023  润新知