JAVA基础篇
2020-06-19 10:51:08 0 举报
Java多线程、常用类、集合、IO总结
作者其他创作
大纲/内容
集合数组的异同
HashTableMap的古老实现类,线程安全,效率低,不可以存贮null的key或value值
多线程常用方法
死亡TERMINATED
线程池
栈
缓冲流(处理流的一种)
静态同步方法,监视器是this;非静态方法,监视器是:当前类本身
存储无序,不可重复的数据
集合
jdk7
按操作数据单位分:字节流(8bit)、字符流(16bit)按操作数据的流向:输入流、输出流按流的角色分:节点流、处理流
文件流(节点流)
集合框架
存储有序,可重复的数据(动态数组)
执行完run()方法stop()、出现异常没有处理
IO流
JAVA常用类
实例化File的方法
StringBuffer:可变的字符序列,线程安全(方法大部分是synchronized),效率偏低;底层结构使用char[]存储数据;new 一个StringBuffer()默认底层长度为16,append字符串,如果底层数据长度不够,就需要扩容,默认情况下扩为原来容量的2倍+2,如果还不够,直接扩为新的字符串的长度,同时将原来的字符串复制到新的数组中
StringBuilder:可变的字符序列,线程不安全的,效率高;底层结构使用char[]存储数据;
LinkedHashMap在遍历的时候保证按照添加元素的顺序遍历,在HashMap的基础上添加了一对指针,分别指向前一个和后一个元素,对于需要频繁遍历的数据,效率高于HashMap
add(E e):添加单个元素。addAll(Collection<? extends E> c):将一个集合中的所有元素添加到另一个集合中。clear():清空集合中的所有元素。contains(Object o);判断集合中是否包含某个元素containsAll(Collection<?> c);判断一个集合中是否包含另一个集合中的所有元素。equals(Object o);判断两个集合是否相等;只有两个集合中每一个位置的元素都相等,才会返回true。hashCode():得到集合的哈希码。isEmpty():判断集合是否为空。iterator():迭代,遍历全部元素。remove(Object o):从集合中移除一个元素,如果有多个相同的元素,也只会移除最前面的一个元素。remove(int index):从集合中移除下标为index的元素。removeAll(Collection<?> c):从集合中移除另一个集合中所包含的元素,即移除两个元素的交集。size():获取集合中元素的个数。toArray():将集合转为Object数组。toArray(T[] a):将集合转为指定类型的数组,数组类型必须与集合类型一致。retainAll(Collection<?> c):只保留该集合包含在指定集合中的元素removeIf(Predicate<? super E> filter):stream():parallelStream():spliterator():
同步方法,操作同步代码是只有一个线程参与,其它线程等待,相当于一个单线程过程,效率低
Collections(操作Collection、Map的工具类)
1、statrt()2、currentThread()3、getName()4、setName()5、yeild()6、stop()\"该方法已过期\"7、join()8、run()9、setPriority()
HashMapMap的主要实现类,线程不安全的,效率高,可以存贮null的key或value值
synchronized在执行完同步代码后自动释放同步锁;lock需要手动启动(lock()),同时结束同步也需要手动实现(unLock())
TreeSet使用红黑树存储数据,放入的数据必须是同一个类new的对象,可以按照添加的对象指定的属性排序
ListIterator
就绪
Map中的方法
新建NEW
new LinkedList(),内部声明了一个Node类型的first、last属性,默认值为null,Node定义为:
String常用方法
ArrayList
对象流(处理流的一种)
BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
List接口
Collection接口
双列集合,用来存储一对一对的对象(key-value);key:无序,不可重复,使用Set存储,key所在类需要重写equals()、hashCode()方法;value:有序,可重复,使用Colletction存储,value所在类需要重写equals();key-value构成Entry对象:无序,不可重复,使用Set存储。
jdk8
s2
多线程的生命周期
String:不可变(String类被final修饰)的字符序列;底层结构使用char[]存储数据;
堆
解决线程安全(有共享数据)
String、StringBuffer、StringBuilder
解决方法
多线程的实现方法
String的特性
抽象基类
运行
同步代码块synchronized锁必须是同一把
lock锁:需要同一个锁再进行加锁解锁操作
List接口中的方法
实现Runable
new ArrayList(),底层创建了一个长度为0的Object[]数组elementData,首次add()会创建一个长度为10的数组,后续添加、扩容和jdk7一样。
sleep()join()等待同步锁wait()suspend()(可能会导致死锁)
String实例化方式方式一:通过字面量定义的方式: String s1 = \"abc\"; String s2 = \"abc\";方式二:通过new+构造器方式: String s3 = new String(\"abc\"); String s4 = s1+\"def\
单列集合,用来存储一个一个的对象
LinkedList源码分析
StringBuilder
向HashSet中添加元素a,首先调用元素所在类的hashCode()方法计算元素哈希值,接着计算这类元素在HashSet中的存放位置(索引位置),然后判断该位置上是否有元素存在,如果该位置上没有其它元素则将该元素放到该位置上,如果有其它元素,则比较该元素和其它元素的哈希值,如果不同则将该元素放入,如果哈希值相同,则调用eqauls()方法如果全部返回false,则将该元素放入该位置。对于存放在set容器中的对象,其类一定要重新hashcOde()、equals()方法。(相等的对象必须要有相等的散列码)
死锁
1、集合数组都是对多个数据进行存储(内存存储,不涉及硬盘持久化的存储)操作的结构,简称java容器。2.1、数组的特点: >在初始化以后其长度就已经确定了; >在声明的时候需要指定其元素的类型,只能操作指定的元素类型。2.1、数组缺点: >长度不可修改; >提供的方法有限,对于添加、插入、删除数据,非常不便,同时效率不高; >没有现成的获取数组中现已添加数据的个数的方法; >存储数据的特点:有序、可重复,不能做到无序、不可重复。
不同点:1、声明的位置不同:sleep()在Thread类中声明,wait()在Object类中声明2、调用的要求不同:sleep()在任何地方都可以调用,wait()必须在同步代码块或同步方法中使用3、释放锁的方法不同:如果都使用在同步代码块或同步方法中sleep()不会释放锁,wait()会释放锁
String
List的古老实现类,线程安全的,执行效率低,底层使用Object[] elementData数组存储
abc
s1
通过一个双向链表来记录存入顺序的(适用于需要频繁遍历的数据)
wait()、notify()、notifyAll()必须在同步代码块中调用,且调用者必须是同步监视器
获取CPU执行权
调用start()
开发中优先选择实现的方式:1、实现的方式没有类的单继承的局限性(类只能单继承,但可以有多个实现);2、实现的方式更适合处理多个线程有共享数据的情况(不用将共享参数声明为静态的)
Vector
失去CPU执行权或yield()
专门的算法、原则尽量减少同步资源的定义尽量避免嵌套同步
Properties常用于处理配置文件,其key和value都是String类型
继承Thread
多线程
HashSetSet的主要实现类,线程不安全,可以存储null
FileInputStreamFileOutputStreamFileReaderFileWriter
InputStreamReaderOutputStreamWriter
1、String是一个final类创建之后不可改变,不能被继承;2、String实现了Serializable接口:支持序列化,String实现了Comparable接口:可比较大小;3、String内部定义了final char[] value用于存储字符串;4、String代表不可变的字符序列,即不可变性,体现:5、通过字面量的方式给字符串赋值(区别于new),字符串值声明在字符串常量池中;6、字符串常量池中的字符串唯一;7、对于字符串重新赋值String s1=\"abc\" s1=\"hello\
sleep()的时间到了join()对应的线程执行结束获取到同步锁notify()/notifyAll()resume()
InputStreamOutputStreamReaderWriter
响应速度提高了,提高资源的重用率,便于管理
Map接口
set接口
RUNNABLE
list的主要实现类,线程不安全的,执行效率高,底层使用Object[] elementData数组存储
枚举类
不同线程分别占用对方需要的资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了死锁;出现死锁后不会出现异常,不会提示,只是所有线程都处于阻塞状态,无法继续运行
wait()、sleep()的异同
Callable本质上就是一个多线程的执行方法类,将Callable传给通过FutrueTask通过run()调用call()方法,FutrueTask本身实现了RunnableFuture,RunnableFuture又继承了Runnable和Futrue,get()方法本身就是做一个无限循环去取返回值,有就返回,没有就继续循环。
LinkedList
注释
Iterator
String与bytes之间的转换
new ArrayList(),底层创建了一个长度为10的Object[]数组elementData,当add()的时候判断数组是否还有空位,没有则扩容,默认扩容为原来的1.5倍,如果还不够,则直接扩为添加后元素的个数,如果扩容后数组的长度大于默认的最大值则将数组直接扩容为Integer的最大值即Integer.MAX_VALUE,然后将原来数组的元素复制到新的数组中,再将要添加的元素加入进去。
ArrayList源码分析
相同点:执行后线程都可以使当前线程进入阻塞状态
LinkedHashSet作为HashSet的子类,遍历内部数据时可以按照添加的顺序遍历。
s3
StringBuffer
底层使用双向链表存储数据,对于频繁的插入、删除操作,效率比ArrayList高。
TreeMap遍历的时候保证按照添加元素的顺序遍历,考虑key的自然排序或定制排序,底层使用红黑树。
Collection中的方法
方法区(字符串常量池)
转换流(处理流的一种)
Callable
底层创建了一个长度为10的Object[]数组elementData,扩容时默认扩容为原来的2倍
阻塞BLOCKEDWAITINGTIMED_WAITING
0 条评论
下一页