马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
媒介:
这个时候差不多小搭档们都考完试放寒假了吧
小编明天还有末了一科测验,日更一篇,今天这篇一定会对小白非常有效的!!!
因为我们会把案例到用代码实现的全过程思路呈现出来!!!
我们一直都是以这样的形式,让新手小白轻松明白复杂晦涩的概念,
把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,
为什么用这串代码关键字,对比同范例的代码,
让各人真正看完以后融会贯通,闻一知十,实践应用!!!!
①官方定义 和 大白话拆解对比
②举生存中常见贴合例子、图解辅助明白的形式
③对代码实例中关键部分进行详细拆解、总结
给小编一个赞或者关注吧,我们一起进步!!
1.1 String 的特性
官方语言
- java.lang.String 类在Java中代表不可变的字符序列。字符串是常量,一旦创建后,其内容就不能被改变。
- 每个字符串都是String类的一个实例,而且由于String类是利用final关键字声明的,因此它不能被继续。
- String对象内部维护一个私有的、最终的字符数组value[]来存储字符序列。
大白话拆解:
- String就像是一串珠子,每一颗珠子上都写着一个字母或符号。当你创建了一个String,好比说"hello",这就像是你用五颗分别写有h、e、l、l和o的珠子穿成了一条项链。
- 这条项链(即String)一旦做好了,你就不能再改变上面的字母了,也不能增加或淘汰珠子。如果你想改变项链上的字母,好比把"hello"酿成"world",那实际上你需要重新做一条新的项链,而不是去修改原来的那一串珠子。
- 别的,在Java的天下里,String这个“项链”是特别的,因为它是用一种叫做final的东西做的,这意味着没有人可以复制它的设计来做另一个版本的“项链”。
- 也就是说,String是独一无二的,我们只能用它提供的方法来处理字符串,而不能创建它的子类来扩展或修改它的行为。
举个栗子:
1、不可变性
- 一旦创建了一个String对象,它的值就固定了。任何试图改变它的操作都会导致创建一个新的String对象。
- String greeting = "Hello"; // 创建一个String对象
- greeting = greeting + " World"; // 这实际上是创建了一个新的String对象
复制代码
2、字符串文字作为String实例
- 在代码中直接用双引号写的文本(如"Hello")会主动成为String类的实例。
- String message = "Welcome to Java!"; // 直接赋值给String变量
复制代码
3、String不能被继续
- 因为String是final的,以是你不能创建一个继续自String的新类。
- // 下面这段代码会导致编译错误
- // class MyString extends String {
- // // 不允许这样做
- // }
复制代码
4、内部字符数组
- 虽然我们通常不需要直接访问String对象内部的字符数组,但知道String是由字符数组构成的有助于明白一些String的方法,好比charAt(),它返回指定索引处的字符。
- String name = "Alice";
- char firstLetter = name.charAt(0); // 获取第一个字符 'A'
复制代码
1.2 String 的内存结构
官方语言
- 在Java中,String对象的不可变性使得多个雷同的字符串可以共享同一个实例。为了优化内存利用和提高性能,Java引入了字符串常量池(String Intern Pool),它存储全部唯一的字符串字面量和通过调用intern()方法创建的字符串。
- JDK 6及之前版本中,字符串常量池位于永久代(PermGen)中的方法区;从JDK 7开始,字符串常量池被移至堆空间(Heap Space)。
- 到了JDK 8,永久代被完全移除,取而代之的是元空间(Metaspace)。这一改动提高了垃圾回收效率,而且克制了永久代满导致的应用程序崩溃。
大白话拆解:
- 有一本词典,内里包罗了很多常用的单词。每当你要写一篇文章时,你不会每次都重新写下这些单词,而是直接从词典里找现成的来用。这不但节省了纸张(内存),也加快了写作速度(性能)。Java里的String就有点像这个词典。
- 字符串常量池就像是这个“词典”,它保存着全部独一无二的字符串。当你在代码中利用一个字符串(好比"hello"),Java起首会检查这个“词典”里是否已经有了同样的字符串。如果有,它就会直接利用已有的那个,而不必再创建一个新的。
- 在JDK 6及更早版本中,这个“词典”是放在一个叫做方法区的地方,这是Java假造机(JVM)的一部分,专门用来存放类信息等静态数据。
- 但是,从JDK 7开始,开辟人员决定把这个“词典”搬到一个更大的地方——堆空间。堆空间是JVM为应用程序分配的重要内存区域,这里可以存储更多的东西,而且更容易管理。
- 到了JDK 8,从前存放类信息的方法区(即永久代)被彻底移除了,取而代之的是元空间,它用来存放类的元数据。这样一来,字符串常量池就完全在堆空间中了,这有助于更好地管理和优化内存。
举个栗子:
1、字符串常量池的工作原理
- 当你在代码中定义一个字符串字面量(如"hello")时,Java会先查看字符串常量池中是否有雷同的字符串。如果有,它会返回池中的引用;如果没有,它会创建一个新的字符串并放入池中。
- String s1 = "hello"; // 第一次创建,放入池中
- String s2 = "hello"; // 查找池中已有,直接引用
- System.out.println(s1 == s2); // 输出 true,因为它们引用的是同一个对象
复制代码
2、利用new关键字创建字符串
- 如果你利用new关键字创建字符串,即使内容雷同,也会在堆空间中创建一个新的对象,而不是从字符串常量池中获取。
- String s3 = new String("hello"); // 创建新对象,不在池中
- String s4 = new String("hello"); // 再次创建新对象,也不在池中
- System.out.println(s3 == s4); // 输出 false,因为它们是不同的对象
复制代码
3、利用intern()方法
- intern()方法可以将一个字符串加入到字符串常量池中,如果池中已经存在雷同的字符串,则返回池中的引用。
- String s5 = new String("hello").intern(); // 调用 intern() 方法
- String s6 = "hello"; // 直接从池中获取
- System.out.println(s5 == s6); // 输出 true,因为它们引用的是同一个对象
复制代码
1.3 String 的常用 API
1.3.1 构造器
官方语言
String类提供了多种构造器来创建字符串对象,它们允许你以差异的方式初始化一个String。以下是几个常用的构造器:
- public String()
- 初始化一个新的、空的String对象。
- String(String original)
- 初始化一个新创建的String对象,使其体现与参数雷同的字符序列。换句话说,新创建的字符串是该参数字符串的副本。
- public String(char[] value)
- 通过当前参数中的字符数组来构造新的String。
- public String(char[] value, int offset, int count)
- 通过字符数组的一部分来构造新的String。offset指定了字符数组中起始位置的索引,count指定了要利用的字符数目。
- public String(byte[] bytes)
- 通过利用平台的默认字符集解码当前参数中的字节数组来构造新的String。
- public String(byte[] bytes, String charsetName)
- 通过利用指定的字符集解码当前参数中的字节数组来构造新的String。如果给定的字符集名称无效,则抛出UnsupportedEncodingException非常。
大白话拆解:
String就像是一条由字母构成的项链。为了制作这条项链,你可以用差异的材料和方法。Java提供了几种差异的方式来创建这样的“项链”,即String对象。下面是几种常见的创建方式:
1、空的字符串
这就像是准备了一根空的绳子,还没有串上任何珠子(字母)。你可以用它来开始构建你的字符串。
- String emptyString = new String(); // 创建一个空字符串
复制代码
2、复制已有的字符串
如果你已经有了一个字符串,好比"hello",你可以轻松地制作它的复制品。这就像把一条现成的项链复制一份。
- String original = "hello";
- String copy = new String(original); // 复制 "hello"
复制代码
3、从字符数组创建字符串
你可以用一组单独的字符(每个字符就像一颗珠子)来创建一个字符串。这就像是用一串珠子穿成一条项链。
- char[] chars = {'h', 'e', 'l', 'l', 'o'};
- String fromChars = new String(chars); // 从字符数组创建 "hello"
复制代码
4、从字符数组的部分创建字符串
有时候你可能不想用整个字符数组,而是只用此中的一部分。这就好比你有一大堆珠子,但你只选择此中一些来穿成一条新的项链。
- char[] chars = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
- String fromPartOfChars = new String(chars, 0, 5); // 从字符数组的前5个字符创建 "hello"
复制代码
5、从字节数组创建字符串
字符串也可以从字节数组创建,这有点像你有一系列的数字代码,需要按照一定的规则(字符集)将它们转换成字母。默认情况下,Java会利用盘算机设置的字符集来完成这个转换。
- byte[] bytes = {72, 101, 108, 108, 111}; // 对应于 "Hello" 的ASCII值
- String fromBytes = new String(bytes); // 从字节数组创建 "Hello"
复制代码
6、从字节数组和指定字符集创建字符串
有时你需要明确指定怎样将字节数组转换为字符串,因为差异的语言和地区有差异的字符编码规则。这就像是你告诉别人应该用哪种语言或规则来解读这些数字代码。
- byte[] bytes = {72, 101, 108, 108, 111}; // 对应于 "Hello" 的ASCII值
- String fromBytesWithCharset = new String(bytes, "UTF-8"); // 使用UTF-8字符集从字节数组创建 "Hello"
复制代码
综合例子:
- // 空字符串
- String empty = new String();
- System.out.println("Empty string: '" + empty + "'");
- // 复制字符串
- String original = "Java is fun!";
- String copy = new String(original);
- System.out.println("Original: " + original);
- System.out.println("Copy: " + copy);
- // 从字符数组创建字符串
- char[] charArray = {'J', 'a', 'v', 'a'};
- String fromCharArray = new String(charArray);
- System.out.println("From char array: " + fromCharArray);
- // 从字符数组的一部分创建字符串
- String fromPartOfCharArray = new String(charArray, 1, 3); // 从索引1开始取3个字符
- System.out.println("From part of char array: " + fromPartOfCharArray);
- // 从字节数组创建字符串
- byte[] byteArray = {74, 97, 118, 97}; // Java的ASCII值
- String fromByteArray = new String(byteArray);
- System.out.println("From byte array: " + fromByteArray);
- // 从字节数组和指定字符集创建字符串
- String fromByteArrayWithCharset;
- try {
- fromByteArrayWithCharset = new String(byteArray, "UTF-8");
- System.out.println("From byte array with UTF-8: " + fromByteArrayWithCharset);
- } catch (java.io.UnsupportedEncodingException e) {
- System.out.println("Error: Unsupported character set.");
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |