day18-红黑树,IO流

集合-Set

Set的特点是无序不可重复;它下面有TreeSet和HashSet。
在底层实现中,我们不难发现HashSet的底层歧视就是HashMap,只不过是把map的value部分屏蔽,对外只提供key。
Hash算法是一种安全的加密算法,它把不定长的输入变成定长输出,不保证唯一性。
同一个对象生成多次hash值,一定相同,但是不同的对象也可能生成相同的hash值。
hash算法中常见的有:直接寻址法;数字分析法;除留取余法,平方取中法。
在java中,散列表封装到hashMap和hashTable中,hash算法在java中指的是hashCode方法。

Map

map的特性是无序,key不可以重复,但是value可以重复,保存键值对映射关系,通过key可以找到对应的value。、
HashMap默认的初始容量是16,默认的加载因子是0.75。
map的数据结构是在数组中保存链表,链表是个单向链表(值(Entry对象),下一个节点,hash值),Map.Entry的本质是Node<K,V>[];
添加的过程:
先要使用要存储的映射关系的key对象调用key对象的hashCode方法,生成hash值,然后通过hash算法,得到数组下标;
判断该下标上是否含有元素,没有就创建一个node对象,把hash,key,value存储,并且是next是null,把该Node对象保存到数组对应的下标上;
如果该数组位上有节点对象,那么就调用当前添加的映射关系的key的equals方法,和当前数组位上的所有节点对象的key进行比较(比较key的equals和hash);
如果有相等的,就把要添加的键值对的value值替换成原来的键值对中的value值,并且key不添加;
如果没有相等的,就把键值对封装到node对象,并保存到该数组中对应的链表的尾部,原来尾部节点对象中的next保存添加的这个新的node对象;
1.8开始,为了左右平衡,查询效率更高,引入了树,如果数组中的node个数大于等于7,就把该数组位上的节点都转换位TreeNode,以树状存储。

package day18_Csdn;
/**
 * 1
 * {a=423}
 */
import java.util.HashMap;

public class CsdnOne {

	public static void main(String[] args) {
		HashMap<String,Integer> map = new HashMap<>();
		map.put("a", 123);
		map.put("a", 423);
		System.out.println(map.size());
		System.out.println(map);
	}

}

map虽然和集合没有关系,但是两者操作基本不相同,除了add变成put 其他大同小异。
map不能直接遍历,需要先转为集合,然后使用get方法,获取value。

package day18_Csdn;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * a 31t 123das 312
 * @author SkiMei
 *
 */
public class CsdnTwo {

	public static void main(String[] args) {
		Map<String,Integer> map = new HashMap<>();
		map.put("a", 31);
		map.put("t", 123);
		map.put("das", 312);
		// keySet
		Set<String> sets  = map.keySet();
		for(String key:sets){
			Integer value = map.get(key);
			System.out.print(key+" "+value);
		}
		
		// entrySet
		Set<Entry<String,Integer>> entrys = map.entrySet();
		for(Entry<String,Integer> entry:entrys){
			String key = entry.getKey();
			Integer value = entry.getValue();
			System.out.print(key+" "+value);
		}
	}

}

在map中有一种特殊的map叫Properties,它的键和值都强制指定位String类型。
想要将map进行排序,首先需要把键值对转换为单一元素对象(Entry),通过map.entrySet()得到set;然后把多个entry封装到list中,ArrayList的构造方法把set传入或者调用add,对list元素进行排序。

package day18_Csdn;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class CsdnThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<String,Integer> map = new HashMap<>();
		map.put("da", 31);
		map.put("da1",12);
		// 转换为set
		Set<Entry<String,Integer>> set = map.entrySet();
		// 转换为list
		List<Entry<String,Integer>> list = new ArrayList<>(set);
		// 排序
		Collections.sort(list,new Comparator<Entry<String,Integer>>(){
			@Override
			public int compare(Entry<String,Integer>o1,
					Entry<String,Integer>o2){
				return o1.getValue()-o2.getValue();
			}
		});
		// 遍历
		for(Entry<String,Integer> entry:list){
			System.out.println(entry);
		}
	}

}

红黑树

要了解红黑树,必须先了解二叉查找树,左子树上的结点的值必须小于它的根节点,右子树上的结点的值大于它的根节点。
二叉查找树可能会因为多次插入新的节点导致不平衡,红黑树就此出现。
红黑树的五条规则:
节点是红色或者黑色;
根节点必须是黑色;
每个叶子节点都是黑色的空节点(NIL节点);
每个红色节点的两个子节点都是黑色,不能有连续两个红色节点;
任意节点到其子节点的路径都必须包含相同的黑色节点。
为了保证五条规则,红黑树中有三种方式维护:变色;左旋转和右旋转。

IO:BIO,NIO,AIO

IO常写作I/O,是input、output的简称,即输入输出,通常指的是内部存储器和外部存储器或者等周边设备的输入和输出,java中,提供了一些api来供开发者读写外部数据和文件,这些api就统称为JAVA IO。
BIO全称是Block-IO是一种同步且阻塞的通信模式,是一种比较传统的通信模式,优点是模式简单,使用方便;缺点是并发处理能力弱,通信耗时,依赖网速。
NIO全程是Non-Block IO是针对网络传输效能优化的新功能,是一种非阻塞的同步通信默哀是,Nio和原来的io有同样的作用和目的,他们的区别是数据打包和传输的方式,原来的io以流的方式处理数据,但是nio以块的形式处理数据,面向流的io一次一个字节的处理数据,按块处理数据会快很多,但是NIo缺少一些面向流的IO所具有的优雅性和简单性。
AIO全程是Asynchronous IO是异步非阻塞的IO,是一种非阻塞异步的通信模式,在NIO的基础上引入了新的异步通道的概念,提供了异步文件通道和异步套接字通道的实现。

IO

流是一组有顺序,有起点,有终点的字节集合,是对数据传输的总称和抽象,数据在两设备的传输称为流,流的本质是数据传输,根据传输特性可以将流分成多种。
按照流向可以分为输入流和输出流;
按照处理数据类型的不同可以分为字节流和字符流;
按照功能不同:分为节点流(直接操作数据)和处理流(对其它流进行处理)。
文件流:
InputStream
close关闭流,read读取下一个数据字节,read(byte[] b)从输入流中读取一定数列的字节并保存在缓存区数组b中,read(byte[] b,int off,intlen)将输入流中最多len个数据字节读入字节数组。
OutputStream
close关闭,flush刷新此输出流并强制写出所有缓冲的输出字节,write写入输出流。
Reader
close关闭,read读取,read(char[] char)将字符读入数组
Writer
close关闭,write写入(可以写入字符串,字符,字符数组),flush刷新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值