图灵日记之java奇妙历险记--输入输出方法数组

news2024/9/24 9:17:17

目录

  • 输入输出
    • 输出到控制台
    • 从键盘输入
      • 使用 Scanner 读取字符串/整数/浮点数
      • 使用 Scanner 循环读取
  • 猜数字
  • 方法
    • 方法定义
    • 方法调用的执行过程
    • 实参和形参的关系(重要)
    • 方法重载
  • 数组
    • 数组的创建
    • 数组的初始化
      • 动态初始化
      • 静态初始化
    • 数组的使用
      • 元素访问
      • 遍历数组
    • 数组是引用类型
    • null
    • 数组应用
    • 数组转字符串
    • 数组拷贝
    • 二维数组

输入输出

输出到控制台

基本语法:
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
栗子:

    public static void main(String[] args) {
        System.out.println("2");
        System.out.print("2");
        System.out.printf("%d",2);
    }

转换符 类型
d 十进制整数
x 十六进制整数
o 八进制整数
f 定点浮点数
e 指数浮点数
g 通用浮点数
a 十六进制浮点数
s 字符串
c 字符
b 布尔值
h 散列码
% 百分号

从键盘输入

使用 Scanner 读取字符串/整数/浮点数

    public static void main(String[] args) {
        Scanner Bu = new Scanner(System.in);
        System.out.println("输入字符串");
        String a = Bu.nextLine();
        System.out.println(a);

        System.out.println("输入整数");
        int b = Bu.nextInt();
        System.out.println(b);

        System.out.println("输入小数");
        double c = Bu.nextDouble();
        System.out.println(c);
    }

如上,此处代码可正常运行,但是如果调换顺序的话如何捏

    public static void main(String[] args) {
        Scanner Bu = new Scanner(System.in);
        System.out.println("输入整数");
        int b = Bu.nextInt();
        System.out.println(b);

        System.out.println("输入字符串");
        String a = Bu.nextLine();
        System.out.println(a);

        System.out.println("输入小数");
        double c = Bu.nextDouble();
        System.out.println(c);
    }

类似这样,我们运行会发现字符串根本没有输入,直接跳过,进行下一步操作
在这里插入图片描述
问题在于,当你在执行 nextInt() 之后,按下 Enter 键时,输入缓冲区中仍然留有一个换行符(\n)。这会导致在接下来读取字符串时,nextLine() 会读取到这个换行符,并且不会等待用户输入,直接跳过了等待输入字符串的步骤。
为了解决这个问题,你可以在读取整数后添加一个额外的 Bu.nextLine() 来消耗掉那个换行符,然后才读取字符串。

修改如下:

    public static void main(String[] args) {
        Scanner Bu = new Scanner(System.in);
        System.out.println("输入整数");
        int b = Bu.nextInt();
        System.out.println(b);

        Bu.nextLine();
        System.out.println("输入字符串");
        String a = Bu.nextLine();
        System.out.println(a);

        System.out.println("输入小数");
        double c = Bu.nextDouble();
        System.out.println(c);
    }

使用 Scanner 循环读取

    public static void main(String[] args) {
        Scanner con = new Scanner(System.in);

        while(con.hasNextInt())
        {
            System.out.println(con.nextInt());
        }
    }

持续地读取输入流中的整数,直到输入流结束或者遇到非整数输入为止

猜数字

    public static void main(String[] args) {
    //生成随机数
        Random rondom = new Random();
     	
        Scanner scanner = new Scanner(System.in);

        int rand = rondom.nextInt(100);
        System.out.println("输入数字");
        while(true) {
            int bear = scanner.nextInt();
            if(bear>rand) {
                System.out.println("大了");
            } else if(bear==rand) {
                System.out.println("对了");
                break;
            } else {
                System.out.println("小了");
            }
        }
    }

方法

方法类似于c语言中的函数

方法定义

修饰符 返回值类型 方法名称(参数类型 形参...){
	方法体代码;
	[return 返回值];
}

注意:
1.修饰符:现阶段直接使用public static固定搭配
2. 返回值类型: 如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
3.方法命名: 采用小驼峰命名
3. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
4. 方法体:方法内部要执行的语句
5. 在java当中,方法必须写在类当中
6. 在java当中,方法不能嵌套定义
7. 在java当中,没有方法声明一说

方法调用的执行过程

调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行

实参和形参的关系(重要)

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意
取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
注意:对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用

方法重载

类似于c++的函数重载
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了

注意:
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关

4. 注意:
方法签名:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

数组

数组的创建

	int[] arr = new int[10];

元素类型[] 数组名 = new 元素类型[长度]

数组的初始化

数组的初始化主要分为动态初始化以及静态初始化。

动态初始化

在创建数组时,直接指定数组中元素的个数

	int[] arr = new int[10];

静态初始化

在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

        int[] arr2 = new int[]{1,2,3};

可以省略后面的new int[]

        int[] arr2 = {1,2,3};

注意:
定义和初始化分成两步


        int[] arr1;
        arr1 = new int[10];
        int[] arr2;
        arr2 = new int[]{1,2,3};

注意:

int[] arr2 = {1,2,3};

省略格式不能分成两步

未对数组初始化,数组元素有默认值
类型 默认值
byte 0
short 0
int 0
long 0
float 0.0f
double 0.0
char /u0000
boolean false
如果数组中存储元素类型为引用类型,默认值为null

数组的使用

元素访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。

        int[] arr = {1,2,3};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //修改
        arr[0] = 100;
        System.out.println(arr[0]);

遍历数组

所谓 “遍历” 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作

注意:在数组中可以通过 数组对象.length 来获取数组的长度
循环遍历

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

使用 for-each 遍历数组

        for (int x:arr) {
            System.out.println(x);
        }

数组是引用类型

        int[] arr1 = {1,2,3};
        int[] arr2 = {100};
        arr2 = arr1;
        for (int x:arr2) {
            System.out.println(x);
        }

在这里插入图片描述
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址,通过该
地址,引用变量便可以去操作对象,这是在arr2=arr1未进行时的状态

在这里插入图片描述
这是arr2=arr1之后的样子,arr2的引用指向了arr1引用指向的对象,而未被引用指向的原来的arr2的那一块空间,就是如图值是100的那一块区域会被自动释放

null

        int[] arr = null;
        System.out.println(arr.length);

在这里插入图片描述
null就是一个不指向任何对象的引用–空引用,类似于c语言的NULL(空指针),但是java并未明确规定null与0号地址有关系,他只是一个不执行任何对象的内存位置,无效的内存位置

注意:
一个引用可以同时指向多个对象?
不能,就好比int a = 0;a=10;a=20;a能存放这三个值吗,显然不可以,同为变量,引用也不可以
指向多个对象
对象能不能指向对象?
哒唛,这也是不可以的,只有引用才能指向对象

数组应用

    public static void main(String[] args) {
        int[] arr = {1,2,3};
        revise1(arr);
        for (int x: arr) {
            System.out.println(x);
        }
        revise2(arr);
        for (int x: arr) {
            System.out.println(x);
        }
    }
    public static void revise1(int[] arr) {
        arr[0] = 100;
    }
    public static void revise2(int[] arr) {
        arr = new int[] {4,5,6};
    }

在这里插入图片描述

调用revise1函数,形参引用指向arr对象,通过引用来找到arr对象,修改arr[0]的值


调用revise2函数,new int[] {4,5,6}创建一个数组,是改变形参引用的指向,所以并不会对原数组造成影响

总结: 所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)

刚才revise2函数未对arr进行修改,大家可以以数组为返回值,接收修改之后的数组

public static void main(String[] args) {
        int[] arr = {1,2,3};
        arr = revise2(arr);
        for (int x: arr) {
            System.out.println(x);
        }
    }
    
    public static int[] revise2(int[] arr) {
        arr = new int[] {4,5,6};
        return arr;
    }

通过接收修改之后的数组,类似于arr2=arr1

数组转字符串

    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        String tem = Arrays.toString(arr);
        System.out.println(tem);
    }

Java 中提供了 java.util.Arrays 包,方便打印数组,先将数组转化为字符串类型,然后打印
在这里插入图片描述

数组拷贝

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};

        int[] arr1 = Arrays.copyOf(arr,arr.length);
        System.out.println(Arrays.toString(arr1));
    }

在这里插入图片描述
copyOf的源码里可以看出,就是把第一个参数是原数组,第二个是长度,用新数组来接收返回值,如果长度大于原数组,int默认初识化为0

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};

        int[] arr1 = Arrays.copyOf(arr,arr.length+1);
        System.out.println(Arrays.toString(arr1));
    }

在这里插入图片描述

        int[] arr = {1,2,3,4,5};
        int[] arr1 = Arrays.copyOfRange(arr,0,arr.length);
        System.out.println(Arrays.toString(arr1));

copyOfRange是赋值某个区间,java表示区间,如上述代码的0,arr.length就是前闭后开,[0,arr.length)

        int[] arr = {1,2,3,4,5};
        int[] arr1 = new int[arr.length];
        System.arraycopy(arr,0,arr1,0,arr.length);
        System.out.println(Arrays.toString(arr1));

在这里插入图片描述`
在这里插入图片描述
arraycopy方法的参数,原数组,原数组的起始位置,目标数组,目标数组的起始位置,长度

二维数组

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组.

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

    public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5,6}};
        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();
        }

在这里插入图片描述

    public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5,6}};
        for (int[] x: arr) {
            for (int y: x) {
                System.out.print(y+" ");
            }
            System.out.println();
        }
    }

在这里插入图片描述

    public static void main(String[] args) {
        int[][] arr = {{1,2,3},{4,5,6}};
        System.out.println(Arrays.deepToString(arr));
    }

在这里插入图片描述
也可以使用Arrays包里的方法来专门打印二维数组

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

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

相关文章

定制TikTok引流脚本必备功能!

在TikTok的海洋中&#xff0c;如何让你的品牌或产品脱颖而出?除了内容创新&#xff0c;一个高效的TikTok引流脚本也是关键&#xff0c;本文将为你揭示定制TikTok引流脚本必备的四大功能&#xff0c;助你在这场流量大战中占得先机。 一、消息多发 在TikTok上&#xff0c;消息…

doris基本操作,05-Rollup

简述 Rollup类似于mysql的视图&#xff0c;区别在于视图并没有将数据独立存储&#xff0c;视图是逻辑上的连接。而Rollup将数据独立存储了&#xff0c;玩的是真的。当查询命中Rollup时&#xff0c;会从Rollup表里获取数据&#xff0c;提高查询效率。 操作 创建Rollup表 alt…

裸机开发(1)-汇编基础

文章目录 GNU汇编语法常用汇编指令处理器内部数据传输指令存储器访问指令压栈和出栈指令跳转指令算术指令逻辑运算指令实战 函数发生调用时&#xff0c;需要进行线程保护&#xff0c;简单来说&#xff0c;就是先进行压栈操作&#xff0c;将调用函数参数、返回值等存到R0-15寄存…

洛谷 CSP-J 2021 分糖果+插入排序 个人解答的优化过程以及详解

首先声明这两道题目第一题很简单&#xff0c;读者可以不看解答自己先做一遍题目&#xff0c;看看能不能获得满分&#xff0c;我就是因为无意识考虑时间复杂度的问题没有获得满分最开始&#xff0c;然后我进行了优化&#xff0c;获得了满分&#xff0c;但是第二题的难度较大&…

内存之-LeakCanary

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用四、原理分析4.1 自动初始化4.1.1 初始化…

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

利用FLRIT恢复符号表---笔记

文章目录 FLIRT应用FLIRT签名创建FLIRT签名文件创建签名概述识别和获取静态库创建模式文件创建签名信息 FLIRT 在某些ELF文件中&#xff0c;IDA无法识别库函数的签名。就会导致IDA加载的函数全是sub_xxxx的形式&#xff0c;这给我们的逆向工程造成极大的困难。 这个时候就可以…

Python爬虫中的多线程、线程池

进程和线程的基本介绍 进程是一个资源单位&#xff0c;线程是一个执行单位&#xff0c;CPU调度线程来执行程序代码。 当运行一个程序时&#xff0c;会给这个程序分配一个内存空间&#xff0c;存放变量等各种信息资源&#xff0c;而这个内存空间可以说是一个进程&#xff0c; 一…

Linux文件系统与命令行

什么是命令行? 接收键盘命令并将其传给操作系统执行的程序(用于输入和管理命令的程序),统称命令行,也叫: Shell&#xff0c;几乎所有Linux发行版都提供了一个 Shell 程序,叫做: Bash (Bourne-Again Shell, 因为最初的 Shell 是由 Steve Bourne 编写的原始 Unix 程序, Again 表…

ChatGPT新增聊天存档功能,可构建自己的聊天数据库啦!

12月21日&#xff0c;OpenAI在社交平台宣布&#xff0c;ChatGPT新增存档功能&#xff0c;用户可以保存聊天记录而不必删除它们。 虽然这只是一个很小的功能&#xff0c;但对于科研、医疗、写作、金融、律师等&#xff0c;对文本使用频率较高的行业帮助巨大&#xff0c;可构建自…

Vue3设计目标和优化

vue3.0的设计目标是什么&#xff1f;做了哪些优化&#xff1f; Vue3的设计目标&#xff1a;更小、更快、更友好、优化方案 一、设计目标 Vue3之前我们会面临的许多问题&#xff1a; 随着功能的增长&#xff0c;复杂组件的代码变得越来越难以维护起来缺少一种比较【干净】的…

YACS(上海计算机学会竞赛平台)一星级题集——评委打分

题目描述 许多比赛在计算选手得分平均数的时候&#xff0c;都会先去掉一个最高得分&#xff0c;再去掉一个最低得分&#xff0c;这样可以避免极大值与极小值对平均值的影响。 给定 n 个数字 a[1]​,a[2]​,⋯,a[n]​&#xff0c;表示一个选手获得的分数&#xff0c;请根据上述…

【力扣】199.二叉树的右视图

看到这个题目的一瞬间&#xff0c;我想递归&#xff0c;必须用递归。最近被递归折磨的有点狠&#xff0c;但是我感觉我快要打败它了&#xff0c;就是现在稍稍有点处于劣势。不过没关系&#xff0c;来日方长不是。 法一&#xff1a;递归 题解&#xff1a; 之前想的就是先递归&…

【Vue3+TypeScript】快速上手_笔记

前言 1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xf…

读文献、写论文时,有什么好用的软件或网站推荐?

高考志愿、考研保研、职业规划、简历优化&#xff0c;欢迎加入《猴哥成长营》&#xff01; https://www.yuque.com/jackpop/ulig5a/srnochggbsa2eltw?singleDoc 读文献、写论文对于绝大多数本科生、研究生、博士生都是必经之路。 当突然面对这样一项任务时&#xff0c;会觉得…

NVIDIA NCCL 源码学习(十二)- double binary tree

上节我们以ring allreduce为例看到了集合通信的过程&#xff0c;但是随着训练任务中使用的gpu个数的扩展&#xff0c;ring allreduce的延迟会线性增长&#xff0c;为了解决这个问题&#xff0c;NCCL引入了tree算法&#xff0c;即double binary tree。 double binary tree 朴素…

单位圆内接三角形的角是外接三角

证明 ∠ A P C 2 ∠ A B C ∠APC2∠ABC ∠APC2∠ABC ∴ ∴ ∴ 三角形内角和为180 $∵ \begin{cases} ∠ABP∠BAP∠APB180 \∠ABC∠BAC∠ACB180 \∠PAC∠PCA∠APC180 \end{cases} $ ∴ A P B P P C r ∴APBPPCr ∴APBPPCr ∵ ∵ ∵△PAB和△PAC为等腰三角形 ∴ ∴ ∴等腰三…

redis—String字符串

目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 前言 字符串类型是Redis最基础的数据类型&#xff0c;关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他几种数据结构也都是在字符串类似基础.上构建的&#xff0c;例如列表…

ROS xacro优化URDF

Xacro是ROS中的一个工具&#xff0c;用于简化URDF文件的编写。它的主要目的是构造更短、更易读的XML文件&#xff0c;同时保持与URDF的兼容性。 以下是Xacro的基本语法和用法&#xff1a; 1、属性设置和算数运算&#xff1a; 可以使用xacro:property来定义常量或变量&#xf…

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别&#xff1a; master &#xff1a; Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支&#xff0c;是因为 git init 命令默认创建它&#xff0c…