若是一个类要被声明为static的,只有一种状况,就是静态内部类。算法
静态内部类实际上与普通类(即类名必须与文件名同样的顶级类)同样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方法是不同的,不要被“静态”两个字迷惑了(不要觉得凡是静态的东西就不须要实例化就能够直接使用,静态内部类是有区别),并且只有静态内部类,而没有静态类(顶级类)的概念。数组
例子:多线程
public class Singleton{ private Singleton(){} private static class SingletonHolder{ private final static Singleton instance; } public Singleton getInstance(){ return SingletonHolder.instance; } }
静态方法只能访问静态成员,实例方法能够访问静态和实例成员。之因此不容许静态方法访问实例成员变量,是由于实例成员变量是属于某个对象的,而静态方法在执行时,并不必定存在对象。静态方法中也不能使用关键字this。app
Inverted Index函数
若是翻译成转置索引可能更好懂,它就至关于作了矩阵转置。性能
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。this
反射API中提供的动态代理也是很是强大的功能,能够原生实现AOP中 的方法拦截功能。正如英文单词reflection的含义同样,使用反射API的时候就好像在看一个Java类在水中的倒影同样。知道了Java类的内部 结构以后,就能够与它进行交互,包括建立新的对象和调用对象中的方法等。spa
这种交互方式与直接在源代码中使用的效果是相同的,可是又额外提供了运行时刻的灵活性。使用反射的一个最大的弊端是性能比较差。相同的操做,用反射API所需的时间大概比直接的使用要慢一两个数量级。不过如今的JVM实现中,反射操做的性能已经有了很大的提高。线程
Java 反射API的第一个主要做用是获取程序在运行时刻的内部结构。翻译
Enumerated Type
enum 类型不支持 public 和 protected 修饰符的构造方法,所以构造函数必定要是 private 或 friendly 的。也正由于如此,因此枚举对象是没法在程序中经过直接调用其构造方法来初始化的。
因为 enum 类型的值其实是经过运行期构造出对象来表示的,因此在 cluster 环境下,每一个虚拟机都会构造出一个同义的枚举对象。于是在作比较操做时候就须要注意,若是直接经过使用等号 ( ‘ == ’ ) 操做符,这些看似同样的枚举值必定不相等,由于这不是同一个对象实例。
Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,确定永远以实现Runnable接口为主,由于实现Runnable接口相比继承Thread类有以下优点:
一、能够避免因为Java的单继承特性而带来的局限;
二、加强程序的健壮性,代码可以被多个线程共享,代码与数据是独立的;
三、适合多个相同程序代码的线程区处理同一资源的状况。
下面是经过实现Runnable接口实现的多线程程序,代码以下:
lass MyThread implemments Runnable{ private int ticket =5; public void run(){ for(int i=0;i<10;i++){ if(ticket>0){ System.out.println("ticket="+ticket--); }}}} public class RunnableDemo{ public static void main (String[] args){ MyThread my = new MyThread(); new Thread(my).start(); new Thread(my).start(); new Thread(my).start(); }}
归并排序也是一种使用分治法来实现的有效排序算法,它是现代计算机创始人John von Neumann于1945年发明的。
归并排序在众多排序算法中既是稳定排序,又有不错的效率,同时,归并排序不只能够用于内排序,还能够用于外排序。
归并排序的思路以下(以二路归并为例):
将数组划均分为两个子数组;
对两个字数组进行排序;
将排序好的两个字数组归并。
所谓 N路归并 是指将数组均分为N个子数组,将字数组排序后再归并。所以二路归并是归并排序的最通常的状况。
例子:
def msort(array): length=len(array) if length ==1; return array else: mid=length/2 left = msort(array[0:mid) right = msort(array[mid:length]) return merge(left,right)
非递归
def msort(array) step=1 while step<length: for left in range(0,length-step,2*step): result=merge(array[left:left+step]), array[left+step:min(left+2*step,length)]) array=array[0:left]+result+array[min(left+2*step,length)] step=step*2 return array def merge(left,right): llen=len(left) lcur=0 rlen=len(right) rcur=0 result=[] while lcur<llen and rcur<rlen: lone= left[lcur] rone=right[rone] result.append{min(lone,rone)} if lone<rone: lcur+=1 else: rcur+=1 result+=lefte[lcur:] result+=right[rcur:] return result
文章转载自 乐橙谷http://www.lechenggu.com/bbs/topic/57fdb5c19c73a464f54e7574