一、集合:

1. 集合框架:

1)Collection

(1)List:有序的,有索引,元素可重复。

(add(index, element)、add(index, Collection)、remove(index)、set(index,element)、get(index)、subList(from, to)、listIterator())

①ArrayList:底层是数组结构,查询快,增删慢,不同步。

②LinkedList:底层是链表结构,增删快,查询慢,不同步。

addFist();addLast();getFirst();getLast()

removeFirst();

removeLast() 获取并删除元素,无元素将抛异常:NoSuchElementException

替代的方法(JDK1.6):

offerFirst();offerLast();

peekFirst();peekLast();无元素返回null

pollFirst();pollLast();删除并返回此元素,无元素返回null

③Vector:底层是数组结构,线程同步,被ArrayList取代了

注:Vector对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法

ArrayList判断是否存在和删除操作依赖的是equals方法

(2)Set:无序的,无索引,元素不可重复

①HashSet:底层是哈希表,线程不同步,无序、高效

保证元素唯一性:通过元素的hashCode和equals方法。若hashCode值相同,则会判断equals的结果是否为true;hashCode不同,不会调用equals方法

LinkedHashSet:有序,是HashSet的子类

②TreeSet:底层是二叉树,可对元素进行排序,默认是自然顺序,不同步

保证唯一性:根据Comparable接口的compareTo方法的返回值

===》TreeSet两种排序方式:两种方式都存在时,以比较器为主

第一种:自然排序(默认排序):

添加的对象需要实现Comparable接口,覆盖compareTo方法

第二种:比较器

添加的元素自身不具备比较性或不是想要的比较方式。将比较器作为参数传递进去(Collection.sort(集合,比较器))。

定义一个类,实现Comparator接口,覆盖compare方法。当主要条件相同时,比较次要条件。

2)Map集合:

(1)HashTable:底层数据结构是哈希表,不可存入null键和null值。同步的

Properties继承自HashTable,可保存在流中或从流中加载,是集合和IO流的结合产物

(2)HashMap:底层数据结构是哈希表;允许使用null键和null值,不同步,效率高

(3) TreeMap:

底层数据结构是二叉树,不同步,可排序

与Set很像,Set底层就是使用了Map集合

方法:

V put(K key, V value) ;  void putAll(Map m)

void clear();  V remove(Object key)

boolean containsKey(Object key);  containsValue(Object key);  isEmpty()

V get(Object key); int size(); Collection<V> values()

Set<K> keySet();  Set<Map.Entry<K,V>> entrySet()

Map集合两种取出方式:
第一种:Set<K> keySet()

取出Map集合中的所有键放于Set集合中,然后再通过键取出对应的值

Set<String> keySet = map.keySet();

Iterator<String> it = keySet.iterator();

while(it.hasNext()){

String key = it.next();

String value = map.get(key);

//…..

}

第二种:Set<Map.Entry<K,V>> entrySet()

取出Map集合中键值对的映射放于Set集合中,然后通过Map集合中的内部接口,然后通过其中的方法取出

Set<Map.Entry<String,String>> entrySet = map.entrySet();

Iterator<Map.Entry<String,String>> it = entrySet.iterator();

While(it.hasNext()){

Map.Entry<String,String> entry = it.next();

String key = entry.getKey();

String value = entry.getValue();

//……

}

Collection和Map的区别:
Collection:单列集合,一次存一个元素

Map:双列集合,一次存一对数据,两个元素(对象)存在着映射关系

集合工具类:
Collections:操作集合(一般是list集合)的工具类。方法全为静态的

sort(List list);对list集合进行排序; sort(List list, Comparator c) 按指定比较器排序

fill(List list, T obj);将集合元素替换为指定对象;

swap(List list, int I, int j)交换集合指定位置的元素

shuffle(List list); 随机对集合元素排序

reverseOrder() :返回比较器,强行逆转实现Comparable接口的对象自然顺序

reverseOrder(Comparator c):返回比较器,强行逆转指定比较器的顺序

Collection和Collections的区别:
Collections:java.util下的工具类,实现对集合的查找、排序、替换、线程安全化等操作。

Collection:是java.util下的接口,是各种单列集合的父接口,实现此接口的有List和Set集合,存储对象并对其进行操作。

3)Arrays:

用于操作数组对象的工具类,全为静态方法

asList():将数组转为list集合

好处:可通过list集合的方法操作数组中的元素:

isEmpty()、contains()、indexOf()、set()

弊端:数组长度固定,不可使用集合的增删操作。

如果数组中存储的是基本数据类型,asList会将数组整体作为一个元素存入集合

集合转为数组:Collection.toArray();

好处:限定了对集合中的元素进行增删操作,只需获取元素

二、IO流

1、结构:

字节流:InputStream,OutputStream

字符流:Reader,Writer

Reader:读取字符流的抽象类

BufferedReader:将字符存入缓冲区,再读取

LineNumberReader:带行号的字符缓冲输入流

InputStreamReader:转换流,字节流和字符流的桥梁,多在编码的地方使用

FileReader:读取字符文件的便捷类。

Writer:写入字符流的抽象类

BufferedWriter:将字符存入缓冲区,再写入

OutputStreamWriter:转换流,字节流和字符流的桥梁,多在编码的地方使用

FileWriter:写入字符文件的便捷类。

InputStream:字节输入流的所有类的超类

ByteArrayInputStream:含缓冲数组,读取内存中字节数组的数据,未涉及流

FileInputStream:从文件中获取输入字节。媒体文件

BufferedInputStream:带有缓冲区的字节输入流

DataInputStream:数据输入流,读取基本数据类型的数据

ObjectInputStream:用于读取对象的输入流

PipedInputStream:管道流,线程间通信,与PipedOutputStream配合使用

SequenceInputStream:合并流,将多个输入流逻辑串联。

OutputStream:此抽象类是表示输出字节流的所有类的超类

ByteArrayOutputStream:含缓冲数组,将数据写入内存中的字节数组,未涉及流

FileOutStream:文件输出流,将数据写入文件

BufferedOutputStream:带有缓冲区的字节输出流

PrintStream:打印流,作为输出打印

DataOutputStream:数据输出流,写入基本数据类型的数据

ObjectOutputStream:用于写入对象的输出流

PipedOutputStream:管道流,线程间通信,与PipedInputStream配合使用

2、流操作规律:

明确源和目的:

数据源:读取,InputStream和Reader

目的:写入:OutputStream和Writer

数据是否是纯文本:

是:字符流,Reader,Writer

否:字节流,InputStream,OutStream

明确数据设备:

源设备:内存、硬盘、键盘

目的设备:内存、硬盘、控制台

是否提高效率:用BufferedXXX

3、转换流:将字节转换为字符,可通过相应的编码表获得

转换流都涉及到字节流和编码表

三、多线程

进程和线程:

1)进程,是并发执行的程序在执行过程中分配和管理资源的基本单位;线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻量级进程,是 CPU 调度的一个基本单位。

线程是划分得比进程更小的执行单位,在同一个进程中的线程共享进程的内存单元,共享进程拥有的资源。

1、创建线程的方式:

创建方式一:继承Thread

1:定义一个类继承Thread

2:覆盖Thread中的run方法(将线程运行的代码放入run方法中)。

3:直接创建Thread的子类对象

4:调用start方法(内部调用了线程的任务(run方法));作用:启动线程,调用run方法

方式二:实现Runnable

1:定义类实现Runnable接口

2:覆盖Runnable接口中的run方法,将线程的任务代码封装到run中

3:通过Thread类创建线程对象

4、并将Runnable接口的子类对象作为Thread类的构造函数参数进行传递

作为参数传递的原因是让线程对象明确要运行的run方法所属的对象。

区别:

继承方式:线程代码放在Thread子类的run方法中

实现方式:线程存放在接口的子类run方法中;避免了单继承的局限性,建议使用。

2、线程状态:

Java中的线程的生命周期大体可分为5种状态。

①NEW(新建状态):这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象

②RUNNABLE(可运行状态):(这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNABLE状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。)这种情况是指线程已具备运行条件,但是还没有得到CPU调度的状态。

③RUNNING(运行状态):这时的线程指的是获得CPU的RUNNABLE线程,RUNNING状态是所有线程都希望获得的状态。

④BLOCKED:这种状态指的是处于RUNNING状态的线程,出于某种原因,比如调用了sleep方法、等待用户输入等而让出当前的CPU给其他的线程。

⑤DEAD(消亡状态):处于RUNNING状态的线程,在执行完run方法之后,就变成了DEAD状态了。

3、多线程安全问题:

多个线程共享同一数据,当某一线程执行多条语句时,其他线程也执行进来,导致数据在某一语句上被多次修改,执行到下一语句时,导致错误数据的产生。

因素:多个线程操作共享数据;多条语句操作同一数据

解决:

原理:某一时间只让某一线程执行完操作共享数据的所有语句。

办法:使用锁机制:synchronized或lock对象

4、线程的同步:

当两个或两个以上的线程需要共享资源,他们需要某种方法来确定资源在某一刻仅被一个线程占用,达到此目的的过程叫做同步(synchronization)。

同步代码块:synchronized(对象){},将需要同步的代码放在大括号中,括号中的对象即为锁。

同步函数:放于函数上,修饰符之后,返回类型之前。

5、wait和sleep的区别:(执行权和锁区分)

wait:可指定等待的时间,不指定须由notify或notifyAll唤醒。

线程会释放执行权,且释放锁。

sleep:必须制定睡眠的时间,时间到了自动处于阻塞状态。

即使睡眠了,仍持有锁,不会释放执行权。
---------------------
作者:tianlan996
来源:CSDN
原文:https://blog.csdn.net/tianlan996/article/details/88169225
版权声明:本文为博主原创文章,转载请附上博文链接!

Java集合、IO流、线程知识的更多相关文章

  1. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  2. 理解Java之IO流

    流是一种抽象概念,它代表了数据的无结构化传递.用来进行输入输出操作的流就称为IO流. 一.IO流结构 1.流的分类方式 按流向分: 从文件/网络/内存等(数据源)到程序是输入流:从程序到文件/网络/内 ...

  3. Java 中级IO流基础及主要API编程

    1. IO流基础知识,流 是字节从源到目的地的运行的轨迹,次序是有意义的, 字节会按照次序进行传递, 比如Hello World 在下图中的传递的轨迹.该图形象的解释了IO中流的概念.流中全是字节.2 ...

  4. Java基础-IO流对象之字符类(FileWrite与FileReader)

    Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...

  5. Java 的 IO 流

    接着上一篇的 “Java 的 File 类” 的随笔,在File类的基础上,我们就走进Java的IO流吧. 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在 ...

  6. Java的IO流以及输入流与输出流的异同

    一:流的基本概念:           Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.J ...

  7. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  8. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  9. 【Java】IO流简单分辨

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...

  10. Java - 文件(IO流)

    Java - 文件 (IO)   流的分类:     > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter     ...

随机推荐

  1. python os 常用命令

    转载:http://www.cnblogs.com/kaituorensheng/archive/2013/03/18/2965766.html python编程时,经常和文件.目录打交道,这是就离不 ...

  2. git怎样删除未监视的文件untracked files ?

    git怎样删除未监视的文件untracked files 需要添加到.gitignore文件 # 删除 untracked files git clean -f # 连 untracked 的目录也一 ...

  3. C++ 得到系统时间

    Time::Time() {//得到系统时间 初始化 time_t t; t=time(NULL); tm *lt; lt=localtime(&t); hour=lt->tm_hour ...

  4. 【HDOJ6638】Snowy Smile(线段树)

    题意:一个二维平面上有n个点,每个点的坐标是(x[i],y[i]),权值是w[i] 求一个矩形使得其中所有点的权值和最大,输出权值和 n<=2e3,x[i],y[i],w[i]的绝对值<= ...

  5. (转)YAML最最基础语法

    转:https://blog.csdn.net/vincent_hbl/article/details/75411243 正如YAML所表示的YAML Ain’t Markup Language,YA ...

  6. toutiao url

    https://it.snssdk.com/article/v2/tab_comments/?group_id=6485899113563947533&item_id=648589911356 ...

  7. Win32下session和window station以及desktop一些介绍和应用

    会话(session).工作站(WindowStation).桌面(Disktop).窗口(window) https://blog.csdn.net/hlswd/article/details/77 ...

  8. leetcode 122. 买卖股票的最佳时机 II (python)

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  9. Spring cloud gateway自定义filter以及负载均衡

    自定义全局filter package com.example.demo; import java.nio.charset.StandardCharsets; import org.apache.co ...

  10. Postman 测试Xfire webservice

    权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u013177381/article/det ...