mohuneko’s blog

かんばる駆け出しエンジニアのブログです

【Java Silver】基本データ型・文字列操作2【初心者】

駆け出しエンジニアがJava Silverに挑戦するためにもくもく勉強します
Java Silverのテストにも出題される内容をまとめていますので、同じような境遇の方の参考になれば幸いです^^


Qiitaの方でも0からアプリケーション実装をしているので、
もし良かったら参考にしてください^^

qiita.com

 こんな本で勉強しています🌟

目次

文字列操作、Stringクラスについて

Stringクラスの全体的な文法についてはQiitaにまとめていますので参考にしてください qiita.com

Stringクラス

  • Striingオブジェクトは不変(immutable)なオブジェクトです

不変(immutable)なオブジェクトの定義

  • 全てのフィールドをprivateで修飾
  • オブジェクト内部状態を変更可能なメソッド(setter)を用意しない
  • クラスをfinel宣言し、メソッドのオーバーライドを禁止
  • 内部の可変なオブジェクトをgetterで提供しない
  • java.lang.Stringクラスやjava.io.FIleクラスのインスタンスはimmutableなオブジェクトであり、生成時に与えられた文字列やファイルへのパスを後から変更できません
  • 🌟Stringはimmutableなオブジェクトで、文字列を変更するには新しくインスタンスを作成する必要があります

Stringクラスのメソッド

  • Stringクラスのメソッドは、新しいStringクラスのインスタンスを作って戻します
  • Stringはimmutableなオブジェクトなので、元の文字列が変更されることはありません

charAtメソッド

  • インスタンスが保持している文字列から、引数で指定された位置の一文字を抜き出してもどします
    • 範囲外にアクセスした場合は"IndexOutOfBoundsException"
var str = "猫もふりたい";
System.out.println(str.substring(1, 4)); //もふり

public static void main(String[] args) {
    var mail = "neko@example.com";
    System.out.println(mail.substring(mail.lastIndexOf("@") + 1)); //example.com
    System.out.println(mail.charAt(0)); //n

    for (var i = 0; i < mail.length(); i++) {
     System.out.println(mail.charAt(i)); //全文字抽出
    }
}

indexOfメソッド

  • 引数で指定した文字(文字列の先頭)がどこに存在するかを調べます
    • 存在しない場合は-1が戻される
public class Main {
  public static void main(String[] args) {
    var str = "にわにはにわにわとりがいる";
    System.out.println(str.indexOf("にわ")); //0
    System.out.println(str.indexOf("にも")); //-1
    System.out.println(str.lastIndexOf("にわ")); //6
    System.out.println(str.indexOf("にわ", 3)); //4
    System.out.println(str.lastIndexOf("にわ", 3)); //0
  }
}

replaceメソッド

  • 第一引数の文字列を第二引数で置き換えます
    • 文字の置き換えは先頭から文字列の最後まで処理されます
public class Main {
    public static void main(String[] args) throws Exception {

        String ppap = "pen pineapple apple pen";
        System.out.println(ppap.replace("apple", "banana")); //pen pinebanana banana pen
    }
}

文字列連結

  • +演算子で文字列を連結できます
  • 左右のオペラントが数値と文字列の時は、数値を文字列に変換して結合します
  • しかし+で文字列を結合すると元の文字列、連結する文字列、結果文字列の3個のString文字列を生成しているのでガベージコレクションの増大になります。。
  • 変更可能な文字列を扱うStringBuilderクラスのappendメソッドを使うと、そのオブジェクトの内容が変更されるだけで、新しいインスタンスを生成しないので、インスタンスの生成・破棄が少ないです!
  • mofuを100000回連結して出力すると、StringBuilderが7msで圧勝でした✨
  • StringBuilderはデフォルトで16文字分のバッファを持っています

(参考)qiita.com

public class Main {
    public static void main(String[] args) throws Exception {
        var builder = new StringBuilder();
        for (var i=0;  i<100000; i++){
            builder.append("mohu");
            //result += "mohu" ; 
            }
        var result = builder.toString();
        System.out.println(result);
    }
}

今日の問題①

以下のコードを実行した結果は何が表示されるでしょうか

public class Main {
    public static void main(String[] args) throws Exception {
        
        String ppap = "pen pineapple apple pen";
        changeApple(ppap);
        System.out.println(ppap); 
    }
    private static void changeApple (String str){
        str.replaceAll("apple", "banana");
    }
}
  • 正解は pen pineapple apple pen でした!
    changeAppleメソッドでは、置換した結果の文字列を持った新たなインスタンスを生成し、そのインスタンスへの参照を渡しますが、 元の文字列ppapを変更しません

今日の問題②

以下のコードを実行した結果は何が表示されるでしょうか

public class Main {
    public static void main(String[] args) throws Exception {
        String str = null;
        str += "null";
        System.out.println(str);
    }
}
  • 正解は nullnull でした!
    左右のオペラントが数値と文字列の時のように、参照を持たないことを示すnullを文字列"null"に変換して結合します

 

今日もお疲れ様でした😊