string、stringbuffer、StringBuilder的区别:
- string赋值变化后是个新的对象,stringbuffer赋值变化后还是原来的对象
- string是不可变对象,String、Integer及其它包装类.不可变对象最大的好处是线程安全.。
- string、stringbuffer都是线程安全,StringBuilder是线程不安全的。
为什么是线程不安全:count += len;
不是一个原子操作。假设count
的值是10
,len
的值为1
,两个线程同时执行到了第七行,拿到的值都是10
,执行完加法运算后将结果赋值给count
,所以两个线程最终得到的结果都是11
,而不是12
,这就是最终结果小于我们预期结果的原因。- StringBuffer sb = new StringBuffer(“abc”);
- sb.append(“123”);
- String user = “test”;
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append("a");
多态:
- Animal cat = new Cat(); //创建Cat对象
- Animal dog = new Dog(); //创建Dog对象
重载(Overload):同一个类里,两个方法的名称相同,但参数不同
- public void test(int a){}
- public String test(int a,String s){}
重写(Override):基类的成员方法只能被它的派生类重写
创建对象的方式:
- new
- 反射机制
- clone机制:浅拷贝,深拷贝
- 序列化机制:Externalizable或者Serializable
JDK 1.7之后switch开始支持String类型(之前支持byte,short,char,int,Enum).但到目前为止,switch都不支持long类型。
==
和eqauls()
的区别:
- ==:运算符,比较变量的值,比较对象的地址
eqauls():
Object类的方法,比较对象的地址,
比较结果取决于equals()
具体实现- 如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值;
- 如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的.)
- 在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.当hash冲突产生时,一般有以下几种方式来处理:
- 拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.
- 开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
- 再哈希:又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个….等哈希函数计算地址,直到无冲突.
32 位和64位 的Java 虚拟机中,int 类型的长度都是占4字节.。
int是基本类型,直接存数值;而integer是对象;用一个引用指向这个对象.由于Integer是一个对象,在JVM中对象需要一定的数据结构进行描述,相比int而言,其占用的内存更大一些.
3*0.1==
0.3返回false
a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换
- short s1= 1;
- s1 += 1 (不报错)
- s1 = s1 + 1 (报错)
wait()与sleep()的区别:
- sleep()来自Thread类,和wait()来自Object类.调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
- sleep()睡眠后不出让系统资源,wait让其他线程可以占用CPU
- sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒.而wait()需要配合notify()或者notifyAll()使用
synchronized和ReentrantLock的区别
- synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,