String小秘密

一、创建形式

1.String x = “abc”;

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a == b 结果为 true,是因为 a 和 b 都指向方法区(method area) 同一个字符串文字,内存引用是同一个。
当多次创建相同的字符串文字时,只存储每个不同字符串值的一个副本。这个叫做字符串留驻/留用,Java 中所有编译期字符串常量都会被自动留驻。

2.String y = new String(“abc”);

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d 结果为 false,因为 c 和 d 的引用指向堆中不同的对象,不同的对象肯定有不同的内存引用。

二、运行期字符串留住intern()

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

通过调用 intern()方法,就好比把创建的字符串拘留在方法区一样了。

三、内存个数

String d = new String("abcd");
  1. 如果方法区已存在"abcd", 那么只创建一个 new String 的对象;
  2. 如果方法区没有"abcd", 那么要创建两个对象,一个在方法区,一个在堆中。
    所以,正常情况下我们没必要使用构造器创建对象,因为这很可能会产生一个额外的没用的对象,以下例外:
String s = "abcd";
s = s.concat("ef");

当我们想在字符串 s 后面拼接字符"ef"时,会在堆中创建一个新的对象,并将 s 的引用指向新创建的对象,由于 String 创建的是不可变对象,所以 String 类中的所有方法都不会改变它自身,而是返回一个新的字符串。

  • 注:如果我们需要一个字符串被修改,我们最好使用 StringBuffer 或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间。

四、String 为何是final类型

字符串池

字符串池(String intern pool)是方法区域中的一个特殊存储区域。当创建一个字符串时,如果该字符串已经存在于池中,那么返回现有字符串的引用,而不是创建一个新对象。所以说,如果一个字符串是可变的,那么改变一个引用的值,将导致原本指向该值的引用获取到错误的值。

缓存hashcode

字符串的hashcode在Java中经常使用。例如,在HashMap或HashSet中。不可变保证hashcode始终是相同的,这样就可以在不担心更改的情况下兑现它。这意味着,不需要每次使用hashcode时都计算它。

安全性

String被广泛用作许多java类的参数,例如网络连接、打开文件等。如果字符串不是不可变的,连接或文件将被更改,这可能导致严重的安全威胁。该方法认为它连接到一台机器上,但实际上并没有。可变字符串也可能导致反射中的安全问题,因为参数是字符串。

  • 注:出于效率和安全性的考虑,String 被设计为不可变的。这也是为什么在一般情况下,不可变类是首选的原因。
C#是一种非常适合写小游戏的编程语言。我们可以使用C#编写桌面应用程序,例如Windows窗体应用程序或WPF应用程序,来实现小游戏。 下面是一个使用Windows窗体应用程序编写的猜数字小游戏的示例代码: ```csharp using System; using System.Windows.Forms; namespace GuessNumberGame { public partial class MainForm : Form { private int secretNumber; private int guessCount; public MainForm() { InitializeComponent(); NewGame(); } private void NewGame() { secretNumber = new Random().Next(1, 101); guessCount = 0; guessTextBox.Text = ""; messageLabel.Text = "猜一个1到100之间的数字。"; guessButton.Enabled = true; } private void guessButton_Click(object sender, EventArgs e) { int guess; if (int.TryParse(guessTextBox.Text, out guess)) { guessCount++; if (guess < secretNumber) { messageLabel.Text = "你猜的数字太小了。"; } else if (guess > secretNumber) { messageLabel.Text = "你猜的数字太大了。"; } else { messageLabel.Text = string.Format("恭喜你,你在{0}次猜中了数字{1}!", guessCount, secretNumber); guessButton.Enabled = false; } } else { messageLabel.Text = "请输入一个有效的数字。"; } guessTextBox.Focus(); guessTextBox.SelectAll(); } } } ``` 以上代码实现了一个猜数字小游戏。当程序启动时,会随机生成一个1到100之间的整数作为秘密数字。用户需要输入猜测的数字,程序会根据用户的猜测给出提示,直到用户猜中秘密数字为止。 这只是一个简单的示例,你可以根据自己的想法和需要编写更加复杂和有趣的小游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值