在Swing中,密码字段具有getPassword()(返回char[])方法而不是通常getText()(返回String)方法.同样,我遇到了一个不使用String来处理密码的建议.
为什么String在密码方面会对安全构成威胁?使用感觉不方便char[].
我们都知道StringJava 中是不可变的,但请检查以下代码:
String s1 = "Hello World";
String s2 = "Hello World";
String s3 = s1.substring(6);
System.out.println(s1); // Hello World
System.out.println(s2); // Hello World
System.out.println(s3); // World
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[])field.get(s1);
value[6] = 'J';
value[7] = 'a';
value[8] = 'v';
value[9] = 'a';
value[10] = '!';
System.out.println(s1); // Hello Java!
System.out.println(s2); // Hello Java!
System.out.println(s3); // World
Run Code Online (Sandbox Code Playgroud)
为什么这个程序运行这样?为什么价值s1和s2变化,但不是s3?
请考虑以下示例.
String str = new String();
str = "Hello";
System.out.println(str); //Prints Hello
str = "Help!";
System.out.println(str); //Prints Help!
Run Code Online (Sandbox Code Playgroud)
现在,在Java中,String对象是不可变的.那么为什么对象str可以赋值"帮助!".这与Java中字符串的不变性相矛盾吗?任何人都可以向我解释一下不变性的确切概念吗?
编辑:
好.我现在得到它,但只是一个后续问题.以下代码如何:
String str = "Mississippi";
System.out.println(str); // prints Mississippi
str = str.replace("i", "!");
System.out.println(str); // prints M!ss!ss!pp!
Run Code Online (Sandbox Code Playgroud)
这是否意味着再次创建了两个对象("Mississippi"和"M!ss!ss!pp!"),并且引用str指向replace()方法之后的另一个对象?
从我得知该类java.lang.String在Java中被宣布为final时,我想知道为什么会这样?当时我没有找到任何答案,但这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问.
当然,String提供了我所需要的所有功能,并且从未想过任何需要扩展String类的操作,但你仍然永远不会知道某人可能需要什么!
那么,有没有人知道设计师在决定最终时的意图是什么?
从这个链接:我如何通过引用传递变量?我们知道,当Python作为参数传递给函数时,Python将复制一个字符串(一个不可变类型变量),但我认为如果字符串很大,它将浪费内存.在许多情况下,我们需要使用函数来包装字符串的一些操作,所以我想知道如何更有效地执行它?
StackOverflow上多次询问过这个问题,但没有一个是基于性能的.
在Effective Java书中给出了它
如果
String s = new String("stringette");在循环或频繁调用的方法中发生,则可以不必要地创建数百万个String实例.改进版本只是以下内容:
String s = "stringette";此版本使用单个String实例,而不是每次执行时都创建一个新实例.
所以,我尝试了两者,发现性能有了显着提高:
for (int j = 0; j < 1000; j++) {
String s = new String("hello World");
}
Run Code Online (Sandbox Code Playgroud)
需要大约399 372纳秒.
for (int j = 0; j < 1000; j++) {
String s = "hello World";
}
Run Code Online (Sandbox Code Playgroud)
大约需要23 000纳秒.
为什么会有这么多的性能提升?内部是否有任何编译器优化?
我有一个字符串:
String c = "IceCream";
Run Code Online (Sandbox Code Playgroud)
如果我使用toUpperCase()函数然后它返回相同的字符串,但我想得到"ICECREAM".
问题出在哪儿?
String和(StringBuilder或StringBuffer)之间存在许多差异,例如可变性和许多字符串操作
可能这个问题看起来有点傻,但我想知道编程范式.
我想问一下,为什么Java实现了另一个类,StringBuilder或者StringBuffer像数据结构那样String.为什么他们自己没有给出这些功能String.
为什么不把String本身线程安全的,或提供一些额外的功能StringBuilder或StringBuffer有?
我的意思是,为什么存在defacto不可变对象?为什么我们不只是使用最终的静态修饰符?关于String,Java使它变得不可变的重要性是什么?
通常情况下程序员想要操纵String对象.java中String对象的工作方式是每次操作String时都会创建一个新对象.这非常耗时.我知道有一个Stringbuffer类允许可变字符串,但我试图理解为什么Java建议字符串应该是不可变的?这是其他编程/脚本语言中的常见问题吗?
string ×10
java ×9
immutability ×3
final ×2
char ×1
passwords ×1
python ×1
reflection ×1
security ×1
static ×1
stringbuffer ×1