导图社区 Java基础
Java基础知识梳理,包括Java基本类型、String、集合、异常处理、Socket、IO等内容。
编辑于2022-10-12 20:25:56 重庆Java基础
Java基本类型
值范围
byte
1字节
-128~127(-2的7次方到2的7次方-1)
short
2字节
-32768~32767(-2的15次方到2的15次方-1)
int
4字节
-2147483648-2147483647(-2的31次方到2的31次方-1)
long
8字节
float
4字节
double
8字节
char
2字节
boolean
1字节
自动拆装箱
拆箱
xxxValue()
装箱
valueOf()
包装对象的数值比较,不能简单的使用==,虽然-128到127之间的数字可以,但是这个范围之外还是需要使用equals比较。 因为有缓存机制。 如Int类型:默认缓存是整数值区间-128 至 +127。
String
一个不可变类
StringBuilder(线程不安全 )
StringBuffer(线程安全 )
集合
Array
List
ArrayList
数组结构,查询快,增删慢,而且线程不安全。 如需可使用List list = Collections.synchronizedList(new ArrayList());
扩容增量:原容量的 0.5倍。 如 ArrayList的容量为10,一次扩容后是容量为15
LinkedList
双向链表实现,查询慢,增删快,线程不安全。如需可使用List list = Collections.synchronizedList(new LinkedList());
Vector
一个有序集合,允许重复元素,并且线程安全. 通过synchronized实现
Map
HashMap
线程不安全,如需可使用Map m = Collections.synchronizedMap(new HashMap(...));
基于hash表,底层是数组+链表,存储键值对(一个Entry)
键是唯一的,允许有null键和null值
put(key,value) 来放入键值对,新值会替换老值,并将老值返回; 如果没有老值,则返回null
每一次调用put方法的时候,都会调用hashcode来计算, 找到bucket(哈希桶)对应存储的位置;如果计算值一样(碰撞), 则会形成一个链表。(键为null都是放在了Enrty[0] 的位置)
get的时候会先判断key是否为null,是则直接查找Enrty[0] ; 如果不为null,先计算key的hashcode值,通过计算的值找到对应的存储位置。
Map的键通常是String这种不可变类,如果要用自定义对象,需要重写hashcode方法, 这样才能保证计算的哈希值一样
Java8中对碰撞问题进行了优化,当链表记录到达一个阀值(jdk8阀值为8)后会自己动态的转为一个红黑树
线程不安全的体现
多个线程同时put
假设正好存在两个put的key发生了碰撞(hash值一样),那么根据HashMap的实现,这两个key会添加到数组的同一个位置,这样最终就会发生其中一个线程的put的数据被覆盖。
多个线程同时检测到元素个数 超过数组大小*loadFactor
这样会发生多个线程同时对hash数组进行扩容,都在重新计算元素位置以及复制数据, 但是最终只有一个线程扩容后的数组会赋给table,也就是说其他线程的都会丢失, 并且各自线程put的数据也丢失。且会引起死循环的错误。
默认初始容量为16
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容 扩容增量:原容量的 1 倍
Hashmap的扩容需要满足两个条件:当前数据存储的数量(即size())大小必须大于等于阈值;当前加入的数据是否发生了hash冲突。
Hashtable
不可以存入null键null值,是线程同步的.。
put
1、先获取synchronized锁。 2、put方法不允许null值,如果发现是null,则直接抛出异常。 3、计算key的哈希值和index 4、遍历对应位置的链表,如果发现已经存在相同的hash和key,则更新value,并返回旧值。 5、如果不存在相同的key的Entry节点,则调用addEntry方法增加节点。 6、addEntry方法中,如果需要则进行扩容,之后添加新节点到链表头部。
get
1、先获取synchronized锁。 2、计算key的哈希值和index。 3、在对应位置的链表中寻找具有相同hash和key的节点,返回节点的value。 4、如果遍历结束都没有找到节点,则返回null。
Set
HashSet
异常处理
Throwable
Error(不受检异常)
是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。如OutOfMemoryError
Exception
运行时异常(不受检异常)(RuntimeException)
非运行时异常(受检异常)
Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
Socket
OSI七层模型和TCP/IP五层模型
WebSocket
UDP、TCP/IP
IO
File
计算机中的文件和目录,只能访问文件和目录,不能访问内容
访问文件
getPath(),返回new File时的路径
getAbsolutePath();返回磁盘上文件的绝对路径
renameTo(File file);重命名
检测文件
boolean exists();文件是否存在
boolean isDirectory();是否是文件夹
boolean isFile();是否是文件
操作文件
mkdir():只能创建一级目录,且父目录必须存在,否则无法成功创建一个目录。 mkdirs():可以创建多级目录,父目录不一定存在。
createNewFile();创建一个新的文件
原理
Input
读取外部(磁盘、光盘)数据到内存
Output
将内存数据写入到磁盘、硬盘等外部设备
字符流
Reader
BufferedReader
LineNumberReader
InputStreamReader
FileReader
StringReader
PipedReader
CharArrayReader
FilterReader
PushbackReader
Writer
BufferedWriter
OutputStreamWriter
FileWriter
PrintWriter
StringWriter
PipedWriter
CharArrayWriter
FilterWriter
字节流
InputStream
FileInputStream
FilterInputStream
BufferedInputStream
DataInputStream
PushbackInputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
ByteArrayInputStream
OutputStream
FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutOutputStream
PrintStream
ObjectOutputStream
PipedOutputStream
ByteArrayOutputStream
转换流
InputStreamReader
字节流到字符流的桥梁
OutputStreamWriter
字符流到字节流的桥梁
NIO
Buffer
四个重要属性
capacity:缓冲区容量
position:当前操作数的位置
limit:可操作数上限位置
mark:标记当前操作数位置; 调用 reset() 将 position 位置调整到 mark 属性指向的下标位置,实现多次读取数据
put
get
其他
flip():转换读写模式
clear():清除缓冲区
rewind():可以将 position 位置设置为 0,再次读取缓冲区中的数据
Channel
是一个通道,可以双向读写,配合Buffer传输
FileChannel
SocketChannel
ServerSocketChannel
DatagramChannel
缓冲流
基于字节数组
文件流(基于文件操作)