您现在的位置是:首页 > 正文

Javase | 字符编码、转义字符、方法执行过程中的 “内存分配”

2024-04-01 02:07:06阅读 1

字符编码

  • 为了让计算机可以表示现实世界中的文字,我们需要人为进行干涉,需要人负责提前制定文字” 和 “二进制” 之间的对照关系。这种对照关系被称为:字符编码
  • 字符编码就是人为干涉的一本字典 / 一张对照表,在这种对照表中很清楚的描述了 “文字”和“二进制‘之间的对照关系
  • 计算机 最初只支持英文最先出现字符编码是: ASCII码 。编码和解码的时候采用同一套字典/对比表,不会出现乱码。

  • 随着计算机的发展,后来出现了一种新的编码方式,是国际化标准组织ISO制定的,这边编码方式支持西欧语言。其会向上兼容ASCII码,仍然不支持中文。这种编码方式是 : ISO-8859-1 ,又被称为 latin-1

  • 随着计算机向亚洲发展,计算机开始支持中文、日文、韩文等国家文字,其中支持简体中文的编码方式:GB2312 < GBK < GB18030

    GB2312可表示的汉字最少GB2312可表示的汉字最多

  • 支持繁体中文 : 大五码 Big5

  • 后来出现了一种编码方式统一了全球所有文字,容量较大,这种编码方式叫做:unicode编码 (万国码)。

  • unicode编码方式有多种具体的实现:

    UTF-8
    UTF-16
    UTF-32

  • Java语言代码采用的是unicode编码,所以“标识符”可以识别中文

转义字符:

转义字符
  • 字符常量中,反斜杠号\ )具有转义功能,是 转义字符是不能单独出现

  • 转义字符” 结合 “特定的字符” 能形成一个“新的字符”。

  • 转义字符的作用是转义后面的一个字符

    转义字符出现在特殊字符之前会将特殊字符转义成普通字符

    如:

    char c1 = ‘n’; //字符n 和 字符 t 是一个普通字符
    char c2 = ‘t’;
    此时 反斜杠号 (\) 是转义字符。两者相结合转义成一个新的字符

    \+n —-> \n : 表示换行符 (表示的是一个字符)

    \+t —–> \t : 表示制表符 (表示的是一个字符)

    例子如:

     //字符n 和 字符t 是一个普通字符
        char c1 = 'n';
        char c2 = 't';
    
        /*
         * “转义字符” 结合 “特定的字符”能形成一个“新的字符”。
         *
         *   n  : 普通字符
         *   \  : 转义字符
         *   \n : 转义成一个新的字符 : 换行符
         */
    
        /*
         *  t  : 普通字符
         *  \  : 转义字符
         *  \t : 转义成一个新的字符: 制表符
         */
    

    有一个问题:

    既然反斜杠号 (\)转义字符,且不能单独出现 (”转义字符“ 配合 “特定的字符” 一起使用),那如果我们想要输出,或说就要输出 (普通含义/ 键盘含义上的) 反斜杠号本身那咋办呢?

    好办,那就让 “转义字符”是它,“特定的字符”也是它。即 反斜杠号 (\) + 反斜杠号 (\) , 两个结合的含义就是普通含义反斜杠号字符 (\)
    如 : \\ —> \

    (第一个“转义字符“ 有转义功能,它会把后面那个有也有转义功能、也有特殊含义的“转义字符” 转换成不具备特殊含义普通斜杠字符

    结论:
    在java中两个反斜杠(转义字符) 代表一个普通的反斜杠字符

转义字符出现在特殊字符之前会将特殊字符转义成普通字符

\n : 换行符

\r : 回车符

\t : 制表符

\’ : 普通的单引号

\" : 普通的双引号

在控制台上输出 “反斜杠字符”
  • 有一个问题:

  • 既然反斜杠号 (\)转义字符,且不能单独出现 (”转义字符“ 配合 “特定的字符” 一起使用),那如果我们想要输出,或说就要输出 (普通含义/ 键盘含义上的) 反斜杠字符本身那咋办呢?

  • 好办,那就让 “转义字符”是它,“特定的字符”也是它。即 反斜杠号 (\) + 反斜杠号 (\) , 两个结合的含义就是普通含义反斜杠号 (\)

    如 : \\ —> \

    (第一个“转义字符“ 有转义功能,它会把后面那个有也有转义功能、也有特殊含义的“转义字符” 转换/转义 成不具备特殊含义普通斜杠字符

    结论:
    在java中两个反斜杠(转义字符) 代表一个普通的反斜杠字符

在控制台上输出 “单引号字符”
  • 反斜杠具有转义功能

  • 反斜杠 + 一个单引号 字符 : 将有特殊含义单引号转义成 普通单引号。即可 (在控制台) 输出 “单引号字符”。

    转义字符将有特殊含义单引号转义成普通单引号

        /*
         * 在控制台上输出一个普通的单引号字符 :
         * 用转义字符,将有配对功能的"单引号" 转义成: 普通的 "单引号"
         */
        //反斜杠具有转义功能,将第二个单引号转换/转义为: 普通的单引号字符
        //第一个单引号和最后一个单引号配对。
        char c3 = '\'';
        System.out.println(c3);
    
            //在控制台上输出一个普通的单引号字符
            char c = 'a'; //正常输出字符a
    
            //java中不允许这样编写程序,会编译报错
            char c1 ='';
    
            //以下编译报错: 第一个单引号和第二个单引号配对,最后的单引号找不到最后一半。
            char c2 =''';
    
            /**
             * 在控制台上输出一个普通的单引号字符 :
             * 用转义字符,将有配对功能的"单引号" 转义成: 普通的"单引号"
             */
            //反斜杠具有转义功能,将第二个单引号转换/转义为: 普通的单引号字符
            //第一个单引号和最后一个单引号配对。
            char c3 = '\'';
            System.out.println(c3);
    

方法执行过程中的 “内存分配”

  • 分析下面类中方法执行过程中的 “内存分配”
```java
public class MethodTest {
    public static void main(String[] args) {
        int a =10;
        int b =20;

        int resultValue = sumInt(a,b);
        System.out.println(resultValue);
    }
 
    private static int sumInt(int i, int j) {
        int result =i + j;
        int num =3;
        int resultValue = divide(result, num);
        return resultValue;
    }

    private static int divide(int x, int y) {
        int z = x / y;
        return z;
    }
}
```
  • 类加载。把MethodTest类String类System类加载到 JVM中。

  • ②执行main方法 。开辟一个属于main方法的独立的 (栈内存) 内存空间。
    依次执行main方法中的ab变量sumInt( )方法。a b变量是局部变量在main内存中开辟两个空间存放。执行sumInt( )方法

  • ③执行 sumInt( )方法。开辟一个属于sumInt方法的独立的 (栈内存) 内存空间。方法内的变量为局部变量。参数传递的是

  • ④执行 divide( )方法。开辟一个属于divide方法的独立的 (栈内存) 内存空间。方法内的变量为局部变量。参数传递的是

  • ⑤ 最后一层一层return值

    在这里插入图片描述

  • ps :

    方法中进行参数传递时,传递的变量中保存的

    ②处于栈顶部的元素是活跃状态

网站文章

  • python 脚本第一行怎么写

    一、 python脚本第一行的写法:【#!/usr/bin/env python】。该语句告诉操作系统执行该脚本时,首先到env设置里查找python的安装路径,然后调用对应路径下的解释器程序完成操作...

    2024-04-01 02:06:59
  • jszip压缩服务器文件,使用JSZip压缩驻留在服务器上的PDF

    对不起,在这篇文章中缺少链接:这是我在stackoverflow上的第一篇文章,正如错误消息所说,“[我]需要至少10个声望才能发布2个以上的链接。”下载PDF(或任何二进制文件),你可以使用xhr....

    2024-04-01 02:06:52
  • linux mtp 代码,Linux MTP 的故事

    Linux下面有许许多多糟糕的故事,输入法算是其中之一,不过今天我们要讲的是另外一个故事。这个故事本质上和KDE关系不大,不过也算让我纠结了许久了。首先来介绍一下MTP,MTP是Media Trans...

    2024-04-01 02:06:15
  • Docker私房菜————Docker Compose| Compose安装和使用|快速单机编排|

    Docker私房菜————Docker Compose| Compose安装和使用|快速单机编排|

    目录 1.概念1.1 Docker Compose是什么1.2 YAML1.3 yml 文件配置指令参考1.4 Compose命令说明 2.compose的安装和使用2.1 安装compose2.2...

    2024-04-01 02:06:07
  • ruby on rails 撤销取消操作

    撤销操作一个常见的情况是更改控制器的名字,这时你得删除生成的文件。生成控制器时,除了控制器文件本身之外,Rails 还会生成很多其他文件(参见代码清单 3.6)。撤销生成的文件不仅仅要删除控制器文件,还要删除不少辅助文件。rails generate 命令还会自动修改routes.rb 文件,因此我们也想自动撤销这些修改。)在 Rails 中,可以使用rails des

    2024-04-01 02:06:01
  • 解决Powershell无法执行路径中包含空格的脚本文件

    解决Powershell无法执行路径中包含空格的脚本文件

    当然,如果当前已经处于powershell环境中,可以直接使用。这时可以借助powershell中的调用运算符。下面的示例展示了使用调用运算符和不使用的区别。

    2024-04-01 02:05:53
  • Leakcanary检测泄漏流程原理分析

    Leakcanary检测泄漏流程原理分析

    内存泄漏指的是程序在向系统申请分配内存空间,使用完毕后未释放,结果导致一直占据该内存单元,程序无法再使用该内存单元

    2024-04-01 02:05:14
  • TypeSprict-1.语法小入门

    类型注解 类似于 function setString(name:String),如果在传入参数时非字符串类型,编译时会报错。接口typejs有接口并且不需实现,只需要在传入时符合接口的要求结构即可。interface Person{ firstName:string; lastName:string;}function greeter(person:Person){ return "...

    2024-04-01 02:05:07
  • java 之BufferedOutputStream的flush和close方法的区别

    java 之BufferedOutputStream的flush和close方法的区别

    BufferedOutputStream的flush和close方法的区别 * flush()方法 * 1.用来刷新缓冲区,刷新后可以再次写出 * close()方法 * 2.用来关闭流释放资源 * 3.如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭之后不能再写入 package com.feng; import ...

    2024-04-01 02:04:59
  • 线程同步 CCriticalSection(临界区类)

    线程同步 CCriticalSection(临界区类) 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代...

    2024-04-01 02:04:19