本帖最后由 郑飞 于 2014-10-24 06:56 编辑
这两天会陆续发一些比较重要的章节总结笔记,为面试做准备;(多线程,集合,集合工具;;;(3楼泛型,线程池(高新2))
因为主要是为自己准备的,所以有些烂透的东西,不做记录,语言尽量简洁;
很多地方都是个人的理解,不是视频中或别人笔记中copy,包括用词习惯等等;
总之个性的东西,只能说仅供参考,欢迎意见和纠错,照顾不到所有人胃口难免的;
---------------------------------------------------->
多线程总结
进程:应用程序 线程:控制单元 例子:多线程(服务器300K,A单线程,B双线程,300/(1+2)=100,A100K,B200K);
存在理由:切换(软件),快速执行(硬件),实现同时运行的效果;
区别:其实就是应用程序和控制单元的区别,进程独立空间,线程栈独立,堆共享;
创建:1.继承Thread重写run 2:传入Runnable子类重写run 区别:Runnable操作的数据是传入子类中的 Thread子类操作数据是本身,前者更适用于共享数据的操作;
状态:
1.创建new
2:运行start()
3:冻结wait()sleep();
4:消亡 run运行结束 当处于冻结无法控制停止时 使用Interrupt清除冻结 恢复到阻塞 然后控制停止
5:阻塞 被切换 清醒瞬间 创建瞬间
控制:
1:上面的第3,4点,常规;
2:join 在A线程中使用B的join 效果是:A立马冻结 把本属于A的执行权给B 等B结束才恢复A的运行 注:其他线程该怎么运行还是造就;
3:守护线程 setDaemon(true) 在start之前; 效果:当非守护都消亡后,守护自动消亡(后台线程)
4:yield 让当前线程等待 注:不是进入阻塞,所以有可能刚等待的线程,有抢到资源继续执行;
安全:当数据共享操作时,要加锁,否则可能操作到其他线程操作一半的数据,出现重大问题;
解决:
1.synchronize代码块
2.synchronized方法
3.ReentrantLock类对象的显式锁,可配多个Condition对象,对锁实现选择性控制;
代码:共享数据间隔操作
<-------------------------------------------------------
类似以上这种,相当精简了,基本需要每个词自己去扩展内容,相信对某些人有用处;
--------------------------------------------------------->
集合1
*Collection:
存在理由:对象用来封装数据,集合用来存对象;同时弥补数组的不足之处;
区别:可变长度,同一容器对于不同类对象的存放,操作性强(API);
多分支:存储方式(数据结构)的不同(为了实现各分支个性存储和操作);
API:
增:add(),addAll(Collection);
删:clear();remove();removeAll(Collection);
改:retainAll(Collection)取交集;toArray();
查:iterator();contains()containsAll(Collection);isEmpty();size();
*Collection-List:(后面分支都这样表示,不做缩进,上级共性不再提了)
特点:有序(存取顺序相同),可以重复.(索引)
增:add(index);add(index,Colletion);
删:remove(index);
改:set(index,Object);subList(fromIndex,toIndex);
查:get(index);indexOf(Object);lastIndextOf();firstIndextOf();
listIterator();除Iterator中有的remove()外,增加了add(),set();和倒序迭代hasPrevious(),previous();previousIndex();
*ArrayList:数组,不同步,改查快增删慢;长度默认10,50%增长;
*LinkedList:链表,不同步,增删快,改查慢;
特点:添addFirst();取getFirst();取删removeFirst()可控存取顺序
先进后出:(像日常生活中的瓶子);
后进先出:(像日常生活中的管子);
模拟堆栈或队列数据结构:新建类,构造对象时new个LinkedList,用其LinkedList的存取方法重新写自己的存入取出方法
get和remove会抛出NoSuchElementException;
1.6后pullFirst替removeFirst,peekFirst替getFirst;offerFirst替addFirst(不抛异常,返回布尔值)
*Vector:数组结构,同步,增删改查都很慢;长度默认10,100%增长;
特点:1.0的时候枚举迭代方式(其他方式一样可以用)
for(Enumeration e = v.elements();e.hasMoreElements();)
System.out.println(e.nextElement());
这种方法现在只用在properties中
Vector1.0出现的,集合框架1.2出现的
Collections有方法可以得到线程安全的ArrayList对象;所以即使Vector同步,由于效率低照样被取代了;
static List synchronizedList(List list) 返回同步list。
*Collection-Set:
特点:无序(存入取出顺序不同),不可重复.(无索引),功能和Collection是一致的;
Set判断相等用equals,而不是==。返回true,Set集合是不会接受第二个对象。
*HashSet:HashTable数据结构; 不同步;允许null;
特点:判断相等先hashCode,再equals(hashCode可以做到完全不一样,为什么还重写equals,感兴趣的可以关注下)
注:hash算法的功能:主要提高检索速度(大概意思张老师提过);
应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。
*TreeSet有序存放:二叉树;对存入元素排序;(所以存入之前必须可以比较)
1.实现Comparable接口重写compareTo方法;
2.构造TreeSet的时候传入一个比较器自定义比较器(实现Comparator接口);
3.两种都存在的时候,以比较器为主;
注:也可以实现堆栈和队列效果,控制compareTo的结果;
Comparator comparator():返回当前Set使用的Comparator,若返回null,表示以自然顺序排序。
first() 返回第一个元素。 last() 返回最后一个元素。
有部分API相关到其父接口 SortedSet,可以看看;
<---------------------------------------------------------------
---------------------------------------------------------------->
集合2
*Map
特点:
键值对,key不重复,对应唯一的value(注:value能重复,但1key只对1value)
Map里的key集存储方式和对应的Set集合中的元素存储方式一致
Map.Entry内部接口,保存key-value;
共性方法:(基本字面就能理解,记不住就是用少了.)
clear();containsKey(Object key);containsValue(Object value);isEmpty();entrySet();keySet();
put();返回被覆盖的value;putAll(Map m);remove(Object key);size();Collection values():
*Map.Entry
Entry是Map接口里面的一个内部接口.
该接口用于封装key- value,有3个方法:getKey();getValue();setValue(Object value)返回旧value;
迭代:(注:嵌套泛型归到泛型)
1.entrySet(),取出entry集,然后遍历,同时取出key和value;
2.keySet(),取出key集,遍历,同时取出value
*HashTable:哈希表,键值对非空,同步;
*HashMap:哈希表,与HashTable的区别:允许空键值对,非同步;
*TreeMap:二叉树,非同步,可对键排序;
<----------------------------------------------------------
---------------------------------------------------------->
集合3
*工具类
*Collections
reverse(List list):反转顺序;shuffle(List list):随机排序;sort(List list):自然升序排序;swap(List list,int i, int j):元素交换;
rotate(List list, int distance):[a, b, c, d, e]执行Collections.rotate(l.subList(1, 4), -1);后结果:[a, c, d, b, e](建议查API)
binarySearch(List list, Object key) 二分搜索获得指定对象,必须先调用 Collections.sort(List list)(完成自然排序);
max(Collection coll) 根据自然顺序,返回最大元素。min(Collection coll)返回最小元素。fill(List list, Object obj)用obj完全填充所有位置。
frequency(Collection c, Object o) 返回等于指定对象的元素个数。
indexOfSubList(List source, List target) 返回第一次出现的起始位置,如果没有则返回 -1。对应的last方法:lastIndexOfSubList(List source, List target)
replaceAll(List list, Object oldVal, Object newVal) 使用另一个值替换所有某一指定值。
*Arrays
List asList(Object... a)返回的是不可变的List(长度固定)。注:不能增删;这个方法和Collection.toArray()方法充当了数组与collection之间的桥梁。
例子:List<String> list= Arrays.asList("A", "B", "C");可变参数"A", "B", "C",同数组,此数组被转成固定长度的list;
其他方法都是对基本类型数组转成list后的常规操作方法,看API;
<---------------------------------------------------------- |