1.方法

java方法是语句的集合,它们在一起执行一个功能

  1. 方法是解决一类问题的步骤的有序组合
  2. 方法包含于类或对象中
  3. 方法在程序中被创建,在其他地方被引用

设计方法的原则:一个方法只完成1个功能,这样利于我们后期扩展。

方法的定义

  1. 修饰符 返回值类型 方法名(参数类型 参数名){
  2. ...
  3. 方法体
  4. ...
  5. return 返回值;
  6. }
  1. package com.kuang.method;
  2. public class Demo01 {
  3. //main方法
  4. public static void main(String[] args) {
  5. int sum = add(1,2);
  6. System.out.println(sum);
  7. }
  8. //加法
  9. public static int add(int a,int b){
  10. return a + b;
  11. }
  12. }

注意:方法返回值通过return语句实现,如果没有返回值,返回值类型设置为void,可以省略return。

方法调用使用:“类名.”

  1. package com.kuang.method;
  2. public class Demo02 {
  3. public static void main(String[] args) {
  4. int a = max(10,10);
  5. System.out.println(a);
  6. System.out.println("===========");
  7. //使用类名.的方式调用
  8. int b = Demo02.max(26,78);
  9. System.out.println(b);//78
  10. System.out.println("===========");
  11. System.out.println(Demo02.max(10,20));//20
  12. }
  13. //比大小
  14. public static int max(int num1,int num2){
  15. int result;
  16. if (num1 == num2){
  17. System.out.println("num1 == num2");
  18. return 0;//终止方法
  19. }
  20. if (num1 > num2){
  21. result = num1;
  22. }else {
  23. result = num2;
  24. }
  25. return result;
  26. }
  27. }

2.方法重载 overlord

重载就是在一个类中,有相同的函数名称,但形参不同的函数

方法重载的规则:

  1. 在同一个类中且方法名必须相同
  2. 参数列表必须不同(参数个数不同算不同,参数类型不同算不同,参数顺序不同也算不同)
  1. //例:方法重载简化输出语句
  2. public class s{
  3. public static void p(){
  4. System.out.println();
  5. }
  6. public static void p(byte b){ //输出byte类型
  7. System.out.println(b);
  8. }
  9. public static void p(short s){ //输出short类型
  10. System.out.println(s);
  11. }
  12. public static void p(int i){ //输出int类型
  13. System.out.println(i);
  14. }
  15. public static void p(long l){ //输出long类型
  16. System.out.println(l);
  17. }
  18. public static void p(float f){ //输出float类型
  19. System.out.println(f);
  20. }
  21. public static void p(double d){ //输出double类型
  22. System.out.println(d);
  23. }
  24. public static void p(Boolean b){ //输出boolean类型
  25. System.out.println(b);
  26. }
  27. public static void p(char c){ //输出char类型
  28. System.out.println(c);
  29. }
  30. public static void p(String s){ //输出String类型
  31. System.out.println(s);
  32. }
  33. }
  34. /*实现结果:
  35. System.out.println(“Hello World!”)
  36. s.p(“Hello World!”)
  37. 方法重载的目的:功能类似的方法使用同一名字,更容易记住,因此调用起来更简单。
  38. */

3.可变参数(了解)

JDK1.5开始,java支持传递同类型的可变参数给一个方法

在方法声明中,在指定参数类型后加上一个省略号(...)

一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明。

  1. package com.kuang.method;
  2. public class Demo04 {
  3. public static void main(String[] args) {
  4. Demo04 demo04 = new Demo04();
  5. demo04.test(1,2,3,4,5);
  6. }
  7. // public void test(int...i,int x)会报错
  8. ///public void test(int a,int...i)可以
  9. public void test(int...i){
  10. System.out.println(i[0]);
  11. }
  12. }

4.递归

递归就是方法自身调用自身

递归结构包括两个部分:

  1. 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
  2. 递归体:什么时候需要调用自身方法。
  1. package com.kuang.method;
  2. public class Demo05 {
  3. public static void main(String[] args) {
  4. System.out.println(f(5));//120
  5. }
  6. //阶乘
  7. //1! 1
  8. //2! 2*1
  9. //5! 5*4*3*2*1
  10. public static int f(int n){
  11. if (n == 1) {//结束条件
  12. return 1;
  13. }else {
  14. return n * f(n-1);
  15. //若传递2:2 2 * f(1)
  16. //若传递3:3 3 * f((2)
  17. }
  18. }
  19. }
  1. 使用递归计算1~N的和
  2. Public static void main(String[] args){
  3. Int revalue = sum(3);
  4. System.out.println(reValue);
  5. }
  6. Public static int sum(int n){
  7. if(n == 1){//结束条件
  8. return 1;
  9. }
  10. return n + sum(n - 1);
  11. }

注意:使用递归的时候,必须添加结束条件,否则会发生栈内存溢出(StackOverflowError)

原因:一直压栈,没有弹栈,栈内存不够

在实际开发中遇到递归导致的栈内存溢出怎么办?

  1. 检查结束条件是否正确
  2. 如果正确,可以调整JVM的栈内存大小(java -X)

5.数组

  1. 数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。

  2. 数组中的元素内存地址是连续的

  3. 数组中首元素的内存地址作为整个数组对象的内存地址

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

  1. dataType[] arrayRefVar;//首选的方法
  2. //或
  3. dataType arrayRefVar[];//效果相同,但不是首选方法
  4. //java语言使用new操作符来创建数组,语法如下:
  5. dataType[] arrayRefVar = new dataType[arraySize];

数组中每一个元素都有下标,从0开始,以1递增,最后一个元素的下标是length-1

获取数组长度:arrays.length

  1. package com.kuang.array;
  2. public class ArrayDemo01 {
  3. public static void main(String[] args) {
  4. int[] nums;//1.声明一个数组
  5. //int nums2[];早期java偏向c和c++的风格
  6. //2.创建一个数组
  7. nums = new int[10];//这里面可以存放10个int类型的数字
  8. //3.给数组元素赋值
  9. nums[0] = 1;
  10. nums[1] = 2;
  11. nums[2] = 3;
  12. System.out.println(nums[0]);//1
  13. System.out.println(nums[1]);//2
  14. System.out.println(nums[2]);//3
  15. System.out.println(nums[3]);//0,没赋值会是默认的值
  16. //计算所有元素的和
  17. int sum = 0;
  18. //获取数组长度:arrays.length
  19. for (int i = 0; i < nums.length; i++) {
  20. sum += nums[i];
  21. }
  22. System.out.println("总和为:" + sum);//总和为:6
  23. }
  24. }
  1. //字符串数组
  2. //字符串是引用类型,因此我们定义一个字符串数组:
  3. String[] names = {
  4. ABC”,”XYZ”,”Zoo
  5. };

数组的优点与缺点

优点:查询/查找/检索某个下标上的元素是效率极高

原因:

  1. 每一个元素的内存地址在空间存储上是连续的

  2. 每一个数据类型都相同,所以占用空间大小一样

  3. 知道第一个元素内存地址,知道每个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标元素的内存地址,直接通过内存地址定位元素

缺点:随机增删效率较低

原因:

  1. 为了保证数组中每个元素的内存地址是连续的,所以在数组上随机删除或增加元素的时候,效率极低,因为随机增删元素会涉及到后面元素向前或向后位移的操作

  2. 数组不能存储大数据量,因为很难在内存空间找到一块特别大的连续的内存空间

Java内存分析

  1. 堆:存放new的对象和数组,可以被所有的线程共享,不会存放别的对象引用
  2. 栈:存放基本变量类型(包含这个基本类型的具体数值)、引用对象的变量(存放这个引用再堆里面的具体地址)
  3. 方法区:可以被所有的线程共享,包含了所有class和static变量

数组的三种初始化:静态初始化、动态初始化、默认初始化

  1. package com.kuang.array;
  2. public class ArrayDemo02 {
  3. public static void main(String[] args) {
  4. //静态初始化:创建 + 赋值
  5. int[] a = {1,2,3,4,5,6,7,8};
  6. System.out.println(a[0]);//1
  7. //动态初始化:包含默认初始化
  8. int[] b = new int[10];//需手动赋值,不然是默认值
  9. b[0] = 10;//赋值
  10. System.out.println(b[0]);//10
  11. System.out.println(b[1]);//0
  12. }
  13. }
  1. //声明一个int类型的数组,使用静态初始化方式
  2. int[] a = {1,100,10,20,55,689};
  3. //所有数组对象都有length属性
  4. System.out.println("数组中元素的个数:" + a1.length);//6
  5. //数组中每一个元素都有下标
  6. //通过下标对数组中的元素进行存和取
  7. //取(读)
  8. System.out.println("第一个元素=" + a[0]);//1
  9. System.out.println("最后的元素=" + a[5]);//689
  10. System.out.println("最后的元素=" + a[a.length - 1]);//689
  11. //存(改),把第一个元素修改为111
  12. a[0] = 111;
  13. //把最后一个元素修改为0
  14. a[a.length - 1] = 0;
  15. System.out.println("第一个元素=" + a[0]);//111
  16. System.out.println("最后的个元素=" + a[5]);//0

数组的四个基本特点

  1. 其长度是确定的,数组一旦被创建,大小就是不可以改变的
  2. 其元素必须是相同类型,不允许出现混合类型
  3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型
  4. 数组属于引用类型,也可以看成是对象。数组中的每个元素相当于该对象的成员变量。数组对象本身是存放在堆中的。

数组边界

下标的合法区间:[0,length - 1],如果越界就会报错

ArrayIndexOutOfBoundsException:数组下标越界异常!

数组的使用

普通for循环与For-Each循环

普通for循环遍历

  1. package com.kuang.array;
  2. public class ArrayDemo03 {
  3. public static void main(String[] args) {
  4. int[] arrays = {1,2,3,4,5};
  5. //打印全部的数组元素
  6. for (int i = 0; i < arrays.length; i++) {
  7. System.out.println(arrays[i]);
  8. }
  9. System.out.println("==============");
  10. //计算所有元素的和
  11. int sum = 0;
  12. for (int i = 0; i < arrays.length; i++) {
  13. sum += arrays[i];
  14. }
  15. System.out.println("sum = " + sum);
  16. //查找最大元素
  17. int max = arrays[0];
  18. for (int i = 1; i < arrays.length; i++) {
  19. if (arrays[i] > max){
  20. max = arrays[i];
  21. }
  22. }
  23. System.out.println("max = " + max);
  24. }
  25. }

foreach遍历

  1. package com.kuang.array;
  2. public class ArrayDemo04 {
  3. public static void main(String[] args) {
  4. int[] arrays = {1,2,3,4,5};
  5. //foreach遍历,没有下标
  6. for (int array: arrays) {
  7. System.out.println(array);
  8. }
  9. }
  10. }

多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组

二维数组
  1. int a[][] = new int[2][5];
  2. //解析:以上二维数组a可以看成是一个两行五列的数组
  1. package com.kuang.array;
  2. public class ArrayDemo05 {
  3. public static void main(String[] args) {
  4. //[3][2]:3行2列
  5. /*
  6. 1,2 a[0]
  7. 3,4 a[1]
  8. 5,6 a[2]
  9. */
  10. int[][] a = {{1,2},{3,4},{5,6}};
  11. System.out.println(a[0][0]);//1
  12. System.out.println(a[0][1]);//2
  13. System.out.println(a[1][0]);//3
  14. System.out.println("==========");
  15. System.out.println(a.length);//3:表示3行
  16. System.out.println(a[0].length);//2:表示2列
  17. System.out.println("==========");
  18. //二维数组遍历
  19. for (int i = 0; i < a.length; i++) {
  20. for (int j = 0; j < a[i].length; j++) {
  21. System.out.println(a[i][j]);
  22. }
  23. }
  24. }
  25. }
一维数组扩容

扩容是先新建一个大容量的数组,然后将小容量数组中的数据一个一个拷贝到大数组当中

注意:数组扩容效率极低

  1. public class ArrayTest08 {
  2. public static void main(String[] args) {
  3. //java当中的拷贝方法
  4. //System.arraycopy(5个参数);
  5. int[] src = {1,11,22,3,4};//拷贝源
  6. int[] dest = new int[20];//拷贝目标,动态初始化一个长度为20的数组
  7. //调用arraycopy方法
  8. System.out.println(src,srcPost:1(拷贝源起始位置),dest,destPos:3(拷贝到的位置),length:2(拷贝长度));
  9. //遍历数组
  10. for(int i = 0; i < dest.lentgh; i++){
  11. System.out.rptinln(dest[i]);//0 0 0 11 22…0
  12. }
  13. //拷贝源
  14. String[] strs = {"hello","world!","java","oracle","mysql","jdbc"};
  15. //拷贝目标
  16. String[] newStrs = new String[20];
  17. System.arraycopy(strs,0, newStrs, 0, strs.length);
  18. for (int i = 0; i < newStrs.length; i++) {
  19. System.out.println(newStrs[i]);
  20. }
  21. }
  22. }

6.Arrays类

数组的工具类java.util.Arrays

Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用

具有以下常用功能:

  1. 给数组赋值:通过fill方法
  2. 对数组排序:通过sort方法,按升序
  3. 比较数组:通过equals方法比较数组中元素值是否相等
  4. 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作
  1. package com.kuang.array;
  2. import java.util.Arrays;
  3. public class ArrayDemo06 {
  4. public static void main(String[] args) {
  5. int[] a = {1,2,3,4,9090,31231,543,21,3,23};
  6. System.out.println(a);//[I@154617c
  7. //打印数组元素:Arrays.toString
  8. System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 9090, 31231, 543, 21, 3, 23]
  9. Arrays.sort(a);//对数组进行排序:升序
  10. System.out.println(Arrays.toString(a));//[1, 2, 3, 3, 4, 21, 23, 543, 9090, 31231]
  11. Arrays.fill(a,0);//数组填充
  12. System.out.println(Arrays.toString(a));//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  13. Arrays.fill(a,2,4,1);//让下标为2跟4之间的元素填充为1
  14. System.out.println(Arrays.toString(a));//[0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
  15. }
  16. }

7.冒泡排序

冒泡排序无疑是最为出名的排序算法之一,总共有八大排序

  1. package com.kuang.array;
  2. import java.util.Arrays;
  3. //冒泡排序
  4. /*
  5. 1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换它们的位置
  6. 2.每一次比较,都会产生一个最大或者最小的数字
  7. 3.下一轮则可以少一次排序
  8. 4.依次循环,直到结束
  9. */
  10. public class ArrayDemo07 {
  11. public static void main(String[] args) {
  12. int[] a = {6,4,2,1,26,78};
  13. int[] sort = sort(a);
  14. System.out.println(Arrays.toString(a));//[1, 2, 4, 6, 26, 78]
  15. }
  16. public static int[] sort(int[] array){
  17. //临时变量
  18. int temp = 0;
  19. //外层循环,判断我们这个要走多少次
  20. for (int i = 0; i < array.length - 1; i++) {
  21. //内层循环,比较判断两个数,如果第一个数比第二个数大则交换位置
  22. for (int j = 0; j < array.length - 1 - i; j++) {
  23. if (array[j + 1] < array[j]){//从大排到小只需要改<为>即可
  24. temp = array[j];
  25. array[j] = array[j + 1];
  26. array[j + 1] = temp;
  27. }
  28. }
  29. }
  30. return array;
  31. }
  32. }

JavaSE学习笔记04方法、数组的更多相关文章

  1. JavaSE 学习笔记04丨异常

    Chapter 9 异常 异常:指程序在执行过程中,出现的非正常的情况,最终导致JVM非正常停止. 在Java等面向对象的编程语言中,异常是一个类,所有异常都是发生在运行阶段的(因为也只有程序运行阶段 ...

  2. JavaSE学习笔记(7)---数组

    JavaSE学习笔记(7)---数组 1.什么是数组 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个 ...

  3. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  4. javaSE学习笔记(16)---网络编程

    javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...

  5. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  6. JavaSE学习笔记(14)---File类和IO流(字节流和字符流)

    JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...

  7. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  8. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...

  9. JavaSE学习笔记(9)---集合类和泛型

    JavaSE学习笔记(9)---集合类和泛型 1.Collection集合 集合概述 在前面我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合:集合是jav ...

随机推荐

  1. xss中shellcode的调用

    shellcode就是利用漏洞所执行的代码 在完整的xss攻击之中,会将shellcode存放在一定的地方,然后触发漏洞,引发shellcode. 1.远程调用执行js 可将js代码单独放在一个js文 ...

  2. 【系统之音】Android进程的创建及启动简述

    Android系统中的进程(这里不包括init等底层的进程)都是通过Zygote fork而来的,那这些进程的启动流程都是怎样的呢? 这里将Android进程分为两个部分: (1)系统框架进程Syst ...

  3. 向你的C语言项目中加入多线程

    C语言在标准库<pthread.h>中为程序员提供了多线程操作接口. 先从简单操作入手 int pthread_create(pthread_t *thread, pthread_attr ...

  4. php Zookeeper使用踩坑

    用的是Zookeeper扩展,Php版本为7.2.17,下载地址: https://pecl.php.net/package/zookeeper 用的是0.6.4版本 创建节点官方给的示例如下: &l ...

  5. Asp.Net Core Log4Net 配置分多个文件记录日志(不同日志级别)

    本文所有配置都是在core3.1环境下. 首先看看最终的效果. 请求监控:对每次请求的相关信息做一个记录. 全局异常:我不想我的错误信息,跟其他的信息混合在一起,查看的时候不大方便. 应用日志:这个主 ...

  6. BUUCTF[归纳]sql注入相关题目

    这是我自己对于sql注入的部分ctf题型的归纳,均来自buuctf的平台环境. [0CTF 2016]piapiapia 我尝试了几种payload,发现有两种情况. 第一种:Invalid user ...

  7. Linux常用字段

    cd 切换路径 vim,vi 打开文档 ls  查看文件信息 chmod 修改文件或目录的权限 useradd 添加用户 cat 查看纯文本文件(少内容) rm 删除文件或目录 mv 剪切文件或文件重 ...

  8. mac电脑,charles,安卓手机如何配置代理,以及配置代理之后无法上网。已解决

    设备: 电脑:mac book pro 手机:小米10 charles:4.5.6 方法一: 步骤: 首先确保电脑,手机在同一局域网, 1. charles设置代理:proxy -> proxy ...

  9. Centos-bzip2压缩文件-bzip2 bunzip2

    bzip2 buzip2 对文件进行压缩与解压缩,类似 gzip gunzip命令,只能压缩文件,对目录则压缩目录下文件,生成以 .bz2为扩展名的文件 相关选项 -d 解压 -v 压缩或解压显示详细 ...

  10. mysql-8-subquery

    #进阶8:子查询 /* 出现在其他语句中的select语句(嵌套) 分类: 按子查询出现的位置: SELECT 后面 FROM 后面 WHERE 或 HAVING 后面 EXISTS后面 */ USE ...