Java学习笔记四
?
51.
java中的數組是一個引用,所以也是可以調用equals 方法的,如果比較兩個數組的內容是否相同不能用equals方法;
比如? int[] a = {1,2,3,}
????? int[] b= {1,2,3};
System.out.println (a.equals(b));
結果肯定是false;因為并沒有實現對equals方法的重寫,比較的是兩個數組的引用地址;顯然是不相同的
52.
構造方法的作用是對類中的屬性賦初值,運用this方法,
返回給主函數
數組也是可以使用的
public class Test
{
????????????? public static void main (String[] args)
????????????? {
???????????????????? Person[]?array = new? Person [3];//生成數組
???????????????????? array[0] = new Person (12);//生成數組對象;并賦值給age
???????????????????? array[1] = new Person (11);
???????????????????? array[2] = new Person (23);
???????????????????? for (int i = 0; i < array.length; i++)
???????????????????? System.out.println (array[i].age);
????????????? }
}
class Person
{
????????????? int age ;
????????????? public Person (int age)
????????????? {
??????????????????????????? this.age = age;
???????????????????????????
????????????? }
}
51、
奇數是張三偶數是李四
public class Test
{
????????????? public static void main (String[] args)
????????????? {
???????????????????? Person[] p = new Person[100];
????????????????????
???????????????????? for (int i =0; i < p.length; i++)
???????????????????? p[i] = new Person ();
???????????????????? for (int j = 0; j <= p.length; j++)
???????????????????? {
?????????????????????????????????? if (j % 2== 0)
?????????????????????????????????? p[j] .name = "zhangsan";
?????????????????????????????????? else p[j].name ="lisi";
?????????????????????????????????? System.out.println(p[j].name);
??????????????????????????????????
??????
??????????????????????????????????
???????????????????? }
????????????? }
}
class Person
{
????????????? String name;
?????????????
}
用判斷的方法來做
public class Test3
{
????????????? public static void main (String[] args)
????????????? {
???????????????????? Person[] a = new Person [100];
????????????????????
???????????????????? for (int i = 0; i <= a.length; i ++ )
???????????????????? {
???????????????????? ??? a[i] =new Person ();
??????????????????????????? a[i].name = i%2 ==0 ?"lisi":"wangwu";
??????????????????????????? System.out.println (a[i].name);
???????????????????? }
????????????? }
}
class Person
{
????????????? String name ;
?????????????
}
52.
數組是對象
53.?
如何驗證數組是對象
int[] I = new int[10]
System.out.println (I? instanceof Object);
打印出 true
54;
//關于二維數組的不規則形式
//二維數組允許先定義行再定義列的順序,反過來是不可以的,因為先定義列就無法確認行數!
public class Test
{
?????? public static void main (String[] args)
?????? {?????
???????????????????? int m =3;
???????????????????? int[][] a = new int[3][];//先聲明有三行;
????????????? ?a[0] = newint[3];//第一行有三個元素;
????????????? ?a[1] = newint[2];
????????????? ?a[2] = newint[1];
????????????? for (int i = 0; i < a.length; i++)
????????????? {
????????????? for (int j = 0; j <a[i].length; j++)
????????????? {
????????????? a[i][j] = m;
????????????? m +=2;
????????????? System.out.print (a[i][j]);
????????????? }
????????????? System.out.println ("\n");
?????????????
????????????? }
?????????????
?????????????
?????????????
?????????????
?????? }
}//也可以這樣寫,在生成數組的時候就賦上值;int[][] a = new int [3][]{{1,23},{23},{7,8,7}}
55.
數組是對象,所以在生成數組時的變量就是一個引用,且引用指向數組的首地址等,即第一個;
int[] a = new int [3];
a是一個引用,既然a是一個引用那么當它進行傳遞時,就可以是其他的引用共同指向對象,即可以通過其他引用改變對象的內容;
public classTest
{
????????????? public static void method(char[]ch , char ch1)
????????????? {
???????????????????? ch[0]= 'C';//現在的ch也是一個引用,通過引用改變數組的第一個值;
???????????????????? ch1 = 'D';
????????????????????
????????????? }
????????????? public static void main(String[]args)
????????????? {
??????????????????????????? char[] ch = {'A','f'};
??????????????????????????? method (ch ,ch[1]);//ch是一個數組引用,ch[1]是一個字符值;傳給method方法;
??????????????????????????? System.out.println(ch[0]);
??????????????????????????? System.out.println(ch[1]);
???????????????????????????
???????????????????????????
????????????? }
?????????????
}
打印結果、:
c f;
發現:如果直接打印數組的引用打印出來的是數組的所有元素;
因為java里面沒有指針,所以只能通過數組的形式來交換方法的數值,傳遞給方法數組的引用后,就可以對數組進行修改,如同上例;
56.
要注意的是聲明數組的時候并沒有聲稱對象,只是生成了數組對象的實例,
我們知道接口interface,是不能生成對象的;
57.
關于靜態static如果生命在本類當中的屬性,則該類中的方法,可以直接調用,而不用前綴類名;如類為Test? 直接 method();
58;
//比較兩個數組是否相同,要比較數組的長度和內容是否相同;
/比較兩個數組是否相同,要比較數組的長度和內容是否相同;
importjava.util.Arrays;
public classTest
{
????????????? public static boolean method(int[] x, int[] y)
????????????? {
??????????????????????????? if(x == null || y ==null )
??????????????????????????? return false ;
??????????????????????????? if (x.length !=y.length)
??????????????????????????? return false;
??????????????????????????? for (int i = 0;i<x.length; i++ )
??????????????????????????? {
????????????????????????????????????????? if(x[i]!= y[i])
????????????????????????????????????????? returnfalse;
?????????????????????????????????????????
??????????????????????????? }
??????????????????????????? return true;
????????????? }
????????????? public static void main (String[]args)
????????????? {
??????????????????????????? int[] a = {3,4,6};
??????????????????????????? int[] b = {3,4,5,6};
??????????????????????????? System.out.println(method(a, b));
??????????????????????????? System.out.println(Arrays.equals(a, b));
??????????????????????????? //不做這樣做是有些麻煩,java中有專門的方法來比較兩個數組是否相同,就是位于java.utill.Arrays類
??????????????????????????? //由于不是java.lang包下的類所以要聲明導入;
???????????????????????????
???????????????????????????
??????????????????????????? ???????????????????????????
?????????????
????????????? }
}
59.
關于數組拷貝copy的問題。回過頭來看下
60.
數組的功能:查詢和排序
1.冒泡排序
public class Test
{
????????????? public static void method (int[] a)
????????????? {
???????????????????? int temp;
???????????????????? for(int i = 0; i <a.length - 1;i++)//這點是要非常注意的,上面是長度減一,下面是長度減一減i;!
???????????????????? for (int j = 0; j <a.length -1-i; j++)
???????????????????? {
???????????????????????????
??????????????????????????? if (a[j]>a[j+1])
??????????????????????????? {
??????????????????????????? temp = a[j];
??????????????????????????? a[j] = a[j + 1];
??????????????????????????? a[j + 1] =temp;
??????????????????????????? }
???????????????????????????
???????????????????????????
???????????????????????????
???????????????????? }
???????????????????? for (int x = 0 ;x <= 9;x++)
???????????????????? System.out.println (a[x]);
????????????????????
????????????????????
????????????? }
????????????? public static void main (String[]args)
????????????? {
??????????????????????????? int[] a ={2,3,4,1,54,32,45,32,221,44};
??????????????????????????? Test.method (a);
???????????????????????????
???????????????????????????
????????????? }
}
61.
關于二分查找
關于二分查找我有兩個問題,希望高手能指點一二。 1.二分查找的對象是個有序數組,如果這個數組元素個數為偶數時的情形是怎樣的呢?這個我似乎在書上沒有找到。比如如果查找的數組元素個數為12個,那么mid指針指向的是第幾個元素呢? 2.對于任意長度的有序數組,二分查找真的能在最多4次查找之后就可以返回結果嗎?為什么? ? ? 1 對于查找條件為等式的情況,mid指針可以指向中間偏左,也可以指向中間偏右,對于查找條件為不等式時,要根據具體情況選擇,查找大于某數的第一個數值時選擇指向中間偏左,查找小于某數的第一個數值時選擇之下是那個中間偏右 2 這個說法是錯誤的,二分查找的復雜度為O(logn),簡單的說,就是對于n個元素的數組,大約需要查找logn次,如n=1000,則需要7次查找 62. ? ? //自己寫的二分排序法,我自己的理解 //二分排序法得以進行的條件是數組必須是有序的;這里我選擇升序; //由于是折中進行,所以數組索引值會向中間靠攏,當找到所需值,或者找到索引的最小最大值相等時,循環就結束了 //對于奇數索引數組元素為偶數來說,因為length是整形,除以二當然舍棄小數點,這里偶數奇數數組都是沒有影響的 //如果在左邊索引最高值為中間值 - 1;在右邊最小值為中間值 + 1 ? public class Test3 { ?????????????????????????????? public static int method (int[] a, int value) ?????????????????????????????? { ???????????????????????????????????????????????????????????? int low = 0; ???????????????????????????????????????????????????????????? int high = a.length -1; ???????????????????????????????????????????????????????????? int middle ; ???????????????????????????????????????????????????????????? while (low <= high) ???????????????????????????????????????????????????????????? { ???????????????????????????????????????????????????????????? middle = (low +high) / 2; ???????????????????????????????????????????????????????????? if (value == a[middle]) ???????????????????????????????????????????????????????????? return middle ; ???????????????????????????????????????????????????????????? if(value < a[middle]) ???????????????????????????????????????????????????????????? high = middle - 1; ???????????????????????????????????????????????????????????? if(value > a[middle]) ???????????????????????????????????????????????????????????? low = middle + 1 ; ???????????????????????????????????????????????????????????? } ???????????????????????????????????????????????????????????? return -1; ?????????????????????????????? } ?????????????????????????????? public static void main (String[] args) ?????????????????????????????? { ????????????????????????????????????????????? int[] a =? {1,2,3,4,5,6,7,8} ; ????????????????????????????????????????????? int value = 3; ????????????????????????????????????????????? System.out.println(method (a , value)); ????????????????????????????????????????????? ?????????????????????????????? } } 63.時間復雜度:同一問題可用不同算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進算法。
按數量級遞增排列,常見的時間復雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n2),立方階O(n3),...,
k次方階O(nk), 指數階O(2n) 。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,算法的執行效率越低。
64. 隨機Random; ? //如何隨機生成數字;通過調用 java.util包下的Random類的 nextInt(int)方法來實現。其中n代表隨機數的邊界,但隨機數不包含邊界n; //即生成的數字介于? 0 <= x <n,之間,下面的程序是要找到10 ——50的隨機數,所以加上了10;注意括號的位置; ? import java.util.Random; public class RandomTest { ?????????????????????????????? public static void main (String[] args) ?????????????????????????????? { ?????????????????????????????? Random r = new Random ();????????? ?????????????????????????????? for (int i = 0 ; i < 50; i++ ) ?????????????????????????????? System.out.println (r.nextInt(41)+10); ?????????????????????????????? } } 看一下另一種方法 //隨機生成數字,在java.lang包下也有一個類 Math.random() 方法,功能是返回一個double型隨機數字 //方法原型為 public static double random (); //數字的范圍介于 0.0 ——1.0 之間,當然左等右不等,例如上例,仍然要生成介于10 -50間數字,而且是整數,則要涉及到幾個步驟 //第一,將范圍增加到目的。二是要強制類型轉換 ? public class RandomTest { ?????????????????????????????? public static void main (String[] args) ?????????????????????????????? { ?????????????????????????????? for (int i = 0; i < 50; i++) ?????????????????????????????? System.out.println (Math.random()); ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? for (int i = 0; i < 50; i++) ?????????????????????????????? { ?????????????????????????????? double a;//要注意定義a的類型; ?????????????????????????????? a = Math.random (); ?????????????????????????????? a *= 41; ?????????????????????????????? int a2 = (int) a ; ?????????????????????????????? a2 += 10; ?????????????????????????????? System.out.println(a2); ?????????????????????????????? } ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? } ?????????????????????????????? ?????????????????????????????? ?????????????????????????????? } 65. 來看一道題?
隨機生成50個數字(整數),每個數字的范圍是[10, 50],統計每個數字出現的次數以及出現次數最多的數字與它的個數,最后將每個數字及其出現次數打印出來,如果某個數字出現次數為0,則不要打印它。打印時按照數字的升序排列。
? import java.util.Random; public class Test { ?????????????? public static void main (String[] args) ?????????????? { ????????????????????????????????????????????? Random random? = new Random (); ????????????????????????????????????????????? int[] count = new int[41]; ????????????????????????????????????????????? for (int i = 0 ;? i < 50; i++) ????????????????????????????????????????????? { ???????????????????????????????????????????????????????????? int num = random.nextInt (41) + 10; ???????????????????????????????????????????????????????????? System.out.println(num); ???????????????????????????????????????????????????????????? count[num - 10] ++; ????????????????????????????????????????????? } ????????????????????????????????????????????? for (int j = 10 ;j< 51; j++) ????????????????????????????????????????????? { ???????????????????????????????????????????????????????????? if (count[j - 10] ==0)//如果個數為零的話不打印; ???????????????????????????????????????????????????????????? continue; ???????????????????????????????????????????????????????????? System.out.print(j+"共有"); ???????????????????????????????????????????????????????????? System.out.println(count[j-10] +"個"); ????????????????????????????????????????????? } ????????????????????????????????????????????? ?????????????? } }總結