1.public static 返回值 方法名(形式参数列表){
方法体
}
2.方法名:采用小驼峰 maxNum
3.public static : 因为当前所有的方法 写完之后 会在main方法中调用
因为main方法是public static 的
4.返回值 可有可无 具体看业务需求 如果有返回值 那么返回值类型需要和方法的返回值类型匹配
5.形式参数列表: 形参----->实参的一份拷贝 形参相当于实参的拷贝,即传值调用
6.方法体:具体方法的实现
7.方法的重载(overload):
(1).方法名相同
(2).返回值不作要求
(3).参数列表不同(类型不同或者个数不同)
(4).同一个类当中
8 面试题常考:重载与重写的区别是什么?
9.递归:把一个大问题 化解成 小问题 ,因为大问题和小问题的解决方式是一样的
-
1.要调用自己本身 n! = n* (n-1)!
-
2.要有一个趋近于终止的条件 否则 StackOverError 栈溢出异常
-
3.推倒出 递归 的公式:重要 核心:找出递推公式
-
递归 函数的调用 是要在栈上开辟内存的 给这个函数开辟栈帧
栈 先进后出 -
思考递归;横向思考 不要试图走进 递归的代码 即展开代码代码纵向执
1 . JVM的组成:java虚拟机栈,java本地方法栈,堆,方法区,程序计数器递归的栈 是Java虚拟机栈
2 .数组:存放相同数据类型的集合。内存是连续的
3 . 数组为引用类型 内存在堆上
4 .new 实例化一个对象 内存 堆上
5 .数组的拷贝有四种:
- 1.for循环
- 2.Array.copyOf(要拷贝的,拷贝的长度) 返回新的对象
- 3.System.arrayCopy(源数组 , 开始拷贝的位置,目的地数组, 拷到哪个位置, 拷贝的长度 );底层是native方法 底层是c/c++ 实现 速度快 返回新的对象
*4. array.clone() 克隆 产生了这个对象的一个副本 这个方法是object的克隆方法
6 .Array工具类当中常用的方法介绍: from…to 一般左闭右开
7.浅拷贝:如果是两个引用同时指向一个对象,那么通过一个引用修改当前对象的值后,那么另外一个引用也会受到影响
深拷贝:
8 . 不规则二维数组的定义
public static void main7(String[] args) {
int[][] array = {{1,2},{3,4},{5,6}};
int[][] array2 = new int[][]{{1,2},{3,4},{5,6}};
int[][] array3 = new int[3][2];
//不规则二维数组
int[][] array4 = new int[3][];
int[][] array5 = {{1},{3,4},{5,6}};
}
类和对象
1.面试问题:OP语言的三大特征 (OP语言:面向对象编程的语言) 封装继承和多态
2 .类和对象 抽象的概念
-
什么是类? 模板 通过一个类可以产生多个对象
-
什么是对象? 实体东西–>通过模板产生的实体
-
什么是面向对象?
面向对象:找对象 创对象 使用对象 -
访问限定修饰符
-
public : 公有的
-
private 私有的
-
protected 受保护的
-
什么都不写 默认权限–>包访问权限
```java
class Person2{
//字段-->成员变量 定义在方法外边 类的里面
//实例成员变量:对象里面 在 堆 里面
//实例成员没有初始化 默认值位对应的 0 值。 引用类型默认为null 简单类型为0
// char -> 'u0000' boolean->false
public String name;
public int age;
//静态成员变量:不属于对象,属于类 在 方法区 里面 和 实例成员变量一样 初始化都为 0
//如何访问静态的数据成员 类名.静态成员变量
public static int size ;
//方法-->行为 //实例成员方法
public void eat(){
int a = 10; // 局部变量 在 栈 里边
System.out.println("eat()!" );
}
3 .封装:用private 来修饰属性或者方法
- 为什么要封装?
- 好处:类的实现者 和 类的调用者 注意:私有的数据成员在类外不能狗访问,需要提供get,set方法来访问,更好维护程序。
- 没有特殊要求 属性设为私有的
- this: 代表 当前对象的引用
- 要习惯使用 this 代表的是当前对象的引用
4 .
class Student{
private String MyName; //被private修饰 限定只能在类当中使用
public int age ;
//编译器自己可以生成get,set方法 要规范命名 MyName 不可 name 可
// 快捷键 alt + insert
public void func1() {
System.out.println("func1()");
}
public void show(){
System.out.println("我叫" + this.MyName + "今年" + age + "岁");
}
public String getName(){
return this.MyName;
}
public void setName(String MyName){ //形参与属性名称相同时 要用this关键字
this.MyName = MyName; //否则自己给自己赋值 并没有给属性赋值 局部变量优先
}
@Override //表示重写
public String toString() { // 重新 实现了一下 Object类的toString()方法 相当于重写
return "Student{" + //alt + insert --> toString
"MyName='" + MyName + ''' +
", age=" + age +
'}';
}
}
构造方法
1 . 构造方法: 他的方法名是和类目相同的,且没有返回值
2 .当没有提供构造方法的时候,会默认生成一个没有参数的构造方法,当你提供了一个构造方法,编译器不会生成默认构造方法
3 .提出问题:一个对象的产生,分为几步?他是如何产生的?
答:1.为对象分配内存 2.调用合适的构造方法 意味着构造方法不止一个
4 . 面试问题:this关键字代表对象,对不对?
不对。 this关键字代表当前对象的引用 为什么?因为生成对象,需要俩步,分配内存以及调用合适构造方法,但是在构造方法中已经使用了this,所有this只能代表 为 当前对象分配内存,所以this代表当前对象的引用
5.this的功能:
- this() : 调用自己的构造方法
只能调用一次,且只能在构造方法中调用,且只能放在第一行 - this.data : 调用当前对象的属性
- this.func : 调用当前对象的方法
6 .实例代码块: 类的内部 ,方法的外部
静态代码块: 有 static 修饰的 实例代码块
本地代码块: 方法内部的 代码块
优先级 : 静态代码块 > 实例代码块 > 构造方法
如果都是静态的 跟定义的顺序是有关系的
如果都是实例 跟d定义的顺序还是有关的
时间空间复杂度-
冒泡排序 空间复杂度 O(1)
-
斐波那契数列 空间复杂度 O(N)
跟问题规模有关 N为参数
时间复杂度 logN N 代表节点数 (二叉树) -
时间复杂度:算法中的基本操作的执行次数,为算法的时间复杂度。
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。
得到的结果就是大O阶。 -
空间复杂度:临时占用存储空间大小的量度 变量的个数
递推的空间复杂度:递推的次数
面试问题:数组和链表有什么区别? ArrayList和 linkedList 的区别
顺序表:
优点: 空间连续,支持随机访问
缺点:1.中间或前面部分的插入删除时间复杂度O(N)
2.增容的代价比较大
单链表: 缺点:1、以节点为单位存储,不支持随机访问
优点:1、任意位置插入删除的时间复杂度为O(1) 头插O(1) ,尾插O(N) (必须找到为尾巴)
2、没有增容问题,插入一个开辟一个空间
面试题:输入俩个链表,找出他们的第一个公共节点
1.求俩个单链表的长度 ------- pl 指向长的链表----- ps 指向短的链表
2. 计算长度的差值 让长的先走差值步
clear 用来释放内存的
* JVM在回收内存的时候,当该对象没有人在引用他的时候,这个对象才会被回收,发生了内存泄露
* jdk命令: javac javap -c jps jmap jconslo
* jps 查看进程号
* jmap -histo:live 进程号 >log.txt 文件夹



