1-java刷题记录(2)

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. 集合
  1. List 是一个有序集合,可以存放重复的数据 (有序:存进是什么顺序,取出时还是什么顺序)
    • (1).ArrayList 底层是数组适合查询,不适合增删元素。
    • (2).LinkedList 底层是双向链表适合增删元素,不适合查询操作。
    • (3).Vector 底层和ArrayList相同,但是Vector是线程安全的,效率较低很少使用
  2. Set 是一个无序集合,不允许放重复的数据 (无序不可重复,存进和取出的顺序不一样)
    • (1).HashSet 底层是哈希表/散列表
    • (2).TreeSet 继承sartedSet接口(无序不可重复,但存进去的元素可以按照元素的大小自动排序)
  3. Map 是一个无序集合,以键值对的方式存放数据,键对象不允许重复,值对象可以重复。
    • (1).HashMap实现不同步,线程不安全。 HashTable线程安全
    • (2).HashMap中的key-value都是存储在Entry中的。
    • (3).HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
  4. Hashtable和HashMap的区别
    1. 继承不同。
      public class Hashtable extends Dictionary implements Map
      public class HashMap extends AbstractMap implements Map
    2. Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
    3. Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap中是否存在某个键, 而应该用 containsKey() 方法来判断。
    4. 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式。
    5. 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
    6. 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, 609610, 612] [608, 609610]

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的所有类。

加载顺序:

  1. Bootstrap CLassloder
  2. Extention ClassLoader
  3. 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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值