在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。这个新特性是在编译器这个层次上实现的。而在Java虚拟机和字节码这个层次上还是只支持在switch语句中使用与整数类型兼容的类型。这么做的目的就是为了减少这个特性所影响的范围,以降低实现的代价。
clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递(说法不准确,java都是值传递),我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。
getClass方法
final方法,获得运行时类型。
toString方法
该方法用得比较多,一般子类都有覆盖。
finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
hashCode方法
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。一般必须满足obj1.equals(obj2)==true。可以推出obj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
notify方法
该方法唤醒在该对象上等待的某个线程。
notifyAll方法
该方法唤醒在该对象上等待的所有线程。
String 字符串常量
StringBuilder 字符串变量(非线程安全)
StringBuffer 字符串变量(线程安全)
效率问题以及锁的问题?
为什么效率高?
加锁加载了哪?
结论:
1. 不管有木有出现异常,finally块中代码都会执行;
2. 当try和catch中有return时,finally仍然会执行;
3. finally中有return,返回的值是finally中的值;finally中没有return,返回的是第一次出现return中的值。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常进行重载。
Override 特点
Overload 特点
其具体实现机制:
JDK8新特性:
* 在JDK7及以前的版本中,接口中都是抽象方法,不能定义方法体,但是从jdk8开始,接口中可以定义静态的非抽象的方法,直接使用接口名调用静态方法,但是它的实现类的类名或者实例却不可以调用接口中的静态方法。
* 也可以定义普通的非抽象的方法,普通的非抽象方法要在返回值前加上default,对于普通的非抽象方法必须使用子类的实例来调用。如果有多个接口定义了相同的默认方法,实现多个这些接口时必须重写默认方法,否则编译失败。
* jdk8的接口中,开始允许使用关键字default。
@see:http://blog.csdn.net/nvd11/article/details/42305895
【关于内存泄露】
* 内部类持有外部类的引用,或者说内部类对外部类持有隐式的引用。假如我们在内部类中做耗时的操作或者说有个while(true)死循环,即内部类的对象一直存在; 那么当这个MainActivity应该被回收时(比如屏幕的旋转)GC发现它还被其内部类的对象引用 所以就不会将其回收.假如该Activity中含有大量的资源(比如图片)那么就很容易发生OOM.
* 优化方式:使用静态的内部类,这样的内部类就不会持有外部类的隐式引用,也就不会影响到GC对于外部类的回收;使用弱引用对耗内存对象进行包装。
public class A {
void a1() {
}
class B{
void b1() {
// 可以直接访问
a1();
}
}
static class C {
void c1() {
// 不能访问
// a1();
}
}
public static void main(String[] args) {
A a = new A();
// 非静态内部类必须依附于外部类
B b = a.new B();
C c = new C();
}
}
for在遍历期间可以修改;foreach在遍历期间不可以修改。
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
什么是反射机制?
简单说,反射机制得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
java反射机制提供了什么功能?
哪里用到反射机制?
jdbc中有一行代码:Class.forName(‘com.MySQL.jdbc.Driver.class’).newInstance();那个时候只知道生成驱动对象实例,后来才知道,这就是反射,现在
很多框架都用到反射机制,hibernate,struts都是用反射机制实现的。
jdk1.7
1 对集合类的语言支持;
2 自动资源管理;
3 改进的通用实例创建类型推断;
4 数字字面量下划线支持;
5 switch中使用string;
6 二进制字面量;
7 简化可变参数方法调用;
8 新增一些取环境信息的工具方法;
9 Boolean类型反转,空指针安全,参与位运算;
10 两个char间的equals;
11 安全的加减乘除;
12 map集合支持并发请求 ,且可以写成 Map map = {name:”xxx”,age:18};
jdk1.8
接口的默认方法与静态方法
lambda表达式
Annotation 多重注解
java.util.stream支持在流上的函数式风格的值操作
总结文档在这里,比较详细~https://github.com/scsfwgy/AndroiderTechnology
cs