前面兩節我們能夠掌握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
下面同時新增一個數據,則:
再新增兩個: