ฉันพยายามแทนที่ตัวละครที่ดัชนีเฉพาะในสตริง
สิ่งที่ฉันทำคือ:
String myName = "domanokz";
myName.charAt(4) = 'x';
สิ่งนี้ทำให้เกิดข้อผิดพลาด มีวิธีการทำเช่นนี้?
double r = Math.sin(3.14)อะไร มันเกี่ยวข้องกับคำถามนี้อย่างไร ขอบคุณ
                ฉันพยายามแทนที่ตัวละครที่ดัชนีเฉพาะในสตริง
สิ่งที่ฉันทำคือ:
String myName = "domanokz";
myName.charAt(4) = 'x';
สิ่งนี้ทำให้เกิดข้อผิดพลาด มีวิธีการทำเช่นนี้?
double r = Math.sin(3.14)อะไร มันเกี่ยวข้องกับคำถามนี้อย่างไร ขอบคุณ
                คำตอบ:
สตริงจะไม่เปลี่ยนรูปแบบใน Java คุณไม่สามารถเปลี่ยนได้
คุณต้องสร้างสตริงใหม่โดยแทนที่อักขระ
String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
หรือคุณสามารถใช้ StringBuilder:
StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');
System.out.println(myName);
replaceวิธีที่จะไม่แก้ไขสตริง แต่เพิ่งจะส่งกลับสตริงใหม่หรือไม่
                    เปลี่ยนสตริงให้เป็นอักขระถ่าน [] แทนที่ตัวอักษรตามดัชนีจากนั้นแปลงอาร์เรย์กลับเป็นสตริง
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
myName.substring(0,4)+'x'+myName.substring(5);
                    Stringเป็นคลาสที่ไม่เปลี่ยนรูปแบบใน java วิธีการใด ๆ ที่ดูเหมือนว่าจะแก้ไขมันจะส่งกลับวัตถุสตริงใหม่ที่มีการปรับเปลี่ยนเสมอ
หากคุณต้องการจัดการสตริงให้พิจารณาStringBuilderหรือStringBufferในกรณีที่คุณต้องการความปลอดภัยของเธรด
ฉันเห็นด้วยกับ Petar Ivanov แต่มันจะดีที่สุดถ้าเราใช้วิธีต่อไปนี้:
public String replace(String str, int index, char replace){     
    if(str==null){
        return str;
    }else if(index<0 || index>=str.length()){
        return str;
    }
    char[] chars = str.toCharArray();
    chars[index] = replace;
    return String.valueOf(chars);       
}
ขณะที่ก่อนหน้านี้ตอบที่นี่Stringอินสแตนซ์ที่ไม่เปลี่ยนรูป StringBufferและStringBuilderไม่แน่นอนและเหมาะสมกับวัตถุประสงค์ดังกล่าวไม่ว่าคุณจะต้องปลอดภัยหรือไม่
อย่างไรก็ตามมีวิธีการแก้ไขสตริง แต่ฉันจะไม่แนะนำเพราะมันไม่ปลอดภัยไม่น่าเชื่อถือและสามารถถือได้ว่าเป็นการโกง: คุณสามารถใช้การสะท้อนเพื่อปรับเปลี่ยนcharอาร์เรย์ภายในที่วัตถุสตริงมี การสะท้อนกลับช่วยให้คุณสามารถเข้าถึงเขตข้อมูลและวิธีการที่ปกติถูกซ่อนอยู่ในขอบเขตปัจจุบัน (วิธีส่วนตัวหรือเขตข้อมูลจากคลาสอื่น ... )
public static void main(String[] args) {
    String text = "This is a test";
    try {
        //String.value is the array of char (char[])
        //that contains the text of the String
        Field valueField = String.class.getDeclaredField("value");
        //String.value is a private variable so it must be set as accessible 
        //to read and/or to modify its value
        valueField.setAccessible(true);
        //now we get the array the String instance is actually using
        char[] value = (char[])valueField.get(text);
        //The 13rd character is the "s" of the word "Test"
        value[12]='x';
        //We display the string which should be "This is a text"
        System.out.println(text);
    } catch (NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
คุณสามารถเขียนทับสตริงได้ดังนี้:
String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  โปรดสังเกตว่าสายอักขระmyNameเกิดขึ้นบนทั้งสองบรรทัดและบนทั้งสองด้านของบรรทัดที่สอง  
ดังนั้นแม้ว่าในทางเทคนิคสตริงอาจไม่เปลี่ยนรูป แต่ในทางปฏิบัติคุณสามารถปฏิบัติต่อมันได้โดยการเขียนทับมัน
สิ่งแรกที่ฉันควรสังเกตุคือcharAtวิธีการและการกำหนดค่าโดยใช้เครื่องหมายเท่ากับจะไม่ทำอะไรเลย หากสตริงไม่เปลี่ยนรูปcharAtวิธีการในการเปลี่ยนแปลงวัตถุสตริงจะต้องได้รับการโต้แย้งที่มีตัวละครใหม่ น่าเสียดายที่สตริงไม่เปลี่ยนรูป ในการปรับเปลี่ยนสตริงฉันต้องใช้ StringBuilder ตามที่นาย Petar Ivanov แนะนำ
สิ่งนี้จะได้ผล
   String myName="domanokz";
   String p=myName.replace(myName.charAt(4),'x');
   System.out.println(p);ผลลัพธ์: domaxokz
myName.replace(myName.charAt(5),'x')จะให้คุณdxmanxkzซึ่งอาจไม่จำเป็นต้องใช้