// 创建一个数组,包含[0...N)的所有元素 Integer[] arr = new Integer[N]; for(int i = 0 ; i < N ; i ++) arr[i] = new Integer(i);
// 打乱数组顺序 for(int i = 0 ; i < N ; i ++){ int pos = (int) (Math.random() * (i+1)); Integer t = arr[pos]; arr[pos] = arr[i]; arr[i] = t; } // 我们测试用的的二分搜索树的键类型为Integer,值类型为String // 键值的对应关系为每个整型对应代表这个整型的字符串 BST<Integer,String> bst = new BST<Integer,String>(); for(int i = 0 ; i < N ; i ++) bst.insert(new Integer(arr[i]), Integer.toString(arr[i]));
// 对[0...2*N)的所有整型测试在二分搜索树中查找 // 若i在[0...N)之间,则能查找到整型所对应的字符串 // 若i在[N...2*N)之间,则结果为null for(int i = 0 ; i < 2*N ; i ++){ String res = bst.search(new Integer(i)); if( i < N ) assert res.equals(Integer.toString(i)); else assert res == null; } }
public void selectionSort(){ int out,in,min; int temp; for(out=0;out<nElems-1;out++){ min = out; //minimum fot(in=out+1;in<nElems;in++) //inner loop if(a[in]<a[min]) //if min greater min = in; //we have a new min temp = a[out]; a[out] = a[min]; a[min] = temp; } }
classHighArray{ privatelong[] data; //ref to array data privateint size; //number of data items publicHighArray(int max){ //constructor data = newlong[max]; //creat the array size = 0; //no items yet } publicbooleanfind(long searchKey){ //find specified value int j; for(j=0;j<nElems;j++){ //for each elements if(data[j] == searchKey) //found items? break; //exit loop before end gone to end? } if(j == size) returnfalse; //can't found it else returntrue; // found it } publicvoidinsert(long value){ //put elements into array data[size] = value; //insert it nElems ++; //increamnt size } publicbooleandelete(long value){ int j; for (j=0 ;j<size ;j++) //look for it if(value == a[j]) break; if(j == size) returnfalse; //can't find it else for(int k=j;k< size;k++) a[k] = a[k+1]; //move higher ones down size--; //decrement size returntrue; } publicvoiddisplay(){ for(int j =0;j<nElems;j++) //for each elements System.out.println(a[j]+" "); //display for it } }
add(int index,int e) 方法:把元素添加到指定位置。
1、先判断index是否越界,若越界则抛出异常。
2、如果数组元素个数与长度相等,则需要扩容。
3、通过循环,把数组中从最后一位到index位置的元素都向后挪动一位
4,再把index位置中的元素赋值成e。元素数量增加
1 2 3 4 5 6 7 8 9 10 11 12 13
publicvoidadd(int index,int e){ //先判断index是否越界 if(index < 0|| index> size) thrownew IllegalArgumentException("Add failed. Require index >= 0 and index <= size."); //如果数组元素个数与长度相等,需要扩容 if(size == data.length) resize(2*data.length); //把数组中从最后到index位置的元素都向后挪动一位,再把index位置中的元素赋值成e for(int i = size; i >= index ;i--) data[i+1] = data[i]; data[index] = e; size++; }
package test1; public class ProtectedTest { protected void say(){ System.out.println("ProtectedTest"); } }
子类A例子: 在子类中直接调用父类protected属性和方法。
1 2 3 4 5 6 7 8 9 10
package test2; import test1.ProtectedTest; public class A extends ProtectedTest { public void speak(){ say();//ok,等价于this.say(),子对象this可以调用父类方法(属性也一样) } public static void main(String[] args) { A a = new A(); a.say();//ok,子对象a可以调用父类方法 }
package test2; import test1.ProtectedTest; public class B extends ProtectedTest{ public void speak(){ say();////ok,等价于this.say(),可以调用父类方法 A a = new A(); a.say(); //此处报错,不允许a调用:The method say() from the type ProtectedTest is not visible //当父类放到其他包下面的时候,这里报错,因为say方法是protected可见性,跨包不可见,因此不可访问 a.speak(); //同样可以调用say(),但是这里是没有问题的,因为是调用的speak()方法,它不是protected方法,但是此方法在定义时调用了say() } public static void main(String[] args) { B b = new B(); b.say();//ok,子对象b可以调用父类方法 } }
public class MyDate { private int day = 8; private int month = 8; private int year = 2008; private MyDate(int day, int month, int year){...} public void print(){...} } public class TestMyDate { public static void main(String args[]) { //这个today变量就是一个引用类型的变量 MyDate today = new MyDate(23, 7, 2008); } }
int x = 7; int y = x; String s = "Hello"; String t = s;
四个变量被创建:两个基本数据类型 int 和两个引用类型String。 x的值是7,而这个值被复制到y;x和y是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。 至于变量s和t,只有一个String对象存在,它包含了文本”Hello”,s和t均引用这个单一个对象。
如果将变量t重新定义为t=”World”;则新的对象World被创建,而t引用这个对象。
3、调用方法时,按值传递和按引用传递的区别
1)按值传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
class Sample{ int num; public Sample(int num) { this.num = num; } }
public class Main { public static void main(String[] args) { Sample s = new Sample(10); modify(s.num); System.out.println(s.num); } private static void modify(int num) { //modify方法的参数类型是基本类型变量 num *=2; }
class Sample{ int num; public Sample(int num) { this.num = num; } }
public class Main { public static void main(String[] args) { Sample s = new Sample(10); modify(s); System.out.println(s.num); } private static void modify(Sample s) { //modify方法的参数类型是引用类型变量 s.num *=2; } }
classA { public int age = 0; } public class TempTest { private void test1(A a) { a.age = 20; System.out.printIn("test1方法中的age="+a.age); } public static void main(String args[]) { TempTest t = new TempTest(); A a = new A(); a.age = 10; t.test1(a);// 这里传递的参数a就是按引用传递 System.out.printIn("main方法中的age="+a.age); } }
运行结果如下:test1方法中的age = 20 main方法中的age = 20
用上面的例子来进行分析:
(1)、运行开始,“TempTest t = new TempTest();”,创建了一个A的实例,内存分配示意图如下: