一、去重
去重:用布隆过滤器,就是一个bitmap,但是有k个哈希函数,仅当一个数据的k个哈希函数找出的位置全部为1时,才表示这个数据在集合中,但是它也有一定的误判率,会把不存在的判断为存在,宁可错杀1000,不肯放过一个的这种,因此他不适合作0误判的场合,并且删除也不方便,你还不如重建一个布隆过滤器;
它很合适需要迅速判断一个元素是否在一个集合中,比如:
- 爬取URL时,避免爬重;
- 反垃圾邮件、垃圾短信,从数十亿的邮件列表中判断邮箱是否是垃圾邮箱(看接收人数的);
- 缓存击穿,将已存在的缓存放到布隆过滤器,这样当黑客访问不存在的缓存时迅速返回避免缓存及数据库挂掉;
还有一种就是直接扩大物理内存的,用分布式的Redis来实现,setnx,还有牺牲效率的,用哈希和辅助磁盘;
二、从很多数据中选择最大的几个数
小根堆,之所以用小根堆是因为:小根堆的堆顶元素是最小的那个,如果遍历的时候当前数据比堆顶元素都小,肯定不在最大的n个数之类,反之,就应该将当前数据加入到根堆(删除当前堆顶元素),并调整这个堆,继续操作,直到遍历完所有数据,根堆中剩余的数据就是最大的几个数;
需要找最大的N个数,只需要建立N个节点的小根堆就好了,找最小的反过来,逻辑一样;
三、大数据如何存储:
- 首先考虑换用更大的数据类型;
- 还是放不下的话就只能是数组去存放了(字符串也可以,但是它其实也是char类型的数组);
四、小数如何存储:
- 首先选用float、double类型的;
- 用字符串格式化数据:
//利用字符串格式化的方式实现 四舍五入,保留1位小数
String str1 = String.format("%.1f",d1);// 1代表小数点后面的位数, 不足补0 . f代表,后面的数据d1是浮点类型
- 使用BigDecimal:
//利用BigDecimal来实现四舍五入.保留一位小数
double f1 = new BigDecimal(d1).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
//1 代表保留1位小数
//BigDecimal.ROUND_HALF_UP 代表使用四舍五入的方式
五、日期如何获取
日期如何获取和存储:
- 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响,得到的结果是时间戳格式的:
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date));
- Calendar类,专门用于转换特定时刻和日历字段之间的日期和时间:
Calendar calendar = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(calendar.getTime()));
- Java 8提供了一个全新的API,用以替换java.util.Date和java.util.Calendar。Date / Time API提供了多个类,帮助我们来完成工作,包括:LocalDate、LocalTime、LocalDateTime、ZonedDateTime;
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));
如果想获取前几天或者后几天的时间:
//获取一个Calendar对象,bai默du认带的是当前时间,想zhi设置可以使用Set方法
Calendar ca = Calendar.getInstance();
//使用add方法,前面的参数是调整的变量,这里设置的是日期,第二个变量是正数则是往后推,负数是往前推
ca.add(Calendar.DATE,-1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//getTime返回的是Date对象,然后SimpleDateFormat进行格式化输出
System.out.println(sdf.format(ca.getTime()));