String.valueOf和Integer.toString的区别
Java中String对+的重载
String s=new String(“abc”)和Stirng s = "abc"创建String对象的区别?
String, StringBuffer和tringBuilder之间的区别?
在Switch中如何使用String?
StringBuilder与StringBuffer在单线程下的性能测试
深入解析String#intern
String 设计成不可变类的好处? OR 为什么要将String设计成不可变化的?
String的split方法是如何分割字符串的?
String 字符串拼接方法 concat 和 + 效率比较
首先我们先看一下Java中数据类型的分类
字符串是 java 中的一个类,在 java.lang 包中定义。 它不是像 int 和 long 这样的原始数据类型。 字符串类表示字符串。 几乎所有的 Java 应用程序都使用字符串。 在 Java 和 JVM 中,字符串是不可变的,JVM 使用 String Pool 来存储所有 String 对象。
String是不可变的,所以我们不能在程序中改变它的值。 因此,它是线程安全的,可以在多线程环境中安全使用。
参考:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
字符串在 java 中是不可变的,并存储在 String 池中。 一旦创建,它就会一直保存在池中,除非垃圾收集完成,所以即使我们已经用完了密码,但是它可以在内存中使用更长的时间,而且没有办法避免它。 如果我们使用 char 数组来存储密码,我们可以在完成之后将其设置为空白,如果我们使用 char 数组来存储密码,我们可以在完成后将其设置为空白。 所以我们可以控制它在内存中的可用时间,从而避免了 String 的安全威胁。
String strPassword="Unknown";
char[] charPassword= new char[]{'U','n','k','w','o','n'};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);
String password: Unknown
Character password: [C@110b053
以上所有就是为什么字符数组比字符串保存密码要好的原因,尽管使用char[]还不足以安全。我同样建议你用hash或者密码加密代替普通文本,而且一旦认证完成尽可能快的把他清除掉。
参考: 为什么存储密码字符数组比字符串更合适
由于 String 是不可变的,它的 hashcode 在创建时被缓存
,它不需要再次计算。 这使它成为 Map 中的一个很好的Key的候选者,并且它的处理速度比其他的 key 对象要快。 这就是为什么 String 主要用 Object 作为 HashMap 键。
可以查看关于HashMap的深入分析来深入了解 HashMap 的Key.
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。
比如以下代码中"yves"和"10010"都是使用intern方法进行产生String对象的.
String s1 = "yves"; //字符串赋值常量表达式
String s2 =Integer.valueOf("10010"); // 字面值字符串
此方法总是返回具有与此字符串相同内容的字符串,但保证来自于唯一字符串的池.
关于intern方法的深入可以查看 深入解析String中的intern