day07_数组初识

news2025/1/18 11:08:19

数组的概述 

  • 数组就是用于存储数据的长度固定的容器,保证多个数据的数据类型要一致
  • 数组适合做一批同种类型数据的存储
  • 数组中的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用数据类型是,我们称为对象数组。

容器:是将多个数据存储到一起,每个数据称为该容器的元素。 生活中的容器:水杯,衣柜,教室..

百度百科中对数组的定义:

所谓数组(array),就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,以便统一管理他们,然后用编号区分他们,这个名字称为数组名,编号称为下标或索引(index)。组成数组的各个变量称为数组的元素(element)。数组中元素的个数称为数组的长度(length)。

数组的特点:

  • 数组一旦定义出来,程序执行的过程中,长度、类型就固定了
  • 创建数组时会在内存中开辟一整块连续的空间
  • 存取元素的速度快,因为可以通过[下标],直接定位到任意一个元素
  • “数据类型[ ] 数组名” 也可以写成 “数据类型 数组名[ ] ”。

一维数组的声明与初始化

代码示例

       //  定义一个存储int类型数组的变量arrayA
        int[] arrayA;
        //System.out.println(arrayA);错误的: arrayA只是一个用来存储数组的变量,但是目前没有向arrayA中存储数组

        //  定义一个存储double类型数组的变量arrayB
        double arrayB[];
        //System.out.println(arrayB);错误的: arrayB只是一个用来存储数组的变量,但是目前没有向arrayA中存储数组

当我们声明一个变量,而没有给其初始化的时候,是无法使用的。数组同样如此,下面我们就来学习一下数组的初始化方式

方式一 :数组动态初始化

数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

格式:

数组定义格式详解:  

  • 数组存储的元素的数据类型: 创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。例如:int, String, Student等
  • [ ] : 表示数组。
  • 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
  • =:表示赋值,把具体的=右边new出来的数组容器,存储到=左边的数组变量中,但是存储的是数组在内存空间的地址值
  • new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组对象。
  • [长度]:数组的长度,表示数组容器中可以存储多少个元素。

 定义可以存储5个整数的数组容器,代码如下:

//方式一
int[] arr = new int[5];
//方式二
int[] arr;
arr = new int[5]

方式二: 数组静态初始化

静态初始化就是在创建数组时,直接确定数组元素

标准格式:

 定义存储1,2,3,4,5整数的数组容器,代码如下

//方式一
int[] arr = new int[]{1,2,3,4,5};//正确

//方式二
int[] arr;
arr = new int[]{1,2,3,4,5};//正确

//int[] arr = new int[5]{1,2,3,4,5};错误的,后面有{}指定元素列表,就不需要在[长度]指定长度。

简化格式:

 定义存储1,2,3,4,5整数的数组容器,代码如下

int[] arr = {1,2,3,4,5};//正确

int[] arr;
//arr = {1,2,3,4,5};错误

两种初始化的的使用场景总结、注意事项说明:

  • 动态初始化:指定数组长度,后期赋值适合开始知道数据的数量,但是不确定具体元素值的业务场景。
  • 静态初始化:开始就存入元素值适合一开始就能确定元素值的业务场景。

数组的几个注意事项

  • 数据类型[ ] 数组名也可以写成 数据类型 数组名[ ]
  • 什么类型的数组存放什么类型的数据,否则报错
  • 数组一旦定义出来,程序执行的过程中,长度、类型就固定了。和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少。
  • 动态初始化和静态初始化 两种格式的写法是独立的,不可以混用
   public static void main(String[] args) {
        // 1、数据类型[] 数组名称 也可以写成 数据类型 数组名称[]
        int[] ages1 = {11, 23, 45};
        int ages2[] = {11, 23, 45};

        // 2、什么类型的数组只能存放什么类型的元素
        // String[] names = {"西门吹雪", "独孤求败", 23}; // 错误的

        // 3、数组一旦定义出来之后,类型和长度就固定了
        int[] ages2 = {11, 23, 45};
        System.out.println(ages2[3]); // 报错! 长度固定是3了不能访问第4个元素!!

        // 两种格式的写法是独立的,不可以混用
        // int[] arrs = new int[3]{30,40,50}; 错误
    }

一维数组

直接打印数组名称,输出的是一个十六进制的整数数字,代表数组在内存空间的地址值。我们要访问数组中的元素就必须用到index

索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,逐一增加,这个自动编号称为数组索引(index)可以通过数组的索引访问到数组中的元素。

  • 数组的最大索引:数组名. length – 1,前提:元素个数大于0
  • 索引范围:[0, 数组的长度-1]。
  • 格式:数组名[索引]

索引访问数组中的元素:

  • 数组名[索引] = 数值:为数组中的元素赋值
  • 变量 = 数组名[索引]:获取出数组中的元素

代码示例

public class Demo04Array {
    public static void main(String[] args) {
        //定义存储int类型数组,赋值元素1,2,3,4,5
        int[] arr = {1, 2, 3, 4, 5};
        //为0索引元素赋值为6
        arr[0] = 6;
        //获取数组0索引上的元素
        int i = arr[0];
        System.out.println(i);//6
        //直接输出数组0索引元素
        System.out.println(arr[0]);//6
    }
}

数组的遍历

数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1。

数组遍历: 就是将数组中的每个元素分别获取出来,就是遍历。简而言之:遍历就是就是对数组中元素的一个一个数据的访问。

public class Demo05Array {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5};
        //打印数组的属性,输出结果是5
        System.out.println("数组的长度:" + arr.length);

        //遍历输出数组中的元素
        System.out.println("数组的元素有:");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

数组元素的默认值

当我们使用动态初始化创建数组时,此时只确定了数组的长度,那么数组的元素是什么值呢?数组的元素有默认值,如下图所示

总结:

  • byte、short、int 、char、long类型数组元素的默认值都是0
  • float、double类型数组元素的默认值都是0.0
  • boolean类型数组元素的默认值是false、String类型数组元素的默认值是null

一维数组内存图

内存概述

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

详解

一个数组内存图

 结论:

  • 数组名称保存数组在堆内存中的地址值
  • 通过数组名称找到堆内存中的具体数组,然后通过索引编号找到对应的具体的某个元素

二个数组内存图

结论:

  • 数组名称保存数组在堆内存中的地址值
  • 通过数组名称找到堆内存中的具体数组,然后通过索引编号找到对应的具体的某个元素
  • 每个数组都有自己独立的内存空间,互不影响,互不干扰

两个变量指向一个数组

结论:

  • 数组名称保存数组在堆内存中的地址值
  • 通过数组名称找到堆内存中的具体数组,然后通过索引编号找到对应的具体的某个元素
  • 使用数组名进行赋值时,传递的是数组的内存地址值。

一维数组操作的两个常见问题

索引越界异常

观察一下代码,运行后会出现什么结果

public class Demo01ArrayTest {
    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr[3]);
    }
}

数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。解决方案将错误的索引修改为正确的索引范围即可!

空指针异常

观察一下代码,运行后会出现什么结果。

public class Demo02ArrayTest {
    public static void main(String[] args) {
        int[] arr = new int[3];
        //把null赋值给数组
        arr = null;
        System.out.println(arr[0]);
    }
}

arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。解决方案:给数组一个真正的堆内存空间引用即可

一维数组经典习题

数组获取最大值

/*
   需求: 从数组 int[] arr = {12,45,98,73,60}中查找最大值
*/
public class Demo03ArrayTest {

    public static void main(String[] args) {
        int[] arr = {12, 45, 98, 73, 60};
        // 1. 假设数组中的第一个元素为最大值
        int max = arr[0];
        // 2. 遍历数组, 获取每一个元素, 准备进行比较
        for (int i = 1; i < arr.length; i++) {
            // 3. 如果比较的过程中, 出现了比max更大的, 让max记录更大的值
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        //  4. 循环结束后, 打印最大值.
        System.out.println("max:" + max);
    }
}

数组基本查找

package demo02;

import java.util.Scanner;
/*
           需求:
               已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引,并在控
               制台输出找到的索引值。

  */
public class Demo04ArrayTest {
        public static void main(String[] args) {
            // 1.定义一个数组,用静态初始化完成数组元素的初始化
            int[] arr = {19, 28, 37, 46, 50};
            // 2.键盘录入要查找的数据,用一个变量接收
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您要查找的元素:");
            int num = sc.nextInt();
            // 3.定义一个索引变量,初始值为-1
            // 假设要查找的数据, 在数组中就是不存在的
            int index = -1;
            // 4.遍历数组,获取到数组中的每一个元素
            for (int i = 0; i < arr.length; i++) {
                // 5.拿键盘录入的数据和数组中的每一个元素进行比较,如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
                if(num == arr[i]){
                    // 如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
                    index = i;
                    break;
                }
            }
            //  6.输出索引变量
            System.out.println(index);
        }
}

评委打分

import java.util.Scanner;
/*
       需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
               选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。
*/
public class Demo05ArrayTest {
    public static void main(String[] args) {
        // 1.定义一个数组,用动态初始化完成数组元素的初始化,长度为6
        int[] arr = new int[6];
        // 2.键盘录入评委分数
        Scanner sc = new Scanner(System.in);
        //  3.由于是6个评委打分,所以,接收评委分数的操作,用循环
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第" + (i+1) + "个评委的打分:");
            int score = sc.nextInt();
            if(score >= 0 && score <= 100){
                // 合法的分值
                arr[i] = score;
            }else{
                // 非法的分值
                System.out.println("您的打分输入有误, 请检查是否是0-100之间的");
                i--;
            }
        }

        // 4.求出数组最大值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(max < arr[i]){
                max = arr[i];
            }
        }

        // 5.求出数组最小值
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(min > arr[i]){
                min = arr[i];
            }
        }

        // 6.求出数组总和
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }

        // 7.按照计算规则进行计算得到平均分
        int avg = (sum - max - min ) / 4;

        // 8.输出平均分
        System.out.println(avg);
    }
}

二维数组

概述 : 二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器。本质上就是元素为一维数组的一个数组。 二维数组存储一维数组的时候,存储的是一维数组的内存地址。二维数组中存储的是一维数组, 能存入 提前创建好的一维数组。

二维数组的声明与初始化

代码示例

//推荐
int[][] arrA;
//不推荐
int[] arrB[];
//不推荐
int arrC[][];

 注意:

静态初始化

代码示例

package sgg.demo01;
/*

静态初始化
	  方式一: 数据类型[][] 标识符 = {{一维数组的元素},{一维数组的的元素},{一维数组的元素}};
	  方式二: 数据类型[][] 标识符 = new 数据类型[][]{{一维数组的元素},{一维数组的元素}};
注意:
    1.二维数组的长度 指的是 数组内一维数组的个数
	2.三维数组的元素 就是二维数组 。。。。。 n维数组 存储的元素 是 n-1 维数组
*/

public class Demo02 {
    public static void main(String[] args) {
        // 方式一: 数据类型[][] 标识符 = {{一维数组的元素},{一维数组的的元素},{一维数组的元素}};
        int[][] arrA = {{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}; //要求声明与静态初始化必须一起完成

        //方式二: 数据类型[][] 标识符 = new 数据类型[][]{{一维数组的元素},{一维数组的元素}};
        int[][] arrB = new int[][]{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}};
        //或者
        int[][] arrC;
        arrC = new int[][]{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}};
    }
}

动态初始化

每一行的列数是相同的

 代码示例

public static void main(String[] args) {
    //定义一个二维数组
    int[][] arr = new int[3][2];
    
    //定义了一个二维数组arr
    //这个二维数组有3个一维数组的元素
    //每一个一维数组有2个元素
    //输出二维数组名称
    System.out.println(arr); //地址值    [[I@175078b
    
    //输出二维数组的第一个元素一维数组的名称
    System.out.println(arr[0]); //地址值    [I@42552c
    System.out.println(arr[1]); //地址值    [I@e5bbd6
    System.out.println(arr[2]); //地址值    [I@8ee016
    
    //输出二维数组的元素
    System.out.println(arr[0][0]); //0
    System.out.println(arr[0][1]); //0
    
}     

每一行的列数是不相同的

 代码示例

public static void main(String[] args) {
        //定义数组
        int[][] arr = new int[3][];
        
        System.out.println(arr);    //[[I@175078b
        
        System.out.println(arr[1][0]);//NullPointerException
        System.out.println(arr[0]); //null
        System.out.println(arr[1]); //null
        System.out.println(arr[2]); //null
        
        //动态的为每一个一维数组分配空间
        arr[0] = new int[2];
        arr[1] = new int[3];
        arr[2] = new int[1];
        
        System.out.println(arr[0]); //[I@42552c
        System.out.println(arr[1]); //[I@e5bbd6
        System.out.println(arr[2]); //[I@8ee016
        
        System.out.println(arr[0][0]); //0
        System.out.println(arr[0][1]); //0
        //ArrayIndexOutOfBoundsException
        //System.out.println(arr[0][2]); //错误
        
        arr[1][0] = 100;
        arr[1][2] = 200;
    }

二维数组中的相关操作

  • 获取二维数组中一维数组的个数:二维数组名.length
  • 获取二维数组中指定的一维数组二维数组名[行下标],行下标的范围:[0, 二维数组名.length-1]
  • 获取二维数组中指定一维数组中元素的个数二维数组名[行下标].length
  • 获取具体的某一个元素:二维数组名[一维数组下标][一维数组中元素的下标]

二维数组遍历

方式一:

public class Test1 {
    /*
        需求:

            已知一个二维数组 arr = {{11, 22, 33}, {33, 44, 55}};
            遍历该数组,取出所有元素并打印

        步骤:
            1. 遍历二维数组,取出里面每一个一维数组
            2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
     */
    public static void main(String[] args) {
        int[][] arr = {{11, 22, 33}, {33, 44, 55}};

        // 1. 遍历二维数组,取出里面每一个一维数组
        for (int i = 0; i < arr.length; i++) {
            //System.out.println(arr[i]);
            // 2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }
    }
}

方式二:

    public static void main(String[] args) {
        String[][] strArr = {{"蔡旭坤","特朗普"},{"杨幂","高圆圆","尼古拉斯*赵四"},{"胡歌","彭于晏","成龙","吴彦祖"}};
        //增强for
        for (String[] strings : strArr) {
            for (String s : strings) {
                System.out.print(s+"\t");
            }
            System.out.println();
        }
    }

元素打乱

import java.util.Random;

/*
    需求:已知二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}};用程序实现把数组中的元素打乱,并在控制台输出打乱后的数组元素
 */
public class ArrayTest02 {
    public static void main(String[] args) {
        //定义二维数组,并进行静态初始化
        int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

        //创建随机数对象
        Random r = new Random();

        //遍历二维数组,进行元素打乱
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                //arr[i][j]
                int x = r.nextInt(arr.length);
                int y = r.nextInt(arr[x].length);

                //元素交换
                int temp = arr[i][j];
                arr[i][j] = arr[x][y];
                arr[x][y] = temp;
            }
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

二维数组的内存图分析

查看下面代码,分析在内存中的存储方式

 int[][] arr = {
            {1},
            {2,2},
            {3,3,3},
            {4,4,4,4},
            {5,5,5,5,5}
        };

代码内存图,如下所示

结论:

二维数组存储的是一维数组的内存地址值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始学C语言的个人心得笔记(10w字)

大学的计算机相关专业第一门教学的计算机语言就是c语言&#xff0c;很多大学生面对从未接触过的计算机语言&#xff0c;可能会觉得很难以上门&#xff0c;从而放弃学习c语言。这篇博客写的主要是个人学习C语言时候的知识总结点&#xff0c;不能保证全部是正确的&#xff0c;如有…

Kafka灵魂28问

第 1 题 Kafka 数据可靠性如何保证&#xff1f; 对于 kafka 来说&#xff0c;以下几个方面来保障消息分发的可靠性&#xff1a; 消息发送的可靠性保障(producer) 消息消费的可靠性保障(consumer) Kafka 集群的可靠性保障&#xff08;Broker&#xff09; 生产者 目前生产者…

Leetcode每日一题——“用队列实现栈”

各位CSDN的uu们你们好呀&#xff0c;好久没有更新本专栏啦&#xff0c;甚是想念&#xff01;&#xff01;&#xff01;今天&#xff0c;小雅兰的学习内容是用队列实现栈&#xff0c;下面&#xff0c;让我们进入Leetcode的世界吧&#xff01;&#xff01;&#xff01; 这是小雅兰…

本地 docker 发布 java 项目,连接本地 redis 配置

1、本地项目 install 相应的 jar 包到 target 目录下&#xff0c;jar 包的路径步骤 2 要填写 2、项目根目录下创建 Dockerfile 文件 # 使用官方的 Java 11 镜像作为基础镜像 FROM openjdk:11-jdk# 设置工作目录 WORKDIR /app# 复制应用程序 JAR 文件到镜像中的 /app 目录下 C…

用LangChain实现一个ChatBlog

文章目录 前言环境一、构建知识库二、将知识库向量化三、召回四、利用LLM做阅读理解五、效果总结 前言 通过本文, 你将学会如何使用langchain来构建一个自己的知识库问答 其实大多数类chatpdf产品的原理都差不多, 我将其简单粗暴地分为以下四步: 构建知识库将知识库向量化召回…

vue diff算法与虚拟dom知识整理(11) 书写patch父级新旧为同一节点 子节点与文字交换逻辑实现

上文我们简单描述了patch处理同一节点的大体逻辑 这次 我们就来看一下text替换的情况 我们更改案例入口文件 src下的 index.js 代码如下 import h from "./snabbdom/h"; import patch from "./snabbdom/patch";const container document.getElementById(…

Maven概念及搭建

1.为什么我们要学习 maven? maven 还未出世的时候&#xff0c;我们有很多痛苦的经历 。 痛点 1&#xff1a; jar 包难以寻找 痛点 2&#xff1a; jar 包依赖的问题 痛点 3&#xff1a; jar 不方便管理 痛点 4&#xff1a;项目编译 2.Maven 简介 Maven 是 Apache 软件基金…

Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

目录 管道&#xff08;channel&#xff09; 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道…

APP服务端架构的演变

大家好&#xff0c;我是易安&#xff01; 早期2013年的时候&#xff0c;随着智能设备的普及和移动互联网的发展&#xff0c;移动端逐渐成为用户的新入口&#xff0c;各个电商平台都开始聚焦移动端App&#xff0c;如今经历了10年的发展&#xff0c;很多电商APP早已经没入历史的洪…

日语文法PPT截图31-45

31 形式名词 とき ところ 作为形式名词的话&#xff0c;一般是要写假名不写汉字的 相对时态 如果是一般时/将来时とき&#xff0c;就是先做后面的动作&#xff0c;在做前面的动作。 出教室的时候&#xff0c;关灯。 如果是过去时とき那么&#xff0c;是先做前面的动作&#…

Linux安装elk

稍后补充。 目录 01【安装elk】 es单机 es集群 esHead插件 kibana logstash elastic search:https://www.elastic.co/cn/downloads/elasticsearchlogstash:https://www.elastic.co/cn/downloads/logstashkibana:https://www.elastic.co/cn/downloads/kibana linux下安装E…

vector的介绍

vector的介绍&#xff1a;(vector翻译是向量&#xff0c;但是表示的是顺序表) vector是表示可以改变大小的数组的序列容器。 就像数组一样&#xff0c;vector对其元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素&#xf…

前端代码规范配置

前端代码规范配置 涉及到了eslint、prettier、husky、lint-staged等工具包的使用。 代码规则校验 使用eslint定义代码风格 安装eslint并在.eslintrc.js文件中配置。 npm i eslint -D这个代码风格可以使用公司团队内的规范&#xff0c;如果没有可以在github中找到一些主流的…

主机访问不到虚拟机(centos7)web服务的解决办法

目录 一、背景 二、解决办法 2.1、配置虚拟机防火墙 2.2、修改虚拟机网络编辑器 一、背景 主机可以访问外网&#xff0c;虚拟机使用命令&#xff1a;curl http://网址&#xff0c;可以访问到web服务 &#xff0c;主机使用http://网址&#xff0c;访问不到虚拟机&#xff08…

TikTok掀动出海淘金潮

嘉晟迪科&#xff1a;在各行各业都已经卷成红海的今天&#xff0c;最稀缺的是什么&#xff1f;当然是增长。那么&#xff0c;增长在哪里&#xff1f;流量在哪里&#xff0c;需求就在哪里&#xff0c;增长也就在那里。 因为短视频风靡全球的流行&#xff0c;内容平台特别是短视频…

Python-web开发学习笔记(2)--- HTML基础

先回顾一下上一篇文章&#xff1a;Python-web开发学习笔记&#xff08;1&#xff09;--- HTML基础_python web开发笔记_尚拙谨言的博客-CSDN博客 中讲了哪几个常用的HTML标签&#xff1a; <head>&#xff1a;头声明 <title>&#xff1a;网页标题 <h1>~<h6…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

深度学习实战四:全连接神经网络(基于Pytorch,含数据和详细注释)

文章目录 概念softmax与交叉熵反向传播计算机视觉工具包torchvision全连接神经网络实现多分类概念 神经网络的第一层为输入层,最后一层为输出层,中间的所有层都叫做隐藏层 在计算神经网络层数时,一般不计算输入层,比如: 该神经网络的层数为2。输入层神经元有3个,隐藏层…

redis缓存数据库的使用

一&#xff0c;什么是redis &#xff1f;为什么要用它&#xff1f; 简单介绍&#xff1a; Redis是开源的key-value缓存框架&#xff0c;由c语言编写&#xff0c;也是一款高性能的框架提供多种语言的API 。 SET 每秒11万次 取get每秒81000次。 数据完全存储在内存空间中&…

【C++从0到王者】第八站:模板初阶

文章目录 一、泛型编程二、函数模板1.函数模板概念2.函数模板格式3.函数模板的原理4.函数模板的实例化1.隐式实例化2.显示实例化 5.模板参数的匹配原则 三、类模板1.类模板的格式2.类模板的实例化 一、泛型编程 当我们在写一个交换程序的时候 按照我们之前的想法&#xff0c;我…