1

20-12-29

1.java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
2.String str="i"与 String str=new String("i")一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
因为他new了 new就会进堆内存
3.String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

4.接口和抽象类有什么区别?

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

5.BIO、NIO、AIO 有什么区别?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

20-12-30

1.Collection和Collections有什么区别?

  • java.util.Collection是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java类库中有很多具体的实现.Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set.
  • Collections则是集合类的一个工具类/辅助类,其中提供了一系列静态方法,用于对集合中元素进行排序,搜索以及线程安全等各种操作

2.HashMap和Hashtable有什么区别?

  • hasMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法
  • hashTable同步的,而HashMap是非同步的,效率上比hashTable要高.
  • hashMap允许空键值,而hashTable不允许

3.如何决定使用HashMap还是TreeMap?

  • 对于在Map中插入,删除和定位元素这类操作,HashMap是最好的选择.然而,假如你需要一个有序的集合进行遍历,TreeMap是更好的选择.基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历

4.说一下HashMap的原理实现
HashMap概述:HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变.
HashMap,的数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体
当我们往HashMap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾.如果数组中该位置没有元素.就直接将该元素放到数组的该位置上
在jdk1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率
5.说一下HashSet的原理实现

  • HashSet底层由HashMap实现
  • HashSet的值放于HashMap的Key上
  • HashMap的value统一为PRESRNT

21-1-6

2.2 切面组成要素

切面 = 切入点表达式 + 通知方法

2.2.1 切入点表达式

1).bean(bean的ID) 拦截bean的所有的方法 具体的某个类 粗粒度的.
2).within(包名.类名) 扫描某个包下的某个类 com.jt.* 粗粒度的.
3).execution(返回值类型 包名.类名.方法名(参数列表)) 细粒度的
4).@annotation(包名.注解名) 细粒度的

2.2.2 通知方法

说明: 通知相互之间没有顺序可言. 每个通知方法都完成特定的功能,切记AOP的通知方法与目标方法之间的顺序即可.
1).before 目标方法执行前
2).afterReturning 目标方法执行后
3).afterThrowing 目标方法执行抛出异常时执行.
4).after 不管什么情况,最后都要执行的.
上述四大通知类型,一般用来记录程序的运行状态的.(监控机制)

5).around 目标方法执行前后都要执行.
如果要对程序的运行轨迹产生影响,则首选around.

21-1-7

Redis属性说明

2.1 Redis持久化策略

2.1.1 为什么要持久化

Redis中的记录都保存在内存中,如果内存断电或者服务器宕机,则内存数据直接丢失.业务中不允许发生. 所以需要将数据定期进行维护.

2.1.2 RDB模式

说明: RDB模式是Redis的默认的持久化策略.无需手动的开启.
特点:
1.Redis会定期的执行RDB持久化操作. 缺点:可能导致内存数据丢失.
2.RDB记录的是内存数据的快照,并且后续的快照会覆盖之前的快照.每次只保留最新数据.效率更高.

命令:
1).save 命令 要求立即执行持久化操作 save会造成线程的阻塞.
2).bgsave 命令 后台执行持久化操作 后台运行不会造成阻塞. 异步操作, 不能保证立即执行

2.1.3 AOF模式

说明: AOF模式默认条件下是关闭的,需要手动的开启,如果开启了AOF模式则RDB模式将失效.但是如果手动执行save命令,则也会生成RDB文件.
特点:
1.AOF模式记录程序的执行的过程.所以可以保证数据不丢失.
2.由于AOF记录程序运行的过程,所以整个持久化文件相对大,所以需要定期维护. 效率低

2.1.4 RDB与AOF模式持久化对比

1).RDB模式
save 900 1 如果在900秒内,执行了一次更新操作则持久化一次
save 300 10
save 60 10000 操作越快 ,持久化的周期越短.

2).AOF模式
appendfsync always 用户执行一次更新操作,则持久化一次 异步操作
appendfsync everysec 每秒操作一次
appendfsync no 不主动操作 一般不用.

2.1.5 关于RDB与AOF总结

策略: 如果数据允许少量丢失,首选RDB模式,
如果数据不允许丢失则首选AOF模式.

企业策略: 又要满足效率,同时满足数据不丢失.
主机: 采用RDB模式
从机: 采用AOF模式

2.1.6面试题

题目: 小丽是公司特别漂亮的妹子,误操作将redis服务器执行了flushAll命令,问你作为项目经理如何处理??

A. 训斥一顿,之后HR开除.
B. 秀一下自己的技术,让小丽崇拜 一起过上了幸福的生活

解决方案: 需要将从库中的AOF文件 进行编辑,删除多余的flushAll命令,之后重启redis即可.

问题2: 小丽在执行完上述操作之后,由于好奇 误将aof文件一并删除,问如何处理???
答: 杀人祭天!!!

2.2 Redis内存策略

2.2.1 LRU算法

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
判断维度: 时间T

2.2.2 LFU算法

LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
判断维度: 使用次数

2.2.3 随机算法

随机算法

2.2.4 TTL算法

将剩余时间短的数据,提前删除.

2.2.5 Redis的内存优化策略

  1. volatile-lru 在设定超时时间的数据中采用LRU算法
  2. allkeys-lru 所有的数据采用LRU算法删除
  3. volatile-lfu 设定了超时时间的数据采用LFU算法删除
  4. allkeys-lfu 所有数据采用LFU算法删除
  5. volatile-random 设定了超时时间的数据采用随机算法
  6. allkeys-random 所有数据的随机算法
  7. volatile-ttl 设定了超时时间之后采用TTL算法
  8. noeviction 不做任何操作,只是返回报错信息.

jing1311875
7 声望0 粉丝