Java基础随手记

news2024/11/14 22:56:28

数组

数组的使用

数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型。即:数组就是一组数据
在这里插入图片描述
问题引入
在这里插入图片描述
传统的解决方式
在这里插入图片描述
使用数组来解决
在这里插入图片描述
可以看到,我们创建了一个double类型元素的数组,将我们要计算的数据都保存在了这个数组中,然后通过for循环来遍历每一个值,每次循环体都让保存总和的变量加等于目前遍历的值。
在这里插入图片描述
数组是通过数组引用变量+[下标]来访问元素值的,数组元素值是从0开始的,我们通过将循环变量传入[]中作为下标来循环遍历数组中的每一个元素,达到取值运算。
数组的定义
数组分两类定义:静态初始化和动态初始化
动态初始化数组数组定义格式:

数据类型 数组名[] = new 数据类型[大小]

动态初始化由程序员指定内存大小,程序为这些元素赋值,赋值是各个类型的默认值,比如整数就是0,引用类型是null,浮点型是0.0等等。
静态初始化数组数组定义格式:

数组类型 数组名[] = {元素元素};

静态初始化是程序员指定元素列表,程序为数组定义元素列表所需要的数组大小。
数组练习
练习1
在这里插入图片描述
在这里插入图片描述
练习2
在这里插入图片描述
在这里插入图片描述
该练习的思路就是,在循环外层设置出数组的第一个元素以及索引,然后通过for循环来挨个和从下标1(第二个元素)开始的数组元素进行比较,如果循环外层的值小于当前比较的元素值,就将当前元素值赋值给外层的值,然后依次比较,索引则通过循环变量i来获取。

数组赋值的机制

基本类型的赋值机制
在这里插入图片描述
数组引用类型的赋值机制
在这里插入图片描述
可以看到,按照地址传递的机制,数组1将地址赋值给数组2后,数组2修改了数组2的值,但是会发现数组1的值也发生了改变,这就是地址赋值,指的是内存地址的赋值,两个引用变量同时指向了数组1所指向的堆内存的数据,数组2修改数据时,修改的就是这个堆内存汇总的数据,所致导致不论是数组1修改还是数组2修改,都会发生变化。
基本数据类型值传递机制
在这里插入图片描述
数组引用类型内存地址传递
在这里插入图片描述
在这里插入图片描述
总结
基本数据类型和引用数据类型的变量都存放在栈内存中,但是基本数据类型并不会开辟堆内存空间,所以它们的值也只是在栈内存中,当进行赋值和值传递时,都是直接替换和复制值;而引用数据类型在栈内存中保存的都只是内存地址,该内存地址真正代表的数据在堆内存中,所以如果是引用类型进行值传递,那么一定是内存地址的传递,所以相当于它们进行值传递后,就共享了同一个内存地址的数据(堆内存中的数据)。

一维数组的一些基础操作

数组拷贝
根据上面的学习,我们可以看到,如果只是单纯的arr1=arr2,这样它们的本质并没有生成新的数组,而只是一个内存区有了两个引用,如果我们想真正的生成一个新数组,则应该是实现数组拷贝(内容复制ArrayCopy)。
在这里插入图片描述
数组反转
在这里插入图片描述
在这里插入图片描述
如果觉得上面的复杂也是可以反向遍历数组然后再创建新数组,int i=arr.length-1;i>=0;i–;
数组扩容
在这里插入图片描述
直接进行下标扩容是会报错的。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
动态扩容数组

Scanner myScanner = new Scanner(System.in);
//定义数组
int arr[] = {1,2,3};
do{
    int arrNew[] = new int[arr.length+1];
    for(int i=0;i<arr.length;i++){
       arrNew[i] = arr[i];
    }
    System.out.println("请输入你要添加的元素");
    //把4赋给arrNew最后一个元素
    arrNew[arrNew.length-1] = myScanner.nextInt();
    arr = arrNew;//经过引用重定向,原本堆内存的数据会被回收
    for(int i:arr){
        System.out.print(i+"\t");
    }
    //问用户是否继续
    System.out.println("是否继续添加 y/n");
    char key = myScanner.next().charAt(0);
    if(key == 'n'){//如果输入N就结束了
        break;//结束循环
    }
}while(true);
System.out.println("已退出...");

数组的基本排序

冒泡排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class Array{
    public static void main(String[] args) {
        int arr[] = {24,69,80,57,13};
        for(int i = 0;i<arr.length-1;i++){//外层循环次数
            int temp=0;//临时变量
            for(int j=0;j<arr.length-1-i;j++){
                //如果前面的数>后面的数,就交换
                if(arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            System.out.println("==第"+(i+1)+"轮排序==");
            for(int j=0;j<arr.length;j++){
                System.out.print(arr[j]+"\t");
            }
            System.out.println();
        }
    }
}
/*冒泡排序思路总结
首先里层的遍历是判断当前元素是否大于后一个元素值
因为每次比较都向前走,所以循环次数也是要每次减少的
外层循环则等于一共要循环的次数
*/

在这里插入图片描述

查找

顺序查找

import java.util.Scanner;

public class Array01 {
    public static void main(String[] args) {
        /*
        有一个数列:凯迪拉克、奥迪、宝马、奔驰、长安
        从键盘中任意输入一个名称,判断数列中是否包含次名称【循环查找】
        要求:如果找到了,就提示找到,并给出下标值

        思路分析:
        1.定义一个字符串数组
        2.接收用户输入,遍历数组,逐一比较,如果有,则提示信息,并退出
         */
        String strArr[] = {"长安15","凯迪拉克25","奥迪35","宝马45","奔驰55"};
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入品牌");
        String findName = sc.next();
        //遍历数组,逐一比较,如果有,则提示信息,并退出
        int index = -1;
        for(int i=0;i<strArr.length;i++){
            //比较 字符串比较 equals,如果要找的品牌,就是当前元素
            if(findName.equals(strArr[i])){
                System.out.println("已找到");
                System.out.println("恭喜你称为尊贵的 "+strArr[i]+" 车主");
                System.out.println("耗时: "+i+" 年");
                //把i保存到index
                index = i;
                break;//退出
            }
        }
        if(index==-1){
            System.out.println("对不起没有成为任何品牌的车主,继续努力!");
        }
    }
}

在这里插入图片描述

二维数组入门

输入二维棋盘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二维数组的使用
在这里插入图片描述

//一共有三个一维数组,每个一维数组的元素是不一样的
int arr[][] = new int[3][];
for(int i=0;i<arr.length;i++){//遍历arr每个一维数组
    //给每个一维数组开空间 new
    arr[i] = new int[i+1];
    //遍历一维数组,并给一维数组的每个元素赋值
    for(int j=0;j<arr[i].length;j++){
        arr[i][j] = i+1;
    }
}
//遍历arr输出
for(int i=0;i<arr.length;i++){
    for(int j = 0;j<arr[i].length;j++){
        System.out.print(arr[i][j]+"\t");
    }
    System.out.println();
}

面向对象OOP

类与对象的引出

问题
在这里插入图片描述

在这里插入图片描述

封装

private修饰的成员属性是不能直接通过对象实例访问的,如果要访问则需要定义setter和getter方法。

多态

多态引入
在这里插入图片描述
方法多态
在这里插入图片描述
对象的多态
在这里插入图片描述
父类 父类引用 = new 子类();
编译类型是父类,但是运行类型是子类。
在这里插入图片描述
结合上面的类多态,我们可以解决前面案例的问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单例模式

在这里插入图片描述
饿汉式
在这里插入图片描述

class Cat{
	//直接就在类的内部创建了
	//即使没有使用,cat对象也被加载了
    private String name;
    //添加static的原因是,如果不是静态方法获取,那么别的类是需要创建对象才能调用该方法的
    private static Cat cat = new Cat("?");
    //保障只有一个GirlFriend对象[饿汉式单例]
    //1.私有化构造器
    //2.在类的内部直接创建
    //3.提供一个公共的静态方法,返回gf对象
    private Cat(String name) {
        this.name = name;
    }
    public static Cat getInstance(){
        return cat;
    }
}

在这里插入图片描述

懒汉式
懒汉式和饿汉式的区别就是延迟加载的区别。

//程序运行过程中,只能创建一个Cat对象
class Cat{
    private String name;
    private static Cat cat;//这样尽管是外围调用类属性,也不会调用Cat构造器创建对象
    //步骤
    //1.创建私有化构造器
    //2.定义一个static静态对象
    //3.提供一个公共的static方法,可以返回一个Cat对象
    private Cat(String name){
        this.name=name;
    }
    public static Cat getInstance(){
        if(cat == null){
            cat = new Cat("斯芬克斯");
        }
    }
}

多次调用单例方法也并不会二次调用构造器。
在这里插入图片描述

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

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

相关文章

buuctf-misc-[GKCTF 2021]你知道apng吗1

先下载附件&#xff0c;快要过年了&#xff0c;十二月份还没发过文章&#xff0c;紧急写一篇。 下载文件后缀名为apng 搜索一下APNG&#xff08;基于PNG的位图动画格式&#xff09;_百度百科 利用火狐浏览器可以打开 类似gif图片的格式&#xff0c;用专门工具进行拆解&#xf…

MySQL内部的核心组件

mysql前言 1.MySQL的驱动 2.数据库的连接池 3.MySQL的工作线程 4.SQL接口 5.SQL解析器 6.查询优化器 7.执行器组件 8.存储引擎接口 1.MySQL的驱动是做什么的&#xff1f; 尤其记得刚刚学习MySQL的时候&#xff0c;引入的pom坐标&#xff1a;mysql-connector-java&#xff0c;这…

软考- 计算机组成原理与体系结构

【考点梳理】 考点1、数据的表示&#xff08;★★★★&#xff09; 考点1.1、进制的转换 【考法分析】 本考点的基本考法是与内存地址计算、IP地址计算结合考查。 【要点分析】 1、十进制转R进制&#xff08;短除法&#xff09;&#xff1b; 2、R进制转十进制&#xff0…

Arduino与Proteus仿真实例-WS2812实现音乐氛围灯仿真

WS2812实现音乐氛围灯仿真 本文将使用WS2812实现一个音乐氛围灯。Arduino通过检测音频信号强度,然后转换成W2812灯带驱动信号,从而实现音乐氛围灯。 WS2812的驱动和使用在前面的文章中作了详细的介绍,请参考: Arduino与Proteus仿真实例-WS2812-RGB-LED灯带酷炫效果仿真Ar…

【软件质量】软件质量分析总结报告

软件质量-----“软件与明确地和隐含地定义的需求相一致的程度” 一、质量的概念 Ⅰ、传统的质量概念:产品性能是否符合技术规范 Ⅱ、质量是一组固有特性满足要求的程度 Ⅲ、适用性质量 Ⅳ、质量不仅指产品质量&#xff0c;也指过程和体系的质量 二、软件质量 Ⅰ、产品质…

教你如何用一行Python代码实现GUI图形界面

文章目录一、选择文件夹二、选择文件三、选择日期四、输入文本五、弹窗无按钮六、弹窗无标题七、弹窗只有OK按钮八、弹窗只有Error按钮(红色)九、显示通知窗口十、弹窗选择十一、自定义弹窗实战一、选择文件夹 首先导入PySimpleGUI库&#xff0c;并且用缩写sg来表示。 import…

Kubernetes 笔记(02)— 基本架构、工作机制简述、Master 组件、Node 组件

1. Kubernetes 的基本架构 Kubernetes 采用了现今流行的“控制面 / 数据面”&#xff08;Control Plane / Data Plane&#xff09;架构&#xff0c;集群里的计算机被称为“节点”&#xff08;Node&#xff09;&#xff0c;可以是实机也可以是虚机&#xff0c;少量的节点用作控制…

【CUDA入门笔记】GPU存储结构模型(2)

GPU存储结构模型 1.CPU可以读写GPU设备中的Global Memory、Constant Memory以及Texture Memory内存储的内容&#xff1b;主机代码可以把数据传输到设备上&#xff0c;也可以从设备中读取数据&#xff1b; 2.GPU中的线程使用Register、Shared Memory、Local Memory、Global Me…

python网络程序设计,TCP协议客户端服务端智能聊天设计

计算机网络基础知识 网络体系结构&#xff0c;分层设计的好处 网络协议三要素&#xff1a;语法、语义、时序 常见应用层协议&#xff1a;ftp、http、smtp、pop3、telnet…… 传输层主要概念&#xff1a;TCP、UDP、端口号 IP地址 MAC地址 计算机网络基础知识 IP地址 1.IP地址 …

内核RCU的一次实践——实战中加深了理解

遍历内核链表是个常规操作&#xff0c;遍历链表过程可能会向链表增加新成员或者从链表剔除老成员&#xff0c;因此遍历链表时一般需要spin lock加锁保护。如果向链表增加新成员或者从链表剔除老成员不经常出现&#xff0c;大部分只是遍历查询链表中成员&#xff0c;此时链表遍…

Spring Cloud:eureka注册中心

在传统的单体应用中&#xff0c;所有的业务都集中在一个服务器中&#xff0c;当浏览器发起请求时&#xff0c;通过前端请求调用后端接口&#xff0c;后端接口调用相应的业务并在前端进行响应&#xff0c;整个的调用就是从请求到响应的一条龙服务。所以不存在服务之间的中转&…

jetson nano GPIO引脚控制舵机

文章目录一.舵机介绍二.舵机工作原理180度舵机360度舵机三.利用jetson nano GPIO控制舵机1.jetson nano与舵机接2.c编写程序输出脉冲(Qt做界面)一.舵机介绍 舵机&#xff0c;是指在自动驾驶仪中操纵飞机舵面&#xff08;操纵面&#xff09;转动的一种执行部件。分有&#xff1a…

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素

代码随想录算法训练营第十三天&#xff08;栈与队列&#xff09;| 239. 滑动窗口最大值&#xff0c;347.前 K 个高频元素 239. 滑动窗口最大值 之前讲的都是栈的应用&#xff0c;这次该是队列的应用了。 本题算比较有难度的&#xff0c;需要自己去构造单调队列&#xff0c;建…

std::map使用方式以及注意事项(关于相同key的问题)

std::map的使用在C开发中也是经常会用到的一些东西&#xff0c;这里进行一些简单的使用记录&#xff0c;包括如何插入、删除以及修改等。 1、std::map插入&#xff1a; map的插入使用的是insert的方式&#xff0c;一个map包含了key与value两个值。首先需要对两个值进行赋值&a…

Spring Security认证授权练手小项目 腾讯视频VIP权限管理功能

腾讯视频VIP权限管理1、项目功能视频演示2、需求与设计1、需求2、功能概要3、接口设计3、项目源码结构4、项目源码下载5、项目部署1、部署架构2、数据库环境准备3、redis环境准备4、Spring Boot服务准备5、nginx负载均衡准备6、nginx静态资源服务器准备6、项目介绍1、技术架构2…

人工智能-集成学习

1、 集成学习算法介绍 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。工作原理&#xff1a;生成多个分类器/模型&#xff0c;各自独立地学习和做出预测。这些预测再结合成组合预测&#xff0c;因此由于任何一个单分类的预测。 1.2 机器学习的两个核心任…

优化RPC网络通信

文章目录什么是RPC通信RPCRPC框架SOARPC通信得重要性具体优化措施1.扩展其他RPC框架.2.选择合适的通信协议3.使用单一长连接4.优化Socket通信.5.高性能的序列化协议6.量身定做报文格式什么是RPC通信 RPC RPC&#xff08;Remote Process Call&#xff09;&#xff0c;即远程服…

算法训练 —— 链表(2)

目录 1. LeetCode24. 两两交换链表中的结点 2. LeetCode19. 删除链表的倒数第N个节点 3. LeetCode160.相交链表 4. LeetCode141.环形链表 5. LeetCode142.环形链表II 6. LeetCode138.复制带随机指针的链表 1. LeetCode24. 两两交换链表中的结点 两两交换链表中的结点 …

机器学习时间序列特征处理与构造,这篇我建议你收藏

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 那特征工程是什么&#xff1f; 特征工程是利用数据领域的相关…

vue3 antd项目实战——Form表单使用【v-model双向绑定数据,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框&#xff08;Radio&#xff09;的使用以及Form表单的双向绑定知识调用&#xff08;form表单的源代码附在文章最后&#xff09;场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…