在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?
我在不可变字符串上编写了以下代码.
public class ImmutableStrings {
public static void main(String[] args) {
testmethod();
}
private static void testmethod() {
String a = "a";
System.out.println("a 1-->" + a);
a = "ty";
System.out.println("a 2-->" + a);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
a 1-->a
a 2-->ty
Run Code Online (Sandbox Code Playgroud)
这里变量的值a已经改变(许多人说不可变对象的内容不能改变).但究竟是什么意思说String是不可改变的?你能否为我澄清一下这个话题?
来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
这两个陈述之间有什么区别?
String s = "text";
String s = new String("text");
Run Code Online (Sandbox Code Playgroud) 我在接受采访时被问到为什么String是不可变的
我这样回答:
当我们在java中创建一个字符串时,
String s1="hello";就会在字符串池(hello)中创建一个对象,而s1将指向hello.如果我们再这样做,String s2="hello";那么将不会创建另一个对象但s2将指向,hello因为JVM将首先检查如果字符串池中存在相同的对象. 如果不存在则只创建一个新对象,否则不创建.
现在,如果假设Java允许串可变那么如果我们改变S1到hello world那么S2价值也将hello world因此Java字符串是不可改变的.
如果我的答案是对还是错,请问任何人可以告诉我吗?
我知道Java没有指针,但我听说Java程序可以用指针创建,这可以由少数java专家完成.这是真的吗?
我一直在研究Java String.以下问题基于以下帖子
Java String是java中特殊
的String不可变性
不可变性:现在,通过不变性,String类被设计为公共池中的值可以在其他位置/变量中重用.如果String被创建为, 则这很好
String a = "Hello World!";
但是,如果我创建String之类的
String b = new String("Hello World!");
为什么这也是不变的?(或者是吗?).由于这有一个专用的堆内存,我应该能够修改它而不影响任何其他变量.因此,通过设计,还有其他任何原因,为什么String整体被认为是不可改变的?或者我的上述假设是错误的?
我想问的第二件事是关于常见的字符串池.如果我创建一个字符串对象为
String c = "";
是在池中创建的空条目?
这些帖子上已经有帖子吗?如果是这样,有人可以分享链接吗?
在Java中,我这样做是为了修剪一个字符串:
String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.trim();
System.out.println("after->>"+input+"<<-");
Run Code Online (Sandbox Code Playgroud)
输出是:
before->> some Thing <<-
after->>some Thing<<-
Run Code Online (Sandbox Code Playgroud)
作品.但我想知道如果通过为自己分配一个变量,我做的是正确的.我不想通过创建另一个变量并为其分配修剪值来浪费资源.我想在原地进行修剪.
我这样做对吗?
我试图写将接受的方法String,检查是否有某些记号的情况下(例如${fizz},${buzz},${foo}等),并用新的字符串,它是从获取替换每个标记Map<String,String>.
例如,如果我将此方法传递给以下字符串:
"现在如何$ {fizz} cow.$ {buzz}奇形怪状的$ {foo}."
如果该方法参考以下内容Map<String,String>:
Key Value
==========================
"fizz" "brown"
"buzz" "arsonist"
"foo" "feet"
Run Code Online (Sandbox Code Playgroud)
然后结果字符串将是:
"怎么现在是棕色的牛.纵火犯的脚形状奇特."
这是我的方法:
String substituteAllTokens(Map<String,String> tokensMap, String toInspect) {
String regex = "\\$\\{([^}]*)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(toInspect);
while(matcher.find()) {
String token = matcher.group(); // Ex: ${fizz}
String tokenKey = matcher.group(1); // Ex: fizz
String replacementValue = null;
if(tokensMap.containsKey(tokenKey))
replacementValue = tokensMap.get(tokenKey);
else
throw new RuntimeException("String contained an …Run Code Online (Sandbox Code Playgroud) 我正在阅读垃圾收集,当我搜索字符串文字垃圾收集时,我的搜索结果令人困惑.
我需要澄清以下几点:
如果在编译时将字符串定义为文字[例如:String str = "java"]那么它是否会被垃圾收集?
如果使用实习方法[例如:String str = new String("java").intern()]那么它会被垃圾收集吗?它也将与第1点中的字符串文字区别对待.
有些地方提到只有在String卸载类时才会对文字进行垃圾收集?它是否有意义,因为我认为String不会卸载课程.