String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔

云惠网小编 2021年11月24日19:20:29
评论
3901字阅读13分0秒
摘要

文章目录前言什么是字符串?什么是字符?注意问题:创建字符串第一种:直接赋值第二种: 调用构造方法进行构造对象(就是去new‘一个)第三种:了解字符串类型根据上图,我们发现对于字符串来说,有两个属性,一个是char 类型的 value数组(此时这个数组,只是一个变量【引用类型】,没有给这个数组,分配内存。也没有new)。一个是 哈希码。前言 字符串:在C语言里面 是 没有字符串类型的!但是,在 Java 和 C++ 里,有字符串类型【String】 什么是字符串?什么是字符? 使

广告也精彩

附图

效果图(很明显答案是false,一个完整,一个拼接。两者肯定不同)

附图

下面,我们来更深层次的分析一下为什么字符串不能被修改


创建方法与创建数组,几乎一样。



在这里插入图片描述

特殊:String 类型的数据,可以通过反射修改

特殊引用

结论:

;public class Test2 {
public static void main(String[] args) {
String str = "hello";
str =str + " world";
str+="!!!";
System.out.println(str);
}
}
import java.util.Arrays;
public class Test {
public static void func(String s,char[] array){
s = "author";
array[0] = 'p';
}
public static void main(String[] args) {
String str = "abcd";
char[] chars = {'y','o','u'};
func(str,chars);
System.out.println(str);
System.out.println(Arrays.toString(chars));
}
}

例题2: 将例题1中的 str,重新赋值会不会影响 str2的输出结果?

数组的整体赋值 ,在Java中,只有一次机会,就是在定义数组的时候。


实例4

效果图


字符串:
在C语言里面 是 没有字符串类型的!
但是,在 Java 和 C++ 里,有字符串类型【String】

例子3



public class Test {
public static void main(String[] args) {
char[] chars = {'a','b','c'};
String str3 = new String(chars);
System.out.println(str3);
}
}


使用双引号,且双引号中包含任意数量的字符【“abcdef”,“a”】,就是字符串。
使用单引号,且单引号中,只包含一个字符【‘a’,‘强’】,就是字符。

在这里插入图片描述

效果图

字符串比较

第二种: 调用构造方法进行构造对象(就是去new‘一个)


例子1


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

根据上图,我们发现对于字符串来说,有两个属性,一个是char 类型的 value数组(此时这个数组,只是一个变量【引用类型】,没有给这个数组,分配内存。也没有new)。一个是 哈希码。

equals

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
在这里插入图片描述


附图

实例5

“hello” 这样的字符串字面值常量, 类型也是 String.
String 也是引用类型. String str = “Hello”; 这样的代码内存布局如下
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
^**

实例1

public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "he";
String str3 = str1+"llo";
System.out.println(str1 == str3);
}
}

在这里插入图片描述

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
在这里插入图片描述

效果图

实例7

语法 调用者.equals();
如果调用是引用类型的数据,就需要注意,调用者不能空引用/空指针。防止出现空指针异常错误
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
在这里插入图片描述

实例6

在这里插入图片描述

附图

在这里插入图片描述


在这里插入图片描述

字符串拼接

注意问题:

public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2);
}
}

例子2


在这里插入图片描述

效果图


第三种:

在这里插入图片描述

附图

public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "he"+"llo";// 注意:此时两个字符串都是常量,且在编译的时候就已经确定了是"hello"
// 简单来说像这种 直接拿两个字符串常量来拼接的,在编译时,就默认是拼接好了的,或者说 默认就是一个完整的字符串常量
System.out.println(str1 == str2);
}
}

附图(底层分析)

实例2



1. 在Java当中,没有所谓的字符串以 ‘\0’ 结尾。
2. String 类 ,不能继承。
在这里插入图片描述

拓展

public class Test {
public static void main(String[] args) {
String str = "abcef";
String str2 = str;
System.out.println(str);
System.out.println(str2);
}
}

创建字符串

实例7(特别版)


效果退

在这里插入图片描述

在Java中,new String类型数据的时候,是不会存在内存重叠的情况,在Java中,字符串是一个对象,而我们new String 对象时,是产生一个新的对象,如果产生的对象是一样的,那还叫新对象??

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
找到 main 部分
在这里插入图片描述

在这里插入图片描述


如果 我在程序中,在 str2后面加上一句代码 str2.intern(); 呢?
intern() 的作用:将它的调用者,手动入池。

效果图



在这里插入图片描述



按住Ctrl,点击String,进入String
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
在这里插入图片描述


例题一

String 类型的数据不可变

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
如果是引用类型变量之间的比较,且使用双等号来比较的话,比较的就是引用变量存储的地址。相信大家应该明白,上面的例题就是这样比较的。

在这里插入图片描述



在这里插入图片描述


还是上一个程序,如果我非要把字符串"abcde"的 a 改成 g 呢?
可以,前面我们也看到,String类型的数据,是数组的形式存储在对上,既然是数组,那么我们可以通过下标去修改它,
但是问题是 value 的权限是private 是 私有的
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
所以,即使我们拿到了对象,都拿不到value的
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
但是 反射 就可以走到,反射的功能异常强大。
反射 是什么?
举一个很形象的例子:
我们每次坐地铁,我们所带的行李箱,都需要进过安检,了解过的都知道,安检的机器,会发射一中光谱的曲线,通过反射,就能知道我们的行李箱中装了什么东西。从这里就体现出了 “反射” 的 概念
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
这里是类比一下, 通过"反射"。我们能看到类里面存储的一些属性,哪怕是私有的,又或者是上锁了。我都能看到,
也就是说:通过反射,我们能获取其中所有信息。
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
其实 反射就是最大bug,用得好,那叫一个nice,用的不好,那叫一个难受。


什么是字符串?什么是字符?

附图

实例3

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
在这里插入图片描述

在上面两个例题中,我们需要搞懂:字符串常量是不能被改变的

例如: String str = “abcd”; 通过引用 str 去将 字符串"abcd" 修改成 “gbcd”.
答案是做不到的,因为被双引号引起来的是字面值常量,常量是不能被修改的。
例题2中,str = “author”; 这句代码是将str重新指向一个新的对象(修改str的指向),而不是将原来的字符串对象修改成author。

附图

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

public class Test {
public static void main(String[] args) {
String str1 = "11";
String str2 = new String("1")+ new String("1");
System.out.println(str1==str2);
}
}

前言

了解字符串类型


在这里插入图片描述

注意事项

String Class – 字符串类型 – 上半部分讲解 – Java – 细节狂魔
这里先给大家打个底,后面,我会详细讲解.。
我们先来搞懂String的对象(通过创建字符串的第三种方法)
String 常用的构造方法就是数组
在这里插入图片描述

import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
System.out.println(str1==str2);
}
}

第一种:直接赋值

文章目录

  • 前言
  • 什么是字符串?什么是字符?
  • 注意问题:
  • 创建字符串
    • 第一种:直接赋值
    • 第二种: 调用构造方法进行构造对象(就是去new‘一个)
    • 第三种:
  • 了解字符串类型
    • 根据上图,我们发现对于字符串来说,有两个属性,一个是char 类型的 value数组(此时这个数组,只是一个变量【引用类型】,没有给这个数组,分配内存。也没有new)。一个是 哈希码。
    • 注意事项
      • 例题一
        • 效果图
          • 附图
    • 例题2: 将例题1中的 str,重新赋值会不会影响 str2的输出结果?
  • 在上面两个例题中,我们需要搞懂:字符串常量是不能被改变的
    • 下面,我们来更深层次的分析一下为什么字符串不能被修改
      • 实例1
        • 附图
          • 结论:
      • 实例2
        • 效果图
        • 附图
      • 实例3
        • 效果图
        • 附图
      • 实例4
        • 效果图
        • 附图
      • 实例5
        • 效果图
      • 实例6
        • 效果图(很明显答案是false,一个完整,一个拼接。两者肯定不同)
        • 附图(底层分析)
      • 实例7
      • 实例7(特别版)
        • 效果退
        • 附图
      • 字符串比较
        • equals
    • 拓展
    • 在Java中,new String类型数据的时候,是不会存在内存重叠的情况,在Java中,字符串是一个对象,而我们new String 对象时,是产生一个新的对象,如果产生的对象是一样的,那还叫新对象??
    • String 类型的数据不可变
    • 数组的整体赋值 ,在Java中,只有一次机会,就是在定义数组的时候。
      • 例子1
      • 例子2
      • 例子3
    • 特殊引用
    • 字符串拼接
      • 附图
    • 特殊:String 类型的数据,可以通过反射修改

public class Test {
public static void main(String[] args) {
String str2 = new String("1")+ new String("1");
str2.intern();
String str1 = "11";
System.out.println(str1==str2);
}
}

在这里插入图片描述


不是说 转引用 就能改变实参的值。
你要看,到底这个引用干了什么!


本文转自 https://blog.csdn.net/DarkAndGrey/article/details/121443847

腾讯云618
云惠网小编
cgb2110-day06 java

cgb2110-day06

文章目录一,模拟用户登录过程--1,需求--2,测试--3,程序优化二,SQL攻击/注入--1,概述--2,解决方案--3,修改代码--4,两种传输器的区别三,练习新的传输器--1...
JAVA 初级程序员常见问题分析 java

JAVA 初级程序员常见问题分析

1、怎么样可以尽快拿到offer?针对心仪的企业、岗位进行调查。可以上招聘网站看看其岗位要求,以及企业的面试题。然后针对性的学习其要求的技术。这样有针对性的准备,投其所好,就可更快...
关于数据库学习的一些知识盲区 java

关于数据库学习的一些知识盲区

一.SQL拼接方法的安全风险 1. SQL注入问题(SQL Inject),使用字符串拼接构造SQL就会引起SQL注入。 2. SQL注入是存在安全风险的 3. 例如:在图书管理系...
szu-exp 安卓开发实验3我的校园 java

szu-exp 安卓开发实验3我的校园

发扬开源精神... 给个赞吧giegiejiejie们 实验目的与要求: 目的:掌握安卓中活动的编写、自定义用户界面的开发、碎片开发、广播机制以及数据持久化技术等;并能通过对课堂知...
腾讯云618

发表评论