31.同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作。最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier 和Exchanger
32.异常处理语法结构中只有try块是必须的,但不能只有try块,1.7中的增强try除外 因为其中的try()已经隐含了finally了
33.synchronized很强大,既可以保证可见性,又可以保证原子性,而volatile不能保证原子性!
34.子类不可以继承父类的构造方法,只可以调用父类的构造方法。
35.一个算法通常由两种基本要素组成:一是(对数据对象的运算和操作),二是(算法的控制结构)
36.串的朴素模式匹配算法:最坏时间算法也就是每次都匹配到字串的最后一位,匹配次数为m;且匹配到主串的尾部,匹配次数为n-m+1.所以结果是m*(n-m+1)
观察者模式:对象间存在一对多关系,如果一个对象被修改时,会自动通知它的依赖对象。
建造者模式:使用对各简单的对象一步一步构建出一个复杂对象
代理模式:指一个类别可以作为其他东西的接口
策略模式:将每一个算法封装起来,使得每个算法可以相互替代,使得算法本身和使用算法的客户端分割开来相互独立
redis一共包含5种数据类型
①字符串 String (最基本的类型,可包含任意数据)
②哈希 Hash (String类型的field、value映射表)
③列表 List (字符串列表,有序不唯一)
④集合 set (字符串集合,无序唯一)
⑤集合排序 zset (字符串集合,可以通过设置分数score进行排序)
39.Redis Cluster在设计中没有使用一致性哈希(Consistency Hashing),而是使用数据分片引入哈希槽(hash slot)来实现
40.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
41.Integer类型在-128–>127范围之间是被缓存了的,也就是每个对象的内存地址是相同的,赋值就直接从缓存中取,不会有新的对象产生,而大于这个范围,将会重新创建一个Integer对象,也就是new一个对象出来,当然地址就不同了,也就!=;
42.String split 这个方法默认返回一个数组, 如果没有找到分隔符,会把整个字符串当成一个长度为1的字符串数组
43.ThreadLocalMap中使用开放地址法来处理散列冲突,而HashMap中使用的是分离链表法。之所以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。
44.CountDownLatch 是等待一组线程执行完,才执行后面的代码。此时这组线程已经执行完。
CyclicBarrier 是等待一组线程至某个状态后再同时全部继续执行线程。此时这组线程还未执行完。
A、在方法中,修改一个基础类型的参数永远不会影响原始参数值。
B、在方法中,改变一个对象参数的引用永远不会影响到原始引用。然而,它会在堆中创建了一个全新的对象。(译者注:指的是包装类和immutable对象)
C、在方法中,修改一个对象的属性会影响原始对象参数。
D、在方法中,修改集合和Maps会影响原始集合参数。
46.call by value 值传递,方法只是得到一个复制出来的值,原来的参数不会被这个方法改变;
call by reference 引用传递,传递的是参数的地址,方法能改变实际参数。
47.对字符串进行sizeof 操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen 操作求字符 串的长度的时候,不计算\0 的。
sizeof§:计算的是指针的长度,32位机器上为4B
48.cin 表示标准输入的istream对象
49.集合类型
50.有符号整数的范围是负数取最大值,正数为最大值减1.
51.list有序可重复,set无序不可重复
52.Nmap是Linux下的网络扫描和嗅探工具包。
Fiddler是位于客户端和服务器端之间的***,也是目前最常用的抓包工具之一 。
Burpsuite是用于攻击web应用程序的集成平台。
Map属于接口类型,不可以new的方式创建对象。
SortedMap属于接口类型,不可以new的方式创建对象。
HashMap基于哈希表实现Map接口的类,并允许null的值和null键。
TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。
若运算结果的双符号位为00, 表示结果为正数,无溢出;
若运算结果的双符号位为11,表示结果为负数,无溢出;
若运算结果的双符号位为10,表示负溢出。
若运算结果的双符号位为01,表示正溢出。
run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用。
而start()的作用是启动相应的线程。启动一个线程实际是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远也不会运行。
56.参数类型是void, 所以先要进行指针转换:(unsigned int *)然后再取值。
57.a++是右值,不能再进行左值运算
String, StringBuffer,StringBuilder的区别
1.可变与不可变
string对象是不可变的。StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 , 它只能通过构造函数来建立, 如: StringBuffer sb = new StringBuffer();
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量, 显然线程安全 。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是 线程安全的 。
StringBuilder并没有对方法进行加同步锁,所以是 非线程安全的 。
3.StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder( 抽象类 )。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
效率比较String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”时,String效率最高。
finally块正常情况下一定会被执行。但是有至少两个极端情况
如果对应的ty块没有执行,则这个try块的 finally块并不会被执行
如果在try块中jvm关机,例如 system.exit(n),则 finally块也不会执行(都拔电源了,怎么执行)
finally中如果有 return语句,则会覆盖try或者 catch中的 retur语句,导致二者无法 return,所以强
烈建议fnll中不要存在 return关键字
finalize是 Object类的 protected方法,子类可以覆盖该方法以实现资源清理工作。
GC在回收对象之前都会调用该方法
finalized方法是存在很多问题的
java语言规范并不保证 finalize方法会被及时地执行,更根本不会保证它们一定会被执行
finalized方法可能带来性能问题,因为VM通常在单独的低优先级线程中完成 finalize的执行
finalized方法中,可将待回收对象赋值给 GC Roots可达的对象引用,从而达到对象再生的目的
finalize方法最多由GC执行一次(但可以手动调用对象的 finalize方法)