Java_从入门到JavaEE_07

一、数组的排序(冒泡排序)

  1. 原理:

    从下标“0”开始,相邻两个元素依次进行比较,每次找出最大的往后移动。

  2. 规律:N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i。

  3. 案例:对一组数组进行排队

    public class Test{
        public static void main(String[] args){
            int[] arr={5,6,2,7,8,3,1,9};
            
            for(int i=0;i<arr.length-1;i++){
                for(int j=0;j<arr.length-1-i;j++){
                    if(arr[j]>arr[j+1]){
                        int temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
            }
            for(int element:arr){
                System.out.println(element);
            }
        }
    }
    

    ps:排序只需要了解熟悉就行,因为在平常的Java开发中有专门的的工具类Arrays,所以排序一般只有在面试的时候可能会用到。

二、数组的查找

1.线性查找

  1. 线性查找就是用for循环进行遍历。

  2. 案例:

    import java.util.Scanner;
    public class Test{
        public static void main(String[] args){
             int[] arr={5,6,2,7,8,3,1,9};
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入需要查询的元素:");
            int num=scan.nextInt();
            
            for(int i=0;i<arr.length;i++){
                if(num==arr[i]){
                    System.out.println("你查询的元素的下标为:"+i);
                }
            }
        }
    }
    

    缺点:由于它是从首位开始依次进行查找的所以当数组中的元素过多是会影响查询的速度。

2.二分法/二叉查找

  1. 二分法是先将数组进行排序,然后确定三个下标:首位(start),最后一位(end),中间一位((start+end)/2=mid)ps:如果计算出现小数会自动省略,当中间位元素大于需查询的元素:end=mid-1,反之start=mid+1。

  2. 案例:

    import java.util.Arrays;
    import java.util.Scanner;
    public class Test{
        public static void main(String[] args){
            int[] arr={5,6,2,7,8,3,1,9};
            Arrays.sort(arr);//排序
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入需要查询的元素:");
            int num=scan.nextInt();
            
            int start=0;
            int end=arr.length-1;
            while(start<=end){
                int mid =(start+end)/2;
                if(num<	arr[mid]){
                    end=mid-1;
                }else if(num>arr[mid]){
                    start=mid+1;
                }else{
                    System.out.println("你查询的元素的下标为:"+mid);
                    break;
                }
            }
        }
    }
    

三、数组扩展

1.数组的复制

  1. 浅表赋值

  2. 案例:

    public class Test04{
    	public static void main(String[] args){
    		
    		//原数组
    		String[] arr = {"张三","李四","王五"};
    		
    		//新数组
    		String[] newArr = arr;
    		
    		//修改原数组
    		arr[1] = "赵六";
    		
    		//遍历新数组
    		for(String element : newArr){
    			System.out.println(element);
    		}
    		
    	}
    }
    

    缺点:修改原数组,新数组中的数据也会发生改变

    原理:在这里插入图片描述

  3. 深表赋值

  4. 案例:

    public class Test05{
    	public static void main(String[] args){
    		
    		//原数组
    		String[] arr = {"张三","李四","王五"};
    		
    		//新数组
    		String[] newArr = new String[arr.length];
    		
    		//将原数组下标的元素赋值给新数组
    		for(int i = 0;i<arr.length;i++){
    			newArr[i] = arr[i];
    		}
    		
    		//修改原数组
    		arr[1] = "赵六";
    		
    		//遍历新数组
    		for(String element : newArr){
    			System.out.println(element);
    		}
    		
    	}
    }
    

    原理:

    在这里插入图片描述

2.数组的扩容

  1. 案例:

    public class Test06{
    	public static void main(String[] args){
    
    		//原数组
    		String[] arr = {"张三","李四","王五"};
    		
    		//计算新容量
    		int oldCapacity = arr.length;//3
    		int newCapacity = oldCapacity + (oldCapacity>>1);//4
    		
    		//新数组
    		String[] newArr = new String[newCapacity];
    		
    		//将原数组下标的元素赋值给新数组
    		for(int i = 0;i<arr.length;i++){
    			newArr[i] = arr[i];
    		}
    		
    		//将新数组的地址赋值给原数组
    		arr = newArr;
    		
    		//遍历原数组
    		for(String element : arr){
    			System.out.println(element);
    		}
    		
    	}
    }
    

3.数组的删除

  1. 方法一案例:

    public class Test{
    	public static void main(String[] args){
    		//原数组
    		String[] arr = {"张三","李四","王五","赵六"};
    		//新数组
    		String[] newArr = new String[arr.length-1];//3 - [null,null,null]
    		
    		int index = 0;
    		for(String element : arr){
    			if(!element.equals("李四")){
    				newArr[index++] = element;
    			}
    		}
    		
    		//将新数组的地址赋值给原数组
    		arr = newArr;
    		
    		//遍历原数组
    		for(String element : arr){
    			System.out.println(element);
    		}
    		
    	}
    }
    

    缺点:数组作为容器,是存储数据的,这样的删除会让容器越变越小

  2. 方法二

    public class Test{
    	public static void main(String[] args){
    		
    		//原数组
    		String[] arr = {"张三","李四","王五","赵六"};
    		
    		//将删除元素后一位的数据全部都往前移 
    		for(int i = 1;i<arr.length-1;i++){
    			arr[i] = arr[i+1];
    		}
    		
    		//将最后一位数据赋值为null
    		arr[arr.length-1] = null;
    		
    		//遍历原数组
    		for(String element : arr){
    			System.out.println(element);
    		}
    		
    	}
    }
    

4.数组作为方法的参数和返回值

案例:设计一个方法,传入int类型的数组,返回最大值和最小值

public class Test{
	public static void main(String[] args){
		
		int[] arr = {5,78,55,26,23,51,32};
		
		int[] newArr = getMaxAndMin(arr);
		System.out.println("最大值为:" + newArr[0]);
		System.out.println("最小值为:" + newArr[1]);
	}
	
	public static int[] getMaxAndMin(int[] arr){
		
		int max = arr[0];
		int min = arr[0];
		
		for(int i = 1;i<arr.length;i++){
			if(max < arr[i]){
				max = arr[i];
			}
			if(min > arr[i]){
				min = arr[i];
			}
		}
		
		int[] maxAndMin = {max,min};
		return maxAndMin;
	}
	
}

5.可变参数

案例:设计一个方法,传入n个int类型的值,返回最大值

public class Test{
	public static void main(String[] args){
		
		int max = getMax(1,2,3,4,5,6,7);//将实参作为数组的元素传入
		System.out.println(max);
	}
	
	//int... arr -- 可变参数,实际上就是数组
	public static int getMax(int... arr){
		if(arr.length == 0){//意味着实参没有传任何数据
			return -1;
		}
		int max = arr[0];
		for(int i = 1;i<arr.length;i++){
			if(max < arr[i]){
				max = arr[i];
			}
		}
		return max;
	}
}

注意:可变参数后不能接其他参数

四、Arrays工具类

  1. 理解:Arrays是Java给我们提供的专门用于操作数组的工具类

  2. 概念:

    1. 工具类 – 该类中的方法都是静态的,直接使用类名调用
    2. API ----- Java提供类的说明书
  3. 案例:

    import java.util.Arrays;
    public class Test{
    	public static void main(String[] args){
    			
    		int[] arr = {5,72,9,4,21,1,6,3,81};	
    		
    		//排序 - 1,3,4,5,6,9,21,72,81
    		Arrays.sort(arr);
    		
    		//查找
    		//返回值规则:搜索键的索引,如果它包含在数组中; 否则, (-(insertion point) - 1) 
    		//返回值规则:如果元素包含在数组中,返回下标;否则,(-(插入点) - 1) 
    		int index = Arrays.binarySearch(arr,30);
    		System.out.println("查找到元素的下标为:" + index);
    		
    		//拷贝数组 
    		int[] newArr1 = Arrays.copyOf(arr,15);
    		
    		//拷贝数组区间 
    		int[] newArr2 = Arrays.copyOfRange(newArr1,2,11);//(目标数组,开始下标-包含,结束下标-排他)
    		
    		//替换所有元素
    		Arrays.fill(newArr2,888);
    		
    		//替换区间元素
    		Arrays.fill(newArr2,2,4,666);//(目标数组,开始下标-包含,结束下标-排他,替换元素)
    	
    		//将数组转换为字符串
    		String str = Arrays.toString(newArr2);
    		System.out.println(str);
    	}
    }
    

五、二维数组

  1. 理解:二维数组包含了多个一维数组

  2. 数组的声明:

    1. 数据类型[][] 数组名;00
    2. 数据类型 数组名[][];
  3. 静态初始化

    案例:

public class Test{
	public static void main(String[] args){
		
		//静态初始化1
		//String[][] names = new String[][]{{"小明","小红","小绿"},{"张三","李四","王五","赵六"}};
		
		//静态初始化2
		//String[][] names;
		//names = new String[][]{{"小明","小红","小绿"},{"张三","李四","王五","赵六"}};
		
		//静态初始化3
		String[][] names = {{"小明","小红","小绿"},{"张三","李四","王五","赵六"}};
		
		//设置指定下标上的元素
		names[0][1] = "星星";
		
		//获取指定下标上的元素
		String str = names[0][1];
		System.out.println("获取指定下标上的元素:" + str);
		
		//获取长度
		System.out.println("获取二维数组中一维数组的长度:" + names.length);//2
		System.out.println("获取二维数组中第一个一维数组元素的长度:" + names[0].length);//3
		System.out.println("获取二维数组中第二个一维数组元素的长度:" + names[1].length);//4
		
		System.out.println("------------------------------------");
		
		//遍历思路:循环遍历出一维数组,再循环遍历一维数组的元素
		
		//遍历数组 -- for循环
		for(int i = 0;i<names.length;i++){
			for(int j = 0;j<names[i].length;j++){
				System.out.println(names[i][j]);
			}
		}
		
		System.out.println("------------------------------------");
		
		for(String[] ss:names){
			for(String element:ss){
				System.out.println(element);
			}
		}
	
	}
}
  1. 案例1:动态初始化

    public class Test{
    public static void main(String[] args){
    		
    		//动态初始化1
    		//String[][] names = new String[2][3];//2表示2个一维数组,3表示每个一维数组有3个元素
    		
    		//动态初始化2
    		String[][] names;
    		names = new String[2][3];//2表示2个一维数组,3表示每个一维数组有3个元素
    		
    		//设置指定下标上的元素
    		names[0][1] = "小红";
    		
    		//获取指定下标上的元素
    		String str = names[0][1];
    		System.out.println("获取指定下标上的元素:" + str);
    		
    		//获取长度
    		System.out.println("获取二维数组中一维数组的长度:" + names.length);//2
    		System.out.println("获取二维数组中第一个一维数组元素的长度:" + names[0].length);//3
    		System.out.println("获取二维数组中第二个一维数组元素的长度:" + names[1].length);//4		
    		//遍历思路:循环遍历出一维数组,再循环遍历一维数组的元素
    		//遍历数组 -- for循环
    		for(int i = 0;i<names.length;i++){
    			for(int j = 0;j<names[i].length;j++){
    				System.out.println(names[i][j]);
    			}
    		}
    		for(String[] ss:names){
    			for(String element:ss){
    				System.out.println(element);
    			}
    		}
    	
    	}
    }
    
  2. 案例2:使用动态初始化声明二维数组,二维数组中有两个一维数组,第一个一维数组有3个元素 ,第二个一维数组有4个元素

    public class Test{
    	public static void main(String[] args){
    		
    		String[][] names = new String[2][];
    		
    		String[] s1 = {"aaa","bbb","ccc"};
    		String[] s2 = {"ddd","eee","fff"};
    		
    		names[0] = s1;
    		names[1] = s2;
    		
    		for(String[] ss:names){
    			for(String element:ss){
    				System.out.println(element);
    			}
    		}
    	}
    }
    

动态初始化声明二维数组,二维数组中有两个一维数组,第一个一维数组有3个元素 ,第二个一维数组有4个元素

public class Test{
	public static void main(String[] args){
		
		String[][] names = new String[2][];
		
		String[] s1 = {"aaa","bbb","ccc"};
		String[] s2 = {"ddd","eee","fff"};
		
		names[0] = s1;
		names[1] = s2;
		
		for(String[] ss:names){
			for(String element:ss){
				System.out.println(element);
			}
		}
	}
}

底层原理:在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时&#xff0c;报如上图所示错误&#xff0c;其中一条是&#xff1a; ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

MongoDB详解

目录 一、MongoDB概述 1.MongoDB定义 2.MongoDB主要特点 2.1文档 2.2集合 2.3数据库 2.4数据模型 二、安装MongoDB 1.Windows安装MongoDB 1.1下载MongoDB 1.2安装MongoDB 1.3配置MongoDB 1.3.1可能遇到的问题 1.4安装一盒可视化工具 2.Linux安装MongoDB 2.1下载…

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言&#xff0c;鸿蒙内核有6个汇编文件&#xff0c;读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…

WPF之XmlDataProvider使用

1&#xff0c;WPF XAML支持数据提供&#xff08;DataProvider&#xff09;&#xff0c;但其提供的数据只供查看不可进行修改&#xff0c;删除&#xff0c;添加等。 数据提供者都继承自System.Windows.DataSourceProvider类&#xff0c;目前&#xff0c;WPF只提供两个数据提供者…

Stream流操作

看到Stream流这个概念&#xff0c;我们很容易将其于IO流联系在一起&#xff0c;事实上&#xff0c;两者并没有什么关系&#xff0c;IO流是用于处理数据传输的&#xff0c;而Stream流则是用于操作集合的。 当然&#xff0c;为了方便我们区分&#xff0c;我们依旧在这里复习一下…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏&#xff1a;【机器学习&#xff1a;项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学习模型、处理非…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月5日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月5日 星期日 农历三月廿七 立夏 1、 近日国际金价大幅震荡&#xff0c;跌至近一个月新低。 2、 2024亚洲少年攀岩锦标赛&#xff1a;中国选手包揽U14和U12速度赛男女组前三名。 3、 马来西亚将进一步优化中国游客入境程…

【详细教程】手把手教你开通YouTube官方API接口(youtube data api v3)

文章目录 一、背景调查1.1 youtube介绍1.2 分析价值与意义1.3 API接口介绍 二、申请接口权限2.1、注册Google账号2.2、创建项目2.3、启用youtube data api v3服务2.4、创建凭据 三、后续发布 一、背景调查 1.1 youtube介绍 众所周知&#xff0c;youtube是目前全球最大的视频社…

MyCat安装配置,及数据分片

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

Python深度学习基于Tensorflow(1)Numpy基础

numpy的重要性不言而喻&#xff0c;一般不涉及到GPU/TPU计算&#xff0c;都是用numpy&#xff0c;常见的np就是这个玩意。其特点就是快&#xff01;其实如果不涉及到深度学习&#xff0c;还有一个库是很重要的&#xff0c;scipy&#xff0c;集成了很多的东西。 安装和导入如下…

002-ChatGLM4接入Langchain

智谱AI GLM-4 新一代基座大模型GLM-4,整体性能相比GLM3全面提升60%,逼近GPT-4;支持更长上下文;更强的多模态;支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体能力。 基础能力(英文):GLM-4 在 MMLU、GSM8K、MATH、BBH、HellaSwag、HumanEval等…

[云原生]Docker-compose:一站式多容器应用部署神器

目录 引言 一、Docker Compose 简介 &#xff08;一&#xff09;基本信息 &#xff08;二&#xff09;核心特性 &#xff08;三&#xff09;文件格式 二、Docker Compose 环境安装 &#xff08;一&#xff09;准备安装包 &#xff08;二&#xff09;添加执行权限 三、…

[Meachines][Hard]Napper

Main $ nmap -p- -sC -sV 10.10.11.240 --min-rate 1000 $ curl http://10.10.11.240 $ gobuster dir -u "https://app.napper.htb" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -k 博客 $ ffuf -c -w /usr/share/se…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

【Java基础】15.脚本、编译、注解

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 文章目录 系列文章目录15.脚本、编译、注解15.1 Java的脚本机制15.1.1 获取脚本引擎15.1.2 脚本计算与绑定15.1.3 重定向输入和输出15.1.4 调用脚本的函数和方法15.1.5 编…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错&#xff0c;如何知道是 哪个 symbols 不对呢&#xff1f; 今天探索到下面的方法&#xff1a; 1、点击导航上方 最右侧的按钮&#xff0c;查看历史报错 2、选中报错信息&#xff0c;右键选择 Expand All Transcripts 在出现的详细信息面…

【ARM Cortex-M3指南】4:存储器系统

文章目录 四、存储器系统4.1 存储器系统特性概述4.2 存储器映射4.3 存储器访问属性4.4 默认的存储器访问权限4.5 位段操作4.5.1 位段操作的优势4.5.2 不同数据宽度的位段操作4.5.3 C程序实现位段操作 4.6 非对称传输4.7 排他访问4.8 端模式 四、存储器系统 4.1 存储器系统特性…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…