Stringクラスのjavaの一般的洞察

文字列操作はとてもStringクラスを十分に把握は非常に重要である使用し、コンピュータプログラミング、最も一般的な動作です。
文字列は、それが継承されないので、文字列オブジェクトは、将来のオブジェクトを作成すること、変更されない、このオブジェクトの長さを修正することはできないが、我々は、通常行われ、最終的な修飾クラスであります文字列の連結、変更および他の操作は、その参照の単なるコピーであり、元の文字列のサイズを変更しません。
Stringオブジェクトを通して理解する次のコードが作成されます。

       //创建String对象
        String str="yxc";
        String str2="yxc";
        String str1=new String("yxc");
        String str3=new String("yxc");
        System.out.println(str1==str3);
        System.out.println(str==str2);
        System.out.println(str==str1);

リターン結果:

真の
偽は
その後、(まだ右の描画ソフトウェア、一時的に手のアニメーションを探して解析するために、例示のために、以下、初心者のために混乱少しかもしれ:)

ここに画像を挿入説明最初のSTRとstr2の場合は、一定のプール「YXC」の定数を作成し、その後、STR、STR2に取り組む。
そしてそして、STR1とSTR3、最初はヒープ内のオブジェクトを作成するために、新しいキーワードを使用すると、ヒープメモリ参照が渡さSTR3のSTR1を通過し、戻ってきつつ、基準定数プールです。
以下のコードを見てください:

       String str1="hello world";
       String str2=str1.substring(2);
       System.out.println(str2);
       System.out.println(str1);

業績:
LLOの世界は
ハロー世界
サブストリング関数のパラメータに続いて、文字列の傍受で)言いたいキャプチャを開始するために、我々はここに従うと言う指標は、我々は(str.substringによって変更、であることを示しているが、元文字列str1は、実際には変更されていない、これは文字列は、我々が元の値を変更する必要はありません、実際には、この設計は、我々が必要とする正確に何で、何倍になることができないです。操作は、新しいオブジェクトを返す場合、ファンクション文字列の場合は、言う方法なので、それは多くのスペースを節約し、元の件名に戻らない場合は、通常、以下のコードを見て成功しています。

       tring str1="hello world";
       String str2=str1.substring(0);
       String str3=str1.substring(1);
       System.out.println(str1==str3);
       System.out.println(str1==str2);

結果が返されます。
falseを
trueに
権利を、元のオブジェクトのリターンを示し、新しいオブジェクトを返します。いろいろな意味でのチャネリング文字は文字列のは一般的に用いられている方法を学びましょう、このように設計されています。コードを追加することにより、詳細なコメントを直接取得するには:

package com.yxc.string;
//测试String中常见的方法
public class StringProject {
    public static void main(String[] args) {
        System.out.println("其它数据类型转为String类型测试");
       //将其它数据类型转为字符串
        double d=123456.7;
        String str1 = String.valueOf(d);
        System.out.println(str1);   //123456.7
        //其它的数据类型都是一样的,只是换一下数据类型就可以
        //这里还有一种稍微特殊一点的
        char[] c=new char[]{'a','y','z','w'};
        //从下标为1开始截取,截取两个,然后将这两个转换为字符串
        String str2 = String.valueOf(c, 1, 2);
        System.out.println(str2);    //yz


        System.out.println("字符串转为其它数据类型");
        String str3="3121";
        int j = Integer.parseInt(str3);
        System.out.println(j);   //3121
        //其它的数据类型类似

        System.out.println("计算字符串长度");
        System.out.println(str3.length());//注意length是方法,不是数据中的属性

        System.out.println("字符串开头和结尾 返回boolean类型");
        String str4="jamesy";
        System.out.println(str4.startsWith("j"));//true
        System.out.println(str4.endsWith("k"));   //false

        System.out.println("索引");
        /**
         * 索引元素,如果存在返回字符串所在的下标,下标从零开始 如果不存在返回-1
         * 如果是从后面索引,如果找到也是返回下标吗,而是是从前往后的下标(注意)
         * 如果有相同的就返回第一个查找的的
         */
        String str5="I will give you some color to see see";
        System.out.println(str5.indexOf("give"));
        System.out.println(str5.lastIndexOf("give")); //返回结果也是7
        System.out.println(str5.indexOf("see"));           //30
        System.out.println(str5.lastIndexOf("see"));  //34
        //所以索引see的时候肯定是不一样的,从前往后索引和从后索引第一个出现的see的位置不一样

        System.out.println("忽略大小写比较");
        System.out.println("hello".equalsIgnoreCase("HeLLo"));//true

        System.out.println("根据位置索引值");
        System.out.println("asdfg".charAt(3)); //f

        System.out.println("将字符串转为字符数组");
        String str6="just do it";
        char[] chars = str6.toCharArray();
        for(int i=0;i<chars.length;i++){
            System.out.print(chars[i]);
        }

        System.out.println("截取字符串");
        String str7="justsoso";
        String substring = str7.substring(2, 5);  //sts 2截取到5
        System.out.println(substring);

        System.out.println("连接字符串");
        System.out.println("yxc".concat("xin"));

        System.out.println("将字符串转为字节数组");
        String str8="yuio";
        byte[] bytes = str8.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.print(bytes[i]+" ");  //121 117 105 111
        }

        System.out.println("是否包含某一个对象");
        String str9="yangxinchun";
        String str10="xin";
        System.out.println(str9.contains(str10));  //true

    }
}

Stringクラスは確かに頻繁に使用されるが、いくつかのケースでは、次のコードでは、外観を使用することは非効率的です。

        long startTime = System.currentTimeMillis();
        String str="yxc";
        for(int i=1;i<100000;i++){
            str=str+i;
        }
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);

私のマシンでは、文字通り100-この(私はシャットダウンしませんでした数分出てきた、千万でテスト)、40977msを走ったが、それでももっと恐ろしい上記の操作は10万個の以上のオブジェクトを生成しますです。このような効率は、オブジェクトの作成は非常に、リソースを大量に消費されるだけのキャラクターをアップステッチに新しいオブジェクトを生成しますが、このデザインは明らかに実用的ではないので、それはJavaのStringクラスの文字を強化した、低すぎると資源の消費でありますステッチ文字列クラス、StringBufferをとStringBuilderのは、我々は同じ時間をテストします。

        long startTime = System.currentTimeMillis();
        String str="yxc";
        StringBuilder str1=new StringBuilder(str);
        for(int i=1;i<100000;i++){
            str1.append(i);
        }
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);

トック27msという

        long startTime = System.currentTimeMillis();
        String str="yxc";
        StringBuffer str1=new StringBuffer(str);
        for(int i=1;i<100000;i++){
            str1.append(i);
        }
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);

StringBuilderの効率のために後者の二つは少し高くなりますが、それはスレッドセーフではありませんしながら、33msを取り、それは上記の文字列連結で見ることができ、増加の両方の効率は、ノッチだけのカップルではありません、 StringBufferのは、スレッドセーフです。

 StringBuffer str=new StringBuffer("abcdefg");
        //stringbuffer中常见的方法

        System.out.println("插入一个元素在字符串中");
        StringBuffer str1 = str.insert(2, "poi");
        System.out.println(str1);   //abpoicdefg
        //和String不一样,str的值发生了改变
        System.out.println(str);  //abpoicdefg
        //也就是说两者的对象时一样的
        System.out.println(str==str1);  //true

        System.out.println("字符串的反转");
        System.out.println(str.reverse());   //gfedciopba

        System.out.println("字符串的删除");
        StringBuffer str3 = str.delete(3, 6);
        System.out.println(str3);  //gfeopba

StringBuilderとStringBufferのは同じであり、文字列の最終修飾クラスが継承することができないため、文字列がこの2つのクラスのいくつかの基本的な方法は、Stringクラスの拡張として見られるが、継承されないことができます。以上の動作がオブジェクトであることに注意し、変更後、StringBufferオブジェクトが変更されました。

公開された33元の記事 ウォン称賛37 ビュー4397

おすすめ

転載: blog.csdn.net/weixin_42142899/article/details/101899630