zoukankan      html  css  js  c++  java
  • Java String常见问题


    一、怎样推断两个String是否相等??使用”==“还是使用”equals()“?   

    对String来说。”==“是用来推断两个字符串(对象)的地址是否同样,即推断是否是同一个字符串的应用。

    ”equals()“则是推断两个字符串(对象)的值是否相等,假设相等则返回true。普通情况下。都是使用”equals()“来推断两个字符串的值是否相等,仅仅有当你须要推断两个字符串是否是同一个对象时。才使用”==“。

    <span style="font-size:18px;">String str1 = "abc";
    String str2 = "abc";
    String str3 = new String("abc");
    System.out.println(str1 == str2);    //true
    System.out.println(str1 == str3);    //false
    System.out.println(str1.equals(str3));     //tru</span>

    二、怎样实现String与基本数据类型的装换

        首先了解一下怎样将String转换为主要的数据类型。8个wrapper class(Integer,Double….)提供了相相应的方法parseXxx(String str)将字符串转换为主要的数据类型,例如以下:

    String str1 = "123";

    String str2 = "12.3";

    String str3 = "true";

    int a = Integer.parseInt(str1);      //123

    double d = Double.parseDouble(str2); //12.3

    boolean flag = Boolean.parseBoolean(str3); //true

        或许会见过使用valueOf()的转换,例如以下:

    String str1 = "123";

    String str2 = "12.3";

    String str3 = "true";

    int a = Integer.valueOf(str1); //123

    double d = Double.valueOf(str2);     //12.3

    boolean flag = Boolean.valueOf(str3);      //true

        这样的形式也行。仅仅只是没有直接使用parseXxx()好,由于Integer.valueOf()返回的是Integer类型,再通过自己主动集装箱转换为基本数据类型,其方法原型例如以下:

    publicstatic Integer valueOf(String s)

        注意的是。方法Boolean.parseBoolean(Stringstr),仅仅有在str为字符串“true”时(忽略大写和小写),才会返回true。换句话说就是其它字符串都是返回false。Boolean.parseBoolean(“yes”)将返回false。

    接着下来看一下怎样将基本数据类型转换为String,能够使用String.valueOf()方法进行转换,例如以下:

    int a = 123;

    double b = 13.05;

    boolean flag = true;

    String str1 = String.valueOf(a);     //123

    String str2 = String.valueOf(b);     //13.05

    String str3 = String.valueOf(flag);  //true

        同一时候还有着更为简单快捷的方式,直接在基本数据类型之后加入“”。例如以下;

    String str1 = a +"";    //a

    String str2 = flag + ""; //true

        最后谈一下wrapper class的转换,相同能够将基本数据类型转换为String,例如以下:

    int a = 123;

    boolean flag = true;

    String str1 = Integer.toString(a);   //123

    String str2 = Boolean.toString(flag);      //true

        其实,String.valueOf()方法也是调用了各种wrapper  class的toString()方法,例如以下。仅仅只是String.valueOf()用起来会方便一点,由于不须要去推断数据属于哪一种类型。

    publicstatic String valueOf(double d) {

          return Double.toString(d);//其余的转换都与之类似

        }

    三、怎样切割字符串

        在java里切割字符串是通过正則表達式来切割的。在此我仅仅是简单谈论一下怎样切割,想深入了解正則表達式的。能够点击 这里

        首先看一个简单的样例,例如以下使用“-”来切割字符串。

    String str = "aa-bb-cc-dd";

    String[] res = str.split("-"); //aa bb cc dd

        看起来非常easy,仅仅须要在找出切割复即可了。如你想使用“c”作为切割符,那输出就是aa-bb-  -dd。另外再看一下,使用空格符(s)来切割字符串(Space键。tab键或者换行符),例如以下:

    String str4 = "aa bb cc dd";

    String[] res = str4.split("\s");    //aa bb cc dd

        在这里就有点不同的。在java里反斜线()有着特别的含义,为避免混淆或者出现异常。 应该使用(\),类似的,看一下使用“|”切割字符串,

    String str4 = "aa|bb|cc|dd";

    String[] res = str4.split("\|");    //aa bb cc dd

    四、取子串

    String str = "abcdefg";

    str = str.substring(2, 5);     //cde

        在java7里。substring会创建一个字符串,假设是在java6,倡导使用例如以下方式:

    String str = "abcdefg";

    str = str.substring(2, 5)+"";  //cde

        关于substring在java6和java7的差别。能够查阅相关资料。

    五、怎样将字符串转换日期

    String str = "2014-6-27";

    SimpleDateFormat format = new SimpleDateFormat();

    format.applyPattern("yyyy-MM-dd");

    Date date = format.parse(str);

    System.out.println(date);


    六、String。StringBuilder,StringBuffer的差别

        String与StringBuilder的差别,String是创建之后不能够再改动,StringBuilder是可变的。创建之后能够改动。StringBuilder与StringBuffer的差别,StringBuffer是线程安全的,运行速度相对StringBuffer会慢一点。

    七、在switch语句中使用字符串

        从java7開始。能够在switch语句中使用字符串,例如以下:

    switch (str) {

          case "a":  

                break;

          case "b":

                break;

    }

    八、让字符串反复出现

        使用Apache Commons Lang的StringUtils,能够实现这一功能:

    String str = "1234 ";

    String repeated = StringUtils.repeat(str,3);

    //1234 1234 1234

    事实上现方式例如以下,注意,因为篇幅原因,并没有考虑不论什么异常,具体操作能够參考源代码:

    <span style="font-size:18px;">public String repeat(String str,int repeatTimes){
                int inputLen = str.length();   //获取字符串的长度
                int outputLen = inputLen *repeatTimes;    //输出字符串的长度
                switch (inputLen) {
                //当长度仅仅有1或2时,选择直接使用字符操作,添加效率
                case 1:
                      return repeat(str.charAt(0),repeatTimes);
                case 2:
                      char ch0 = str.charAt(0);
                      char ch1 = str.charAt(1);
                      char[] output = newchar[outputLen];
                      for(int i = repeatTimes * 2 -1;i>=0;){
                            output[i] =ch0;
                            output[i+1] =ch1;
                            i +=2;
                      }
                      return output.toString();
                default:
                      StringBuilder buf =new StringBuilder();
                      for(int i = 0;i <= repeatTimes -1; i++){
                            buf.append(str);
                      }
                      return buf.toString();
                }
          }
         
          public String repeat(char ch,int repeatTimes){
                char[] buf = newchar[repeatTimes];
                for(int i = repeatTimes-1; i >=0; i--){
                      //复制repeatTimes
                      buf[i] = ch;
                }
               
                return buf.toString();
          }</span>

    九、怎样计算指定字符在字符串里出现的次数

        相同是使用Apache CommonsLang的StringUtils,例如以下:

    int n = StringUtils.countMatches("aaaabbbb", "a");

    System.out.println(n);

    十.在一些敏感信息上,为什么倾向用char[],而不是String?

        当String一旦创建,便不可再改动,直到gc将它回收.可gc的回收时间无法预測.即使一个对象不存在引用,也须要在未来的某个时间才会让给出回收.所以String操作敏感信息,有渗漏的风险.可char[]就不一样了,我们能够通过程序直接控制其元素,一般敏感信息不再实用,直接将数组就可以,因此更倾向使用char[]来保存password等敏感信息.

     

  • 相关阅读:
    隐式马尔科夫模型
    TCP与UDP协议
    语法分析
    requests发送HTTP请求
    IPv6协议
    IP协议
    路由协议
    Django表单验证
    PDB调试Python程序
    word2vec模型原理与实现
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7150596.html
Copyright © 2011-2022 走看看