算法篇---java经典问题!!!
問題一:==與equal的區(qū)別?
==和 equals 都是比較的,而前者是運(yùn)算符,后者則是一個(gè)方法,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型都可以使用運(yùn)算符==,而只有引用類型數(shù)據(jù)才可以使用 equals,下面具體介紹一下兩者的用法以及區(qū)別.
==操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對(duì)應(yīng)的內(nèi)存中所存儲(chǔ)的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)引用變量是否相等,只能用==操作符。
如果一個(gè)變量指向的數(shù)據(jù)是對(duì)象類型的,那么,這時(shí)候涉及了兩塊內(nèi)存,對(duì)象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如 Objet obj = new Object();變量 obj是一個(gè)內(nèi)存, new Object()是另一個(gè)內(nèi)存,此時(shí),變量 obj 所對(duì)應(yīng)的內(nèi)存中存儲(chǔ)的數(shù)值就是對(duì)象占用的那塊內(nèi)存的首地址。對(duì)于指向?qū)ο箢愋偷淖兞?#xff0c;如果要比較兩個(gè)變量是否指向同一個(gè)對(duì)象,即要看這兩個(gè)變量所對(duì)應(yīng)的內(nèi)存中的數(shù)值是否相等,這時(shí)候就需要用==操作符進(jìn)行比較。equals 方法是用于比較兩個(gè)獨(dú)立對(duì)象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長相是否相同,它比較的兩個(gè)對(duì)象是獨(dú)立的。例如,對(duì)于下面的代碼:
String a=new String("heima");
String b=new String("heima");
兩條 new 語句創(chuàng)建了兩個(gè)對(duì)象,然后用 a,b 這兩個(gè)變量分別指向了其中一個(gè)對(duì)象,這是兩個(gè)不同的對(duì)象,它們的首地址是不同的,即 a 和 b 中存儲(chǔ)的數(shù)值是不相同的,所以,表達(dá)式 a==b 將返回 false,而這兩個(gè)對(duì)象中的內(nèi)容是相同的,所以,表達(dá)式 a.equals(b)將返回 true。
equals 本身是一個(gè)方法,它是根類 Object 里邊的方法,所有類和接口都直接或者間接繼承自 Object,所以在所有的類中都有 equals()方法,都是繼承來的,
在實(shí)際開發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來的字符串內(nèi)容是否等,例如, String input = …;input.equals(“quit” ),許多人稍不注意就使用==進(jìn)行比較了,這是錯(cuò)誤的,隨便從網(wǎng)上找?guī)讉€(gè)項(xiàng)目實(shí)戰(zhàn)的教學(xué)視頻看看,里面就有大量這樣的錯(cuò)誤。記住,字符串的比較基本上都是使用 equals 方法。
如果一個(gè)類沒有自己定義 equals 方法,那么它將繼承 Object 類的 equals 方法,Object 類的 equals 方法的實(shí)現(xiàn)代碼如下:
boolean equals(Object o){ return this==o; }這說明,如果一個(gè)類沒有自己定義 equals 方法,它默認(rèn)的 equals 方法(從 Object類繼承的)就是使用==操作符,也是在比較兩個(gè)變量指向的對(duì)象是否是同一對(duì)象,這時(shí)候使用 equals 和使用==會(huì)得到同樣的結(jié)果,如果比較的是兩個(gè)獨(dú)立的對(duì)象則總返回 false。如果你編寫的類希望能夠比較該類創(chuàng)建的兩個(gè)實(shí)例對(duì)象的內(nèi)容是否相同,那么你必須覆蓋equals 方法,由你自己寫代碼來決定在什么情況即可認(rèn)為兩個(gè)對(duì)象的內(nèi)容是相同的。代碼,試一下 equals 和==的區(qū)別
/* * ==和 equals 的用法以及區(qū)別 * */ public class TestEqulas{ public static void main(String[] args) { String s = new String("heima"); String s2 = new String("heima"); System.out.println(s.equals(s2));//輸出 true,因?yàn)?String 類已經(jīng)重寫了 equals System.out.println(s == s2);//輸出 false,因?yàn)閮烧叩牡刂肥遣煌?//創(chuàng)建三個(gè)動(dòng)物對(duì)象 //a1 和 a2name 和 age 都相同 Animal a1 = new Animal("Tom",5); Animal a2 = new Animal("Tom",5); //先試一下用==比較鏈各個(gè)對(duì)象 System.out.println(a1 == a2); //輸出 false,兩個(gè)對(duì)象內(nèi)容相同,但是他們的引用首地址不同 // 首先將自己寫的 equals 方法注釋掉,看輸出結(jié)果是什么 boolean b = a1.equals(a2); System.out.println(b);//結(jié)果為 false,證明是調(diào)用的繼承來的那個(gè) equals 方法 // 然后我們調(diào)用自己已經(jīng)重寫的 equals,再看下結(jié)果 b = a1.equals(a2);//現(xiàn)在調(diào)用的是已經(jīng)重寫后的方法 System.out.println(b);//所以打印的是 true }}?
public class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}// 重寫了 equals 方法public boolean equals(Object o) {// 判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象,如果是就直接返回 trueif (this == o) {return true;}// 再判斷另一個(gè)對(duì)象 o 是否是 null,如果是 null 就沒有必要再比了,肯定不相等,直接返回if (o == null) {return false;}if (o instanceof Animal) {// 如果是當(dāng)前類的實(shí)例,那么就強(qiáng)制轉(zhuǎn)換成當(dāng)前類的實(shí)例,再依次比較成員變量是否相等Animal s = (Animal) o;// 注意: String 類型的成員變量也可以看做是一個(gè) String 對(duì)象,需要用 equals 比較,而不能用==比較if (this.getName().equals(s.name) && this.age == s.age) {return true;}}return false;} }?
問題二:質(zhì)數(shù)問題
package com.oumyye.質(zhì)數(shù);import java.util.Random;public class Snippet {public static void main(String[] args){Random rd = new Random(); //定義一個(gè)隨機(jī)變量int i = rd.nextInt(1000); //獲取個(gè)隨機(jī)數(shù)System.out.println(isNum(i)); //輸出結(jié)果 }public static String isNum(int i ){String ret =i+"是質(zhì)數(shù)"; //默認(rèn)是質(zhì)數(shù)if(i==2)return ret; //如果是 2 返回默認(rèn)結(jié)果for (int j = 2; j < i/2; j++) { //制訂循環(huán)次數(shù)if(i%j==0){ret=i+"不是質(zhì)數(shù)"; // 如果能夠整除返回不是質(zhì)數(shù)break;}}return ret; //返回結(jié)果 } }?
問題三:求解5階螺旋矩陣問題
1 ? 2 ? 3 ? 4 ?5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
?
public class LXJZQJ {public static void main(String[] args) {int n = 5;// 0:向右,1:向下,2:向左,3:向上int direction = 0;// 行,列int row = 0, col = 0;int num = 0;int[] array = new int[n * n];while (array[row * n + col] == 0) {num++;array[row * n + col] = num;switch (direction) {case 0:col++;break;case 1:row++;break;case 2:col--;break;case 3:row--;break;}if (row == n || col == n || row == -1 || col == -1|| array[row * n + col] != 0) {direction++;if (direction == 4)direction = 0;switch (direction) {case 0:row++;col++;break;case 1:row++;col--;break;case 2:row--;col--;break;case 3:row--;col++;break;}}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.printf("%-3s", array[i * n + j]);}System.out.println();}} }?
轉(zhuǎn)載于:https://www.cnblogs.com/oumyye/p/4280454.html
總結(jié)
以上是生活随笔為你收集整理的算法篇---java经典问题!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring中注解的通俗解释
- 下一篇: 创建PCH文件