51. java修饰符
52. 子类的构造函数
在子类构造方法中调用父类的构造方法,super() 必须写在子类构造方法的第一行,否则编译不通过
53. JAVA 异常类的描述
都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2. Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3. 检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4. 非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。
54. linux中tar命令用法
55. 集合
- List 是一个有序集合,可以存放重复的数据 (有序:存进是什么顺序,取出时还是什么顺序)
- (1).ArrayList 底层是数组适合查询,不适合增删元素。
- (2).LinkedList 底层是双向链表适合增删元素,不适合查询操作。
- (3).Vector 底层和ArrayList相同,但是Vector是线程安全的,效率较低很少使用
- Set 是一个无序集合,不允许放重复的数据 (无序不可重复,存进和取出的顺序不一样)
- (1).HashSet 底层是哈希表/散列表
- (2).TreeSet 继承sartedSet接口(无序不可重复,但存进去的元素可以按照元素的大小自动排序)
- Map 是一个无序集合,以键值对的方式存放数据,键对象不允许重复,值对象可以重复。
- (1).HashMap实现不同步,线程不安全。 HashTable线程安全
- (2).HashMap中的key-value都是存储在Entry中的。
- (3).HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
- Hashtable和HashMap的区别
- 继承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map - Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
- Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap中是否存在某个键, 而应该用 containsKey() 方法来判断。
- 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式。
- 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
- Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
- 继承不同。
55. 包装类自动装箱
包装类数字相关的都继承了Number
都实现了Compared接口
-
Integer默认复用了[-128,127]这些对象,其中高位置可以修改;
-
Byte复用了全部256个对象[-128,127];
-
Short服用了[-128,127]这些对象;
-
Long服用了[-128,127];
-
Character复用了[0,127],Charater不能表示负数;
-
Double和Float是连续不可数的,所以没法复用对象,也就不存在自动装箱复用陷阱。
-
Boolean没有自动装箱与拆箱,它也复用了Boolean.TRUE和Boolean.FALSE,通过 Boolean.valueOf(boolean b)返回的Blooean对象要么是TRUE,要么是FALSE,这点也要注意。
-
如果装箱的时候的数据是在可以复用的范围内,那么就不会new一个对象,而是在缓存里面直接取出来,所以==是可以比较的
-
但是如果不在可以复用的范围内,就需要new一个对象,那么==就不能比了,只有equals()比较了
56. Thread()线程
start()是开启线程,等待获得时间片,一到获得时间片就执行。所以可能一开启就获得了时间片执行,也有可能等到two输出后才获得了时间片
run()是启动线程的具体方法,要在start()方法启动线程之后才能执行
57. 并发编程的同步器
- semaphore:信号量。用于表示共享资源数量。用acquire()获取资源,用release()释放资源。
- CyclicBarrier 线程到达屏障后等待,当一组线程都到达屏障后才一起恢复执行
- CountDownLatch 初始时给定一个值,每次调用countDown值减1,当值为0时阻塞的线程恢复执行
58. 注释
/**/里面可以嵌套//,但是不能嵌套/**/
59. 权限
60. Map
HashMap,TreeMap是线程不安全的。 HashTable 和 ConcurrentHashMap 都是线程安全的。同时Collection类还提供了synchronized()方法,使得线程安全
61. String
String="123","123"放在字符串常量池,==是可以正确比较的
String=new String("123"),"123"放在新开辟的堆内存中,equals()可以比较
62. TreeSet.subSet(p1,true,p2,true)
TreeSet<Integer> set = new TreeSet<Integer>();
TreeSet<Integer> subSet = new TreeSet<Integer>();
for(int i=606;i<613;i++){
if(i%2==0){
set.add(i);
}
}
subSet = (TreeSet)set.subSet(608,true,611,true);
set.add(609);
System.out.println(set+" "+subSet);
结果:[606, 608, 609,610, 612] [608, 609,610]
TreeSet.subSet(p1,true,p2,true)会获取子Set,返回的引用是指向原来的Set的,所以subSet和set的改变都会引起另一方的改变
63. 服务端和客户端创建
服务器端:ServerSocket提供的实例 ServerSocket server = new ServerSocket(端口号)
客户端:Socket提供的实例 Socket client = new Socket(IP地址,端口号)
64. off-heap
- off-heap叫做堆外内存,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。
- 堆外内存不受垃圾收集器管理
- 老年代,新生代都在堆区,所以堆外内存也不受老年代和新生代管理。
- 只能由操作系统的进程管理,而程序是在jvm中运行,就是jvm的进程管理
65. Switch
jdk7以前:
switch支持 int及以下(char, short, byte)及其包装类,Enum
jdk7开始
Switch支持String
66. Java语言系统自带有三个类加载器:
- Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。
- Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
- Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。
加载顺序:
- Bootstrap CLassloder
- Extention ClassLoader
- AppClassLoader
67. 内部类的实例化方式
参考
public class Enclosingone {
//非静态内部类
public class InsideOne {
}
//静态内部类
public static class InsideTwo{
}
}
class Mytest02{
public static void main(String args []){
Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();