Java基础 -- 变量、数组、随机数

本文深入讲解Java基础,涵盖变量类型、数组操作、随机数生成等内容,解析数据存储、参数传递及数组常用方法,适合初学者及进阶者阅读。

一、变量

1. 基本数据类型

Java语言有8种基本数据类型,分别用于存储整数、浮点数、字符数据和布尔类型数据,其存储空间和使用场景如下表所示:
在这里插入图片描述

2. 变量保存的位置

  • 基本类型:栈
  • 引用数据类型:堆保存真实数据,栈保存地址

3. 参数的值传递和引用传递

  • 基本数据类型:按值传递
  • 引用数据类型:传递变量的地址

4. 比较符 “==”

  • 如果针对的是基本类型,只判断值是否相等
  • 如果针对的是引用数据类型,判断的是指向内存地址是否一样

二、数组

1. 数组的定义

声明数组的语法: 数据类型[ ] 数组名 = new 数据类型[大小]
在这里插入图片描述

2. 数组的初始化

基本类型的数组创建后,其元素的初始值:
byte、short、char、int、long为0;
float和double为0.0;
boolean为false

初始化方法一:

**int[ ] arr = { 10, 23, 30, -10, 21 };** // 元素的个数即为数组的长度

初始化方法二:

**int[ ] arr ;
arr = new int[ ] { 10, 23, 30, -10, 96 };**

注意:[ ]中不可以写长度,元素的个数就是数组的长度。

3. 数组的常用方法

3.1 打印数组

int[] numbers = new int[]{1, 3, 2, 5, 4};
System.out.println(Arrays.toString(numbers));

3.2 检查数组是否包含某一个值

String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);
// true

3.3 在数组中二分查找指定元素key

 int[] numbers = new int[]{1, 2, 3, 4, 5, 6};
 System.out.println(Arrays.binarySearch(numbers, 5));
 // 查找的元素在数组中的角标位置

3.4 将数组的一部分拷贝出来(从被拷贝数组头元素开始算)

String[] words = new String[]{"I", "Love", "China", "!"};
String[] subWords = Arrays.copyOf(words, 2);

3.5 将数组的一部分指定范围拷贝出来

3.5.1 方法一
String[] words = new String[]{"I", "Love", "China", "!"};
String[] subWords = Arrays.copyOfRange(words, 1, 3);

温馨提示:Java关于数组等等的操作,都是包含头不包含尾,例如上面的代码,1,3 得到的 subWords = {“Love”, “China”}

3.5.2 方法二
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
/*代码解释:
  Object src : 原数组
   int srcPos : 从元数据的起始位置开始
  Object dest : 目标数组
  int destPos : 目标数组的开始起始位置
  int length  : 要copy的数组的长度*/

3.6 将数组所有元素用指定元素替换

String[] words = new String[]{"I", "Love", "China", "!"};
Arrays.fill(words, "Yes");

3.7 将数组的指定位置元素用指定元素替换

String[] words = new String[]{"I", "Love", "China", "!"};
Arrays.fill(words, 1, 2, "Yes");

3.8 将数组进行内部排序

int[] numbers = new int[]{1, 3, 2, 5, 4};
Arrays.sort(numbers);

注意:要求数组中元素已经按升序排列

三、随机数

1. 方式一:System.currentTimeMillis()

通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:

final long l = System.currentTimeMillis();

//若要获取 int类型的整数,只需要将上面的结果转行成 int类型即可。比如,获取 [0, 100)之间的int整数。方法如下:
final long l = System.currentTimeMillis();
final int i = (int)( l % 100 );

2. 方式二:Math.random()

通过Math.random()来获取随机数。实际上,它返回的是 [ 0, 1 ) 的double值。使用方法如下:

final double d = Math.random();

//若要获取int类型的整数,只需要将上面的结果转行成int类型即可。比如,获取[0, 100)之间的int整数。方法如下:
final double d = Math.random();
final int i = (int)(d*100);

3. 方式三:Random类

通过Random类来获取随机数。使用方法如下:

// (1) 创建Random对象。有两种方法可以创建Random对象,如下:
Random random = new Random(); //默认构造方法
Random random = new Random(1000); //指定种子数字

// (2) 通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。
//比如,获取[0, 100)之间的int整数。方法如下:
int i2 = random.nextInt(100);

附:Random 的函数接口

// 构造函数(一): 创建一个新的随机数生成器。 
Random() 
// 构造函数(二): 使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
Random(long seed) 

boolean nextBoolean()         // 返回下一个“boolean类型”伪随机数。 
void    nextBytes(byte[] buf) // 生成随机字节并将其置于字节数组buf中。 
double  nextDouble()          // 返回一个“[0.0, 1.0) 之间的double类型”的随机数。 
float   nextFloat()           // 返回一个“[0.0, 1.0) 之间的float类型”的随机数。 
int     nextInt()             // 返回下一个“int类型”随机数。 
int     nextInt(int n)        // 返回一个“[0, n) 之间的int类型”的随机数。 
long    nextLong()            // 返回下一个“long类型”随机数。 
synchronized double nextGaussian()   // 返回下一个“double类型”的随机数,它是呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。 
synchronized void setSeed(long seed) // 使用单个 long 种子设置此随机数生成器的种子。
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
以下是一些关于 Java 二维数组的练习题: 1. **动态二维数组的赋值遍历**:创建一个 9 行 5 列的二维数组 `arr1`,并对其进行初始化赋值,每个元素的值为其行索引列索引之,最后输出数组元素。 ```java int[][] arr1 = new int[9][5]; // 初始化赋值 for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr1[i].length; j++) { arr1[i][j] = i + j; } } // 输出元素 for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr1[i].length; j++) { System.out.print(arr1[i][j] + " "); } System.out.println(); } ``` 2. **计算班级总成绩**:已知有 3 个班级各 5 名学员,使用二维数组计算各个班级的总成绩。 ```java import java.util.Scanner; public class Lianxi2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("多少班级:"); int q = sc.nextInt(); int d = sc.nextInt(); double z = 0; double f[][] = new double[q][d]; for(int i = 0;i<f.length;i++ ) { System.out.println("******第"+(i+1)+"个班******"); for(int j = 0;j<f[i].length;j++ ) { System.out.print("请输入第"+(j+1)+"个学生的成绩:"); f[i][j] = sc.nextDouble(); z = z+f[i][j] ; } } System.out.println("********成绩统计********"); int total; // 保存总成绩 for(int i = 0; i < f.length; i++) { String str = (i+1) + "班"; total = 0; // 每次循环到此都将其归 0 for(int j = 0; j < f[i].length; j++) { total += f[i][j]; // 成绩叠加 } System.out.println(str+"总成绩:" + total); } } } ``` 3. **二维数组元素交换与遍历**:有一个 `int` 类型的 5*5 的二维数组 `arr`,先输出该数组,然后将 `arr[0]` `arr[3]` 交换位置,再遍历这个二维数组。 ```java int [][]arr={{10,12,33,4,7},{12,4,21,55,88},{12,63,223,656,45},{234,232,57,9,7},{166,53,876,324,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(" "); } System.out.println(" 交换 arr[0] arr[3]"); int num[]=new int[5]; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ num[i]=arr[0][i]; arr[0][i]=arr[3][i]; arr[3][i]=num[i]; System.out.print(arr[i][j]+" "); } System.out.println(" "); } ``` 4. **公司年销售额求**:某公司按照季度月份统计的数据如下(单位:万元):第一季度:22, 66, 44;第二季度:77, 33, 88;第三季度:25, 45, 65;第四季度:11, 66, 99。使用二维数组计算该公司一年的销售额。 ```java class Array2Test2 { public static void main(String[] args) { // 把题目的数据用二维数组来表示 int[][] arr = {{22, 66, 44}, {77, 33, 88}, {25, 45, 65}, {11, 66, 99}}; // 定义一个求变量 sum,初始化值是 0 int sum = 0; // 通过遍历就可以得到每一个二维数组的元素 for(int x = 0; x < arr.length; x++) { for(int y = 0; y < arr[x].length; y++) { // 把元素累加即可 sum += arr[x][y]; } } // 最后输出 sum,就是结果 System.out.println("一年的销售额为:" + sum + "万元"); } } ``` 5. **不规则二维数组的创建、赋值与遍历**:创建一个不规则二维数组,第一行 5 个元素,第二行 4 个元素,第三行 3 个元素,第四行 2 个元素,第五行 1 个元素,使用随机数(范围 0 - 9)对其赋值,并输出数组元素。 ```java import java.util.Random; public class lianxi { public static void main(String[] args) { Random rand = new Random(); int[][] a = new int[5][]; a[0] = new int[5]; a[1] = new int[4]; a[2] = new int[3]; a[3] = new int[2]; a[4] = new int[1]; for(int i = 0; i < 5; i++) { for(int j = 0; j < a[i].length; j++) { a[i][j] = rand.nextInt(10); } } for(int i = 0; i < 5; i++) { for(int j = 0; j < a[i].length; j++) { System.out.print(" " + a[i][j]); } System.out.println(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值