1.String为什么是不可变的
(1) 为了安全,String是几乎每个地方都会用到的类,通常一些URL,文件路径path都需要String参数,如果是可变的就会给别人随意篡改String的机会从而影响程序的安全性
(2)为了效率,java维护了一个字符串池,这样在大量使用字符串的情况下可以节省内存空间,提高运行效率
(3)允许缓存hash码
2.&和&&的区别
(1)&不短路
(2)&操作符两边表达式不是boolean类型的话表示按位与
3.final修饰变量
(1)修饰基本类型表示变量的值不可变,即不可使用”=”重新赋值
(2)修饰引用数据类型表示引用地址不可变,不是引用对应的内容不可变
4.创建对象时的加载顺序
(1)加载要创建的类及其父类
(2)加载类时会初始化当前类的静态成员变量及静态代码块,加载顺序按代码顺序
(3)加载完所需类开始创建对象,初始化非静态成员变量执行非静态语句块,加载顺序按代码顺序
(4)执行构造器
1初始化父类静态成员变量
2执行父类静态代码块
3初始化子类静态成员变量
4执行子类静态代码块
5初始化父类非静态成员变量
6执行父类非静态语句块
7执行父类构造器
8初始化子类非静态成员变量
9执行子类非静态语句块
10执行子类构造器
5.遇到的难题
(1)list排序本地执行结果和服务器上不一致,重新写了个冒泡排序
(2)多线程识别用户喜好标签,不可添加重复标签,但是多线程导致添加了重复标签,去掉了多线程
(3)微信支付对接
6.Integer自动装箱问题
如果整型字面值在-128到127之间不会new新的Integer对象而是直接引用常量池中的Integer对象
7.序列化接口id的作用
由于java程序序列化到持久设备上之后与类结构就没有关系,通过序列化id来识别版本,如果在程序运行中类结构发生了变化,序列化id也就会发生变化,当反序列化的时候会去对比序列化id,如果id相同就反序列化,如果不同就抛出异常
8.ArrayList
初始容量 10
扩容方案 n*3/2+1
线程不安全 多线程替代品 Vector
遍历方法 for 迭代器 转换成数组
9.Set
无序 不重复 最多允许一个null值
需要注意的是:虽然Set中元素没有顺序,但是元素在set中的位置是有由该元素的HashCode决定的,其具体位置其实是固定的。
set去重用到hashcode和equals方法
10.HashSet
底层基于HashMap实现 hashmap的key不允许重复 这个key就是hashset中的值 value做成一个固定值Object
遍历方法 for 转换成数组 迭代器
11.LinkedHashSet
是HashSet的子接口 底层基于 LinkedHashMap实现
与HashSet的主要区别是在哈希算法的基础上添加了链式表的结构
12.Map
map不直接集成Conllection
遍历方法:
(1) 使用keySet遍历,while循环;
(2)使用entrySet遍历,while循环;
(3) 使用for循环遍历。
13.HashMap
无论什么情况HashMap中哈希表的容量总是2的n次方的一个数
存取速度快
http://blog.csdn.net/luanlouis/article/details/41576373
14.LinkedHashMap
LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。
15.HashMap与HashTable的区别
(1) Hashtable是基于陈旧的Dictionary实现的,而HashMap是基于Java1.2引进的Map接口实现的;
(2)Hashtable是线程安全的,而HashMap是非线程安全的,我们可以使用外部同步的方法解决这个问题。
(3)HashMap可以允许你在列表中放一个key值为null的元素,并且可以有任意多value为null,而Hashtable不允许键或者值为null。
16.WeakHashMap
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
17.Object
接口不继承Object类
所有方法:
- protected Object clone()
- boolean equals(Object obj)
- protected void finalize()
- Class< > getClass()
- int hashCode()
- void notify()
- void notifyAll()
- String toString()
- void wait()
- void wait(long timeout)
- void wait(long timeout, int nanos)
clone():
产生一个相同的类返回给调用者
clone()是一个本地方法,调用对象必须实现cloneable接口
在当前类的方法中克隆不需要覆盖clone()方法,在别的类中克隆就需要覆盖
浅克隆:
仅仅复制了这个对象本身的成员变量,如果当前引用类型的成员发生了改变克隆出来的对象的该对象也会改变,如果一个对象中的所有成员变量都是原始类型,并且其引用了的对象都是不可改变的(大多情况下都是)时,使用浅克隆效果很好。
深克隆:
当前对象的引用类型成员发生改变不影响克隆出来的对象的这个成员变量,要进行深克隆的话这个引用类型的成员变量必须覆盖clone()方法方法体中new一个新的对象返回。
数组克隆:
直接数组调用clone()方法即可,不必实现cloneable接口
equals():
自反性,一致性,传递性,对称性,对于任何非空引用x x.equals(null)返回false
instanceOf判断类型在子类与父类的比较中会有问题
deepEquals()来比较2个数组
finalize():
一般情况下不使用这个方法,因为这个方法优先级较低如果依靠这个方法去关闭一些资源会出现意外情况。
该方法抛出异常将会被忽略,而且,对象的终结将在此停止,导致对象处在一种不确定的状态。
hashcode():
在覆盖equals()方法时同时覆盖hashcode()以保证对象兼容hash集合
18.native
native修饰方法表示该方法不由java语言实现,native方法不提供实现体,native可以与任意关键字连用但不包括abstract
19.堆、栈、方法区的区别
堆:存对象,所有线程共享
栈:存对象引用、字面量,一个线程一个栈不共享
方法区:又叫静态区,所有线程共享,存全局唯一资源
20.创建对象的几种方式
(1)new
(2)Class.newInstance
(3)Constructor.newInstance
(4)clone
(5)反序列化
21.spring
https://my.oschina.net/liughDevelop/blog/1434547