1.break/continue配合标签使用
bye: for(int i=0;i<=10;i++) { for(int j=0;j<=10;j++) { System.out.println(i+" "+j); if(j==10) break bye; } }在这个代码片中当j=10时,break将会直接跳出最外层的循环,也就是整个bye标签之外。
2.数组的初始化 int型数组初始化为0 boolean型数组初始化为false 对象类型数组初始化为空
String name[]=new String[10]; String[i]=NULL;注意NULL和空串并不等价。
3.数组的拷贝
int []num = Arrays.copyOf(key,key.length);这句话将key数组的值从0到key.length-1复制到了num数组中。 注意第二个参数,这是指复制的长度,长度超过key.length则补零替代。
4.不规则数组的定义
int num[][] = new int [10][]; for(int i=0;i<9;i++) num[i] = new int[i+1];5.final 字段 final字段必须在构造对象时初始化,之后便不允许修改。 构造对象时初试化并不代表着一定要在构造函数里初试化,以下两种初始化方法都是可行的。
public final int seven = 7; Test(int s) { seven=s; }6.static变量 静态变量不被某个对象所持有,而是整个类持有,所以在某个类中static变量有所改变,那么同一个对象的其他类中也会有相同的改变.
7.JAVA没有引用传递,只有值传递。
8.方法中的局部变量必须被初始化,而类中的成员变量可以不进行初始化,这样系统会自动为其初始化。
9.局部变量遮蔽问题
public class Test { public int seven = 7; Test(int s) { int seven=s; } }注意Test()构造函数中存在一个int seven,这时候这个整型变量seven就会遮蔽住成员变量seven,这是若调用Test test = new Test(6);,那么test对象中的seven值依然为7,这就是遮蔽现象。
为了解决这种问题可以在构造函数seven前加一个this,这样seven指的就是Test变量的seven变量了。
public int seven = 7; Test(int s) { this.seven=s; }10.静态导包
import static java.lang.System.*; import static java.lang.Math.*; out.println((int)pow(2,7));//yes!12.子类的引用可以指向父类变量,但是父类变量依然无法调用子类中的方法。
Test t = new Test(); child_Test ct = new child_Test(); ct.child_method(); t = ct;//yes! t.child_method();//error!如图,child_Test是Test类的子类,父类变量t可以指向子类的引用ct,但是t依然无法调用子类中的方法child_method。
13.final类不允许继承,且将类置为final时,其中所有的方法都会变成final方法,但其中的成员变量不会。
14.关于父类强制类型的转换。 第一种不能转换的情况
Test t = new Test(); child_Test ct=(child_Test)t;//会出现ClassCastException异常,一个完全的父类不能强制转换为儿子第二种可以转换的情况
Test t = new child_Test(); child_Test ct=(child_Test)t;//yes!t本质上还是一个子类变量,可以强制转为儿子15.Abstract类不能实例化对象,但可以创建一个具体子类的对象。 这点和Interface相同
16.Protected允许本包其他类可见。注意其他包的类无法访问,其他包中的子类也无法访问。
17.参数数量可变的函数
public static double max(double...val)//关键在于这三个点 { double large = Double.NEGATIVE_INFINITY; for(double v:val) { if(v>large) large = v; } return large; } System.out.print(max(0.1,4.7,8.9,-12.5));//max中想传多少个数字都没问题18.java中对对象类型的数组的排序必须实现Comparable接口中的CompareTo方法。
public class Test implements Comparable<Test>{ public int key; Test(int key) { this.key = key; } public int compareTo(Test t) { return Integer.compare(t.key, key); } }注意是必须实现接口类中的方法,不能自己再去写一个CompareTo方法。
19.java自定义排序的两种方式 ① 待排序的对象是实现了Comparable接口的类的实例
public class Test implements Comparable<Test>{ public int key; Test(int key) { this.key = key; } public int compareTo(Test t) { return Integer.compare(t.key, key); } }② 比较器方式,比较器是一个实现了Comparator类的实例。
public class Test implements Comparator<String>{ @Override public int compare(String arg0, String arg1) { // TODO Auto-generated method stub return arg0.length()-arg1.length(); } }注意Test只是一个比较器,而不是第一种方法中包含待排对象的类。 调用时要把Test比较器传入sort函数。
public static void main(String args[]) { // TODO Auto-generated method stub String[] str = {"abc","bd","z"}; Arrays.sort(str,new Test()); for(int i=0;i<3;i++) System.out.println(str[i]); }20.关于集合的遍历器 不能在调用next()方法之前调用remove()方法,否则会出现IllegalStateException异常,每次remove的元素是上次next方法得到的元素。
Queue q = new LinkedList<Integer>(); q.add(1); q.add(2); Iterator<Integer>it = q.iterator(); while(it.hasNext()) { it.remove();//Wrong!! int n = it.next(); //it.remove(); System.out.println(n); }21.ListIterator类的listlterator方法返回了一个迭代器对象,这个迭代器可以和普通的iterator迭代器一样遍历linklist,并且还有add函数,可以在当前迭代器之前插入元素,利用这一点可以不停向linklist头部插入元素。
LinkedList<Integer> l = new LinkedList<Integer>(); l.add(1); l.add(2); l.add(3); ListIterator<Integer>iterator = l.listIterator(); iterator.add(10); iterator = l.listIterator(); while(iterator.hasNext()) { int x = iterator.next(); System.out.println(x); }22.优先队列的自定义排序
要写一个实现了Comparator接口的类,通过这个类中的compare方法控制优先队列。
public class Test implements Comparator<String>{ @Override public int compare(String arg0, String arg1) { // TODO Auto-generated method stub return arg0.length()-arg1.length();//长度短的字符串在前面 } }将这个Test类的对象放到priorityqueue中的构造函数中。
Test test = new Test(); var queue = new PriorityQueue<String>(test); queue.add("dog"); queue.add("zysdasfsdff"); queue.add("is"); while(queue.isEmpty()==false) { System.out.println(queue.poll());//poll()取头部并退队一个元素,等于peek()+remove(). }23.注意hashmap中的getOrdefault方法,用这个函数可以控制map中返回的初始值。
public static void main(String[] args) { // TODO Auto-generated method stub var map = new HashMap<String,String>(); map.put("zyf", "girl"); System.out.println(map.getOrDefault("fql", "boy")); }