问题一:关于Comparable与Comparator接口:
- Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
- Comparator位于包java.util下,而Comparable位于包java.lang下
- Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
- 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
- 这里的自然顺序就是实现Comparable接口设定的排序方式。
- 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
- 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。
1 public interface Comparable{ 2 3 public int compareTo(Object o); 4 5 } 6 7 public interface Comparator{ 8 9 public int compare(T t1,T t2); 10 11 public boolean equals(Object o); 12 13 }
问题二:关于没有抽象方法的抽象类的意义
接口中定义了几个方法,那么在接下来的方法中就要将这几个方法全都实现。
但是我不想子类把所有的方法都实现,我只想用到一个,其他的我还不想去覆盖,如果只覆盖一个的话就会报错。。。。。。那么没有抽象方法的抽象类就有他存在的意义了,举个例子:
1 interface Inter 2 { void show1(); 3 void show2(); 4 void show3(); 5 void show4(); 6 7 } 8 //没有抽象方法的抽象类,可以方便的创建接口对象,去覆盖指定的功能 9 abstract class A implements Inter 10 { public void show1() { 11 } 12 public void show2() { 13 } 14 public void show3() { 15 } 16 public void show4() { 17 } 18 19 } 20 class B extends A 21 { 22 public void show1() 23 { 24 System.out.println("111111111111"); 25 26 } 27 } 28 public class Test5 29 { 30 public static void main(String[] args) { 31 B b = new B(); 32 b.show1(); 33 34 } 35 }
问题三:static/final写的前后顺序无影响
问题四:接口中能有静态方法么?
Java8引入了一种新特性,为了使接口具有更大的灵活性,将接口静态方法来一个默认实现,当然子类可以重写,也可以不重写。如下:
public interface Service{ public static int testMethod(int i){ return i; } }
则这种情况是允许的,在实现类中可以进行覆盖testMethod(int i),也可以不进行覆盖
问题五:valueOf与parseInt区别
- valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
- parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析,返回int类型。
1 //先调用parseInt获得int值,然后封装成Integer对象,注意封装的逻辑,有缓存 2 public static Integer valueOf(String s) throws NumberFormatException { 3 return Integer.valueOf(parseInt(s, 10)); 4 } 5 6 public static Integer valueOf(int i) { 7 assert IntegerCache.high >= 127; 8 if (i >= IntegerCache.low && i <= IntegerCache.high) 9 return IntegerCache.cache[i + (-IntegerCache.low)]; 10 return new Integer(i); 11 } 12 //直接转换,获得int值 13 public static int parseInt(String s) throws NumberFormatException { 14 return parseInt(s,10); 15 }
valueOf
内部就用了parseInt
,区别在于parseInt
直接返回原始int
类型数据;而valueOf
又装了下箱,返回Integer
类型。
还有一个区别,parseInt
期待输入是String
,而valueOf
不是。
注意:一般用Integer.parseInt(str),除非你要返回Integer类型,不然还有封装拆箱,性能多少会耗费些。