Java| String总结

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 和 + 效率比较


String大纲

  • Java 中的String是什么? String是数据类型吗?
  • 如何检测两个字符串是否相等?
  • String 是否是线程安全的?
  • 为什么 String 是不可变的?
  • 为什么更喜欢用 Char 数组而不是 String 来存储密码?
  • 为什么喜欢用String作为 HashMap 的 Key?
  • String的intern()方法的作用是什么?


Java 中的String是什么? String是数据类型吗?

首先我们先看一下Java中数据类型的分类
Java| String总结_第1张图片
Java| String总结_第2张图片
字符串是 java 中的一个类,在 java.lang 包中定义。 它不是像 int 和 long 这样的原始数据类型。 字符串类表示字符串。 几乎所有的 Java 应用程序都使用字符串。 在 Java 和 JVM 中,字符串是不可变的,JVM 使用 String Pool 来存储所有 String 对象。


如何检测两个字符串是否相等?


String 是否是线程安全的?

String是不可变的,所以我们不能在程序中改变它的值。 因此,它是线程安全的,可以在多线程环境中安全使用。


为什么 String 是不可变的?

参考:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/


为什么更喜欢用 Char 数组而不是 String 来存储密码?

字符串在 java 中是不可变的,并存储在 String 池中。 一旦创建,它就会一直保存在池中,除非垃圾收集完成,所以即使我们已经用完了密码,但是它可以在内存中使用更长的时间,而且没有办法避免它。 如果我们使用 char 数组来存储密码,我们可以在完成之后将其设置为空白,如果我们使用 char 数组来存储密码,我们可以在完成后将其设置为空白。 所以我们可以控制它在内存中的可用时间,从而避免了 String 的安全威胁。

  • 1.因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题。因为任何可以访问内存的人能以明码的方式把密码dump出来。另外你还应该始终以加密而不是普通的文本来表示密码。因为字符串是不可变,因此没有任何方法可以改变其内容,任何改变都将产生一个新的字符串,而如果使用char[],你就可以设置所有的元素为空或者为零(这里作者的意思是说,让认证完后该数组不再使用了,就可以用零或者null覆盖原来的密码,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的减轻密码被盗的危险。
  • 2.Java官方本身也推荐字符数组,JpasswordField的方法getPassword()就是返回一个字符数组,而由于安全原因getText()方法是被废弃掉的,因为它返回一个纯文本字符串。跟随Java 团队的步伐吧,没有错。
  • 3.字符串以普通文本打印在在log文件或控制台中也易引起危险,但是如果使用数组你不能打印数组的内容,而是它的内存地址。尽管这不是它的真正原因,但仍值得注意。
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作为 HashMap 的 Key?

由于 String 是不可变的,它的 hashcode 在创建时被缓存,它不需要再次计算。 这使它成为 Map 中的一个很好的Key的候选者,并且它的处理速度比其他的 key 对象要快。 这就是为什么 String 主要用 Object 作为 HashMap 键。

可以查看关于HashMap的深入分析来深入了解 HashMap 的Key.


String的intern()方法的作用是什么?

当调用 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

你可能感兴趣的:(【Java-SE】)