JUnit是一个Java语言的单元测试框架,有程序员自测,就是所谓的白盒测试,主要四个方向 1、用于测试期望结果的断言(Assertion) 2、用于共享共同测试数据的测试工具 3、用于方便的组织和运行测试的测试套件 4、图形和文本的测试运行器 StringBuffer类的对象调用toString()方法将转换为String类型 这个正确 两个类都有append()方法 String类没有append方法 可以直接将字符串“test”复制给声明的Stirng类和StringBuffer类的变量 引用类型只有String可以直接复制,其他的都要new出来 两个类的实例的值都能够被改变 StringBuffer类可以直接改变它的内容,不用重新分配地址; String 对象/ 实例 是不可以被改变的。
关于抽象类 JDK 1.8以前,抽象类的方法默认访问权限为protected JDK 1.8时,抽象类的方法默认访问权限变为default
关于接口 JDK 1.8以前,接口中的方法必须是public的 JDK 1.8时,接口中的方法可以是public的,也可以是default的 JDK 1.9时,接口中的方法可以是private的
concurrentHashMap采用分段加锁的机制来确保安全;Arrays.asList()将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!
java调试器jdb.exe
线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常
线程同步:喂,SHE 喂(Vector) S(Stack) H(hashtable) E(enumeration)
两个最基本的java回收算法:复制算法和标记清理算法 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法 标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象 两个概念:新生代和年老代 新生代:初始对象,生命周期短的 永久代:长时间存在的对象 整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。 P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法 Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理 Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法 Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理 Parallel Old(并行)收集器,针对老年代,标记整理 CMS收集器,基于标记清理 G1收集器:整体上是基于标记 整理 ,局部采用复制
综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
仍存在内存泄露
接口里的方法只能用 public 和 abstract 修饰,如果你不写也没关系,默认的也是 public abstract 修饰
object中方法: 1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 2.getClass方法 final方法,获得运行时类型。 3.toString方法 该方法用得比较多,一般子类都有覆盖。 4.finalize方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。 5.equals方法 该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。 6.hashCode方法 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。 一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。 7.wait方法 wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (1)其他线程调用了该对象的notify方法。 (2)其他线程调用了该对象的notifyAll方法。 (3)其他线程调用了interrupt中断该线程。 (4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。 8.notify方法 该方法唤醒在该对象上等待的某个线程。 9.notifyAll方法 该方法唤醒在该对象上等待的所有线程。
sleep和wait的区别有: 1,这两个方法来自不同的类分别是Thread和Object 2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法。 3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() } 4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
java中short占用2bytes,强转short类型为byte,会将多出的高8位进行截断,short类型的 128的补码:0000 0000 1000 0000,强转为byte后的补码:1000 0000,我们认识的是原码,所以需要求1000 0000的原码,再次对补码的真值位(符号位以外的)取反加一(或减一取反)即可得到原码为1111 1111+1=1100 00000,发现溢出了多出一位,计算机仍然将多出一位进行截断,保留为1000 0000,表示-0,注意,没有-0,只有0,而byte占用8bit,可以表示256个数,-127-127(对应的原码:1111 1111-- 0111 1111)都能表示出来,则共表示255个数,还差一个,所以为了充分利用资源,就将原来本应该表示“-0”的原码规定为代表-128,故结果为-128,有符号的byte类型也就能够表示的范围是-128-127.
TestSuper和Date的getClass都没有重写,他们都是调用Object的getClass,而Object的getClass作用是返回的是运行时的类的名字。这个运行时的类就是当前类,所以 super.getClass().getName() 返回的是test.SuperTest,与Date类无关 要返回Date类的名字需要写super.getClass().getSuperclass()
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成: (1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。 (2) 箭头(→)。必须通过英文中画线和大于符号组成。 (3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。