前面两节我们能够掌握Java关键字,数据类型等基础知识,从这一节开始,开始正式入门Java核心。每个核心分为基础+进阶两部分,初步学习只需要看基础,需要理解底层数据结构,原理的可在有余力的前提下进一步钻研,对于面试也是很有帮助的。
整个系列教程只会讲解常用方法,部分细节和用法未能面面俱到,希望大家理解。
一:方法基础
1.方法的结构
修饰符 + 返回类型 + 方法名称() {
这个方法要做的事情...
}
注意:方法名称不能和类名(class修饰,如 public class Test,那类名就是Test)一致
2.方法的定义
方法中常说有两种,一种叫构造方法,一种叫普通方法,下面举两个例子:
构造方法:
(1)有参构造:这里的person就是一个有参构造方法
class person{
int age;
public person(int a){
age=a;
}
}
(2)无参构造:这里的person就是一个无参构造方法
class person{
int age;
public person(){
}
}
注意:
①方法名和 类名相同
②在方法名的前面没有返回值类型的声明
③在方法中不能使用return语句返回一个值
普通方法:
(1)有参方法:
public String withParam(String param) {
System.out.println("这是有参方法,参数是:" + param);
}
(2)无参方法:
public String withoutParam() {
System.out.println("这是无参方法" );
}
3.方法的使用场景和使用方法
构造方法:一般伴随着POJO类出现,用来初始化,设置常见的get/set方法,现在可能大家比较陌生,在实际开发中,大致是这样的思路
1.设计好数据库表,假设有User表
2.下一步就会建立一个POJO,名称一般都叫user表,实现表与Java代码的映射,因为我们所有的代码开发,最终都是数据库的增删改查(CRUD)操作,所以需要实现一个映射关系
3.生成无参/有参/set/get/toString方法
4.编写DAO,Service,Controller,HTML
普通方法:满足用户自己需求而设计的方法,比如:我们需要根据ID查找用户的信息,此时我们一般就定义个:getUserById(Integer id);
常见的一个Java类,同样以User展示一下方法的用法:
package com.car.entity;
/**
*
* @author Herb
*
*/
public class User {
private Integer id;
private String userName;
private String password;
private String trueName;
private String email;
private String phone;
private String roleName;
// 这个就是无参构造方法
public User() {
// TODO Auto-generated constructor stub
}
// 这个就是有参构造方法
public User(Integer id, String userName, String password, String trueName, String email, String phone,
String roleName) {
super();
this.id = id;
this.userName = userName;
this.password = password;
this.trueName = trueName;
this.email = email;
this.phone = phone;
this.roleName = roleName;
}
// 这些往下的方法都是普通方法,此处的是无参普通方法,下面的类似不再注释
public Integer getId() {
return id;
}
// 这些往下的方法都是普通方法,此处的是有参普通方法,下面的类似不再注释
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", trueName=" + trueName
+ ", email=" + email + ", phone=" + phone + ", roleName=" + roleName + "]";
}
}
二:数组基础
1.数组的定义
常见的一维数组定义:
public class ArrayDemo{
public static void main(String[] args) {
//第一种 例:
String[] test1 = new String[6];
test1[0] = "数组0";
test1[1] = "数组1";
//第二种 例:
String[] test2 = {"数组0","数组1","数组2","...."};
//第三种 例:
String[] test3 = new String[]{"数组0","数组1","数组2","...."};
}
}
常见的二维数组定义:
public class ArrayDemo {
public static void main(String args[]) {
//此时的数组并不是一个等列数组
int data[][] = new int[][] {
{1, 2, 3}, {4, 5}, {6, 7, 8, 9}};
//如果在进行输出的时候一定要使用双重循环,
//外部的循环控制输出的行数,而内部的循环控制输出列数
for(int i = 0; i < data.length; i++) {
for(int j = 0; j < data[i].length; j++) {
System.out.print("data[" + i + "][" + j + "]=" + data[i][j] + "、");
}
System.out.println();
}
}
}
2.数组的使用场景和使用方法
二维数组比较少用,一维数组更常用一些,常用来存储数据。
主要适合:数据量小,大量查询的时候
三:数组进阶
1.定义数组时的内存变化
当我们定义一个数组,如下时:
public class ArrayDemo {
public static void main(String args[]) {
int data[] = null;
data = new int[3]; //开辟一个长度为3的数组
data[0] = 10;
data[1] = 20;
data[2] = 30;
}
}
因为我们的代码运行是需要依赖JVM的,而JVM的分类,包括:方法区,虚拟机栈,堆栈,本地方法栈,程序计数器几部分(JVM在现在就不讲了,涉及的比较多,后面再加,也是初级面试常问的问题)
定义数组,可以就简单的这样理解:我们定义了数组,存储了数据,这些数据存哪呢?肯定要放内存里啊,就像我们电脑的硬盘一样存储起来。下面这张图很好的解释了上面数组的内存分配和地址引用。
(1)int data[] = null;
这句代码,定义了一个int类型的数组,名称叫做data,此时JVM(Java虚拟机)就在栈内存中开辟了一个空间,名称就叫做我们定义的data,我们定义hello,那么这里栈内存中的就是hello。
(2)data = new int[3];
这句代码,将上面的data进行实例化,也就相当于我们具体的建立了一个文件,定义了他的大小是3,所以在栈内存中开辟了0.1.2三个空间(Java数组,脚标从0)开始
此时栈内存中的data,指向堆内存中的空间。为什么有个指向呢?
可以理解为:快捷方式,栈内存一般存储的都是临时变量,新生代数据,会发生大量的GC,堆内存中才会存储老年代的数据,就像我们一般数据都存储在DEF盘,发送一个快捷方式放到桌面一样
(3)data[0] = 10; data[1] = 20; data[2] = 30;
这句代码,开始在堆内存中真正的存储进去了3个数据,012依次存放10.20.30,就类似于我们上面建立的文件夹,这里才真正的放进去了三个文件一样
2.数组和链表的区别
数组:
是将元素在内存中连续存储的;
优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;
缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。
链表:
是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存在元素的指针来联系)。
下面用个图,说一下大致的使用变化
假设现在二者都用了1.2
下面同时新增一个数据,则:
再新增两个: