我理解String是不可变的。但是,由于这个原因,我不明白为什么以下代码可以工作(来自Oracle的代码示例)。我指的是“path = path.replace(sep,'/');”有人可以帮忙解释一下吗?
import oracle.xml.parser.v2.*;
import java.net.*;
import java.io.*;
import org.w3c.dom.*;
import java.util.*;
public class XSDSample
{
public static void main(String[] args) throws Exception
{
if (args.length != 1)
{
System.out.println("Usage: java XSDSample <filename>");
return;
}
process (args[0]);
}
public static void process (String xmlURI) throws Exception
{
DOMParser dp = new DOMParser();
URL url = createURL (xmlURI);
// Set Schema Validation to true
dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
try
{
System.out.println("Parsing "+xmlURI);
dp.parse (url);
System.out.println("The input file <"+xmlURI+"> parsed without
errors");
}
catch (XMLParseException pe)
{
System.out.println("Parser Exception: " + pe.getMessage());
}
catch (Exception e)
{
System.out.println("NonParserException: " + e.getMessage());
}
}
// Helper method to create a URL from a file name
static URL createURL(String fileName)
{
URL url = null;
try
{
url = new URL(fileName);
}
catch (MalformedURLException ex)
{
File f = new File(fileName);
try
{
String path = f.getAbsolutePath();
// This is a bunch of weird code that is required to
// make a valid URL on the Windows platform, due
// to inconsistencies in what getAbsolutePath returns.
String fs = System.getProperty("file.separator");
if (fs.length() == 1)
{
char sep = fs.charAt(0);
if (sep != '/')
path = path.replace(sep, '/');
if (path.charAt(0) != '/')
path = '/' + path;
}
path = "file://" + path;
url = new URL(path);
}
catch (MalformedURLException e)
{
System.out.println("Cannot create url for: " + fileName);
System.exit(0);
}
}
return url;
}
}
答案 0 :(得分:4)
path = path.replace(sep, '/');
创建一个新的String实例并将其分配给path
变量。由String
引用的原始path
未更改,因为正如您所知,字符串是不可变的。
如果您在未将结果分配给path.replace(sep, '/')
的情况下致电path
,path
将继续引用原始String
。
答案 1 :(得分:0)
字符串本身未被修改。然而,处理程序path
指向一个新的String,它是path
的先前值,并进行了一些替换。
答案 2 :(得分:0)
String 实例始终是不可变的。
简单示例:
public static void main(String[] args) throws IOException {
String s = "abc";
String replacedString = s.replace("a", "x"); // returns a "new" string after replacing.
System.out.println(s == replacedString); // false
}