Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串值与子字符串后的文本不匹配_Java_Arrays_String_Char_Substring - Fatal编程技术网

Java字符串值与子字符串后的文本不匹配

Java字符串值与子字符串后的文本不匹配,java,arrays,string,char,substring,Java,Arrays,String,Char,Substring,有点奇怪的问题。我有以下代码来对字符串进行一些基本的解析: for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); //get time int firstWhiteSpace = line.indexOf(" "); String time = line.substring(0, firstWhiteSpace); //proble

有点奇怪的问题。我有以下代码来对字符串进行一些基本的解析:

    for (int i = 0; i < lines.size(); i++) {
        String line = lines.get(i);

        //get time
        int firstWhiteSpace = line.indexOf(" ");
        String time = line.substring(0, firstWhiteSpace);

//problem is here vvvv
            line = line.substring(firstWhiteSpace + 1, line.length());
//problem is here ^^^^

        //get client
        int firstColon = line.indexOf(":");
        String client = line.substring(0, firstColon);
        line = line.substring(firstColon + 1, line.length());

        ChatMessage chatMessage = new ChatMessage();
        chatMessage.setTime(time);
        chatMessage.setClient(client);
        chatMessage.setMessage(line);

        messages.add(chatMessage);
    }
我确实:

line = line.substring(0, 5);
那么,line现在的值为:

"Hello"
但字符数组是:

[H, e, l, l, o, , W, o, r, l, d]
因此,我有点困惑。如果我错过了一些愚蠢可笑的事情,我会道歉。这是很有可能的

完整的代码,它不是一个非常复杂的类:

公共类聊天解析器{ 专用静态TS3ParserSettings设置

public static void main(String[] args) {
    ChatParser.setSettings("C:/Users/*****/javaWorkspace/TS3Parser/src/data/settings.txt");
    ChatParser.parseChat();
}

public static void parseChat() {
    ArrayList<String> lines = TextParser.parseTextLines(settings.getSetting("chatLogPath"));
    ArrayList<ChatMessage> messages = new ArrayList<ChatMessage>();

    for (int i = 0; i < lines.size(); i++) {
        String line = lines.get(i);

        //get time
        int firstWhiteSpace = line.indexOf(" ");
        String time = line.substring(0, firstWhiteSpace);
        line = line.substring(firstWhiteSpace + 1, line.length());

        //get client
        int firstColon = line.indexOf(":");
        String client = line.substring(0, firstColon);
        line = line.substring(firstColon + 1, line.length());

        ChatMessage chatMessage = new ChatMessage();
        chatMessage.setTime(time);
        chatMessage.setClient(client);
        chatMessage.setMessage(line);

        messages.add(chatMessage);
    }

    for (int i = 0; i < messages.size(); i++) {
        System.out.println("TIME = " + messages.get(i).getTime() + " CLIENT = " + messages.get(i).getClient() + " MESSAGE = " + messages.get(i).getMessage());
    }
}

public static void setSettings(String path) {
    settings = SettingsParser.parseSettings(path);
}
}
publicstaticvoidmain(字符串[]args){
setSettings(“C:/Users/*****/javaWorkspace/TS3Parser/src/data/settings.txt”);
parseChat();
}
公共静态void parseChat(){
ArrayList lines=TextParser.parseTextLines(settings.getSetting(“chatLogPath”);
ArrayList消息=新建ArrayList();
对于(int i=0;i
由于
String
对象是不可变的,编译器可以自由共享底层数据。执行
子字符串()
时,将创建一个新的字符串引用对象,该对象指向原始字符串数组,但具有不同的起始偏移量和长度


对于第一个示例,打印出
firstWhiteSpace
的值,我想一切都会变得清晰。

您的问题与不变性无关:如果您有一个对象的集合/数组,更改包含对对象的on的引用的局部变量的值对集合/数组没有影响

此代码演示:

ArrayList<String> strings = Arrays.asList("foo", "bar");
String localVar = strings.get(0); // "foo"
localVar = "hello"; // this only affects localVar
// strings is still {"foo", "bar"}
arrayliststrings=Arrays.asList(“foo”、“bar”);
String localVar=strings.get(0);//“福”
localVar=“你好”//这只影响localVar
//字符串仍然是{“foo”,“bar”}


仅供参考,您所称的“数组”是一个
ArrayList
,它使用数组,但不是java“数组”。

您所说的字符数组是什么?字符串
char[]
的println()在哪里?我觉得少了点什么。也许是的。。。我们能看看你的全部代码吗?在发布完整的代码时更容易获得您所说的内容。将line.size()存储在变量中,并在for循环的条件中使用该变量。性能提示。。!什么是愚蠢的错误?给可能犯过同样错误的人留下解释总是好的……好的,谢谢,这很有意义。问题一定在别的地方。我认为这不是问题所在。返回的数组应按原样包含字符串@Martin—“返回新字符串”仅表示返回新字符串对象。编译器/jvm可以自由地重用底层的char数组,因为那里的数据永远不会被修改。它说:“将这个字符串转换为一个新的字符数组。”我正在查看Java 7 Javadoc中的
string#substring(int,int)
,没有看到任何关于“新字符数组”的内容。这三个词仅在
toCharArray()
的定义中同时出现。
ArrayList<String> strings = Arrays.asList("foo", "bar");
String localVar = strings.get(0); // "foo"
localVar = "hello"; // this only affects localVar
// strings is still {"foo", "bar"}