静态类和静态方法
如果一个类被声明为静态的,那么只有一种情况,即静态内部类。
静态内部类实际上与普通类(即类名必须与文件名相同的顶级类)相同,但静态内部类是在特定类的内部定义的。因为它们是类,所以如果要使用它们,就必须对它们进行实例化。从概念上讲,它不同于静态变量和静态方法。不要被“静态”这个词混淆(不要认为任何静态的东西都可以不通过实例化直接使用,静态的内部类是不同的),只有静态的内部类,但是没有静态类的概念(顶级类)。
例如。
public class Singleton{
private Singleton{
}
private static class SingletonHolder{
private final static Singleton instance;
} public Singleton getInstance{
return SingletonHolder.instance;
}
}
静态方法只能访问静态成员,实例方法可以访问静态成员和实例成员。不允许静态方法访问实例成员变量的原因是实例成员变量属于对象,而静态方法在执行时不一定具有对象。关键字this不能在静态方法中使用。
倒排索引
倒排索引
如果转换成一个转置的索引可能更好地理解,它将相当于做矩阵转置。
倒排索引是一种索引方法,用于存储全文搜索下文档或文档组中单词存储位置的映射。
反射
反射API中提供的动态代理也是一个非常强大的函数,可以在AOP中本地实现方法拦截函数。正如英语单词反射所暗示的,使用反射API就像在水中查看Java类的反射。一旦知道Java类的内部结构,就可以与它进行交互,包括在对象中创建新对象和调用方法。
这种交互与直接在源代码中使用它有相同的效果,但还提供了运行时灵活性。使用反射的最大缺点之一是性能差。对于同一个操作,使用反射API比直接使用它所花费的时间要少一到两个数量级。然而,在当前的JVM实现中,反射操作的性能得到了很大的提高。
Java反射API的第一个主要作用是在运行时捕获程序的内部结构。
多路归并算法
合并排序也是一种使用分而治之方法的有效排序算法。它是由现代计算机的创始人约翰·冯·诺依曼于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): length = len(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[rcur] result.append(min(lone, rone)) if lone < rone: lcur += 1 else: rcur += 1 result += left[lcur:] result += right[rcur:] return result
枚举类型
枚举类型
枚举类型不支持构造公共修饰符和受保护修饰符,因此构造函数必须是私有的或友好的。因此,不能通过直接调用枚举对象的构造函数在程序中初始化枚举对象。
由于枚举类型值实际上由运行时构造的对象表示,因此每个虚拟机在集群环境中构造一个同义的枚举对象。因此,重要的是要注意,如果直接使用等号(“==”)运算符,则这些看似相同的枚举值不能相同,因为这不是同一对象实例。
多线程
在Java中实现多线程的方法有两种:继承线程类和实现可运行接口。只要在程序开发中使用多线程,可运行接口将始终是主要的,因为与继承线程类相比,实现可运行接口有以下优点:
1。它可以避免Java的单继承特性所造成的局限性。
2。增强程序的鲁棒性,代码可以由多个线程共享,代码和数据是独立的;
三。适用于多个相同程序代码的线程处理同一资源的情况。
下面是一个通过实现可运行接口实现的多线程程序。代码如下:
class MyThread implements 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;
}
}
网友评论