栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java面试总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java面试总结

Java面试总结 高并发中的集合有哪些问题 第一代线程安全集合类

Vector、HasnTable
是怎么保证线程安排的:使用synchronized修饰方法
缺点:效率低下

第二低线程非安全集合类

ArrayList、HashMap
线程不安全,但是性能好,用来替代vector、Hashtable
使用ArrayList、HashMap,需要线程安全怎么办呢?
使用Collections.synchronized(list);Collections.synchronizedMap(m);

第三代线程安全集合类

在大量兵法情况下如何提高集合的效率和安全呢?
java.util.concurrent.*;
ConcurrentHashMap;
CopyOnWriteArraylist;
CopyOnwriterArraySet;
底层大都采用Lock锁,保证安全的同时,性能也很高


Java异常处理方式
  • try、catch、finally:捕获异常
  • throw:抛出异常、方法内部、具体的异常
  • throws:声明异常、具体的异常类

String、StringBuffer、StringBuiler的区别及使用 String
  • string是只读字符串、具有不可变性
  • 字符串内容改变实际上地址也改变了
StringBuffer
  • 线程安全
  • 可变性
StringBuiler
  • 线程不安全
  • 可变性
  • 效率高
  • 声明一个StringBuiler时指向一个堆空间,具有两个重要属性value和count

怎么声明一个类不会被继承,什么场景下使用

如果一个类被final修饰,此类不可以有子类,不能被其他类继承,如果一个中的所有方法都没有重写的需要,当前类没有子类也罢。
例如:Math


redis持久化(RDB、AOF)

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。


redis五种数据类型 StringRedisTemplate 常用方法
方法描述
opsForValue()操作字符串
delete(key)根据key删除记录
opsForHash()操作hash
opsForList()操作list
opsForSet()操作set
opsForZSet()操作有序set
String

String通常用于保存单个字符串或JSON字符串数据
计数器

  • opsForValue().set(key,value):向redis中插入数据。因为这个没有设置过期时间所以是永久存储的
  • opsForValue().set(key,value,time,timeUtil):向redis中插入数据。第三个参数是一个long型的时间。最后一个参数是时间的单位
  • opsForValue().get(key):获取redis中指定key 的value值
Hash

常用于存储一个对象
购物车:以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素。

新增hashMap值:
put(H key, HK hashKey, HV value):
redisTemplate.opsForHash().put(“hashValue”,“key”,“value”);

获取指定变量中的hashMap值:
values(H key):
List hashList = redisTemplate.opsForHash().values(“hashValue”);

获取变量中的键值对:
entries(H key):
Map map = redisTemplate.opsForHash().entries(“hashValue”) :
System.out.println(“通过values(H key)方法获取变量中的hashMap值:” + hashList)

获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null
get(H key, Object hashKey):
Object mapValue = redisTemplate.opsForHash().get(“hashValue”,“map1”);
System.out.println(“通过get(H key, Object hashKey)方法获取map键的值:” + mapValue);

判断变量中是否有指定的map键
hasKey(H key, Object hashKey):
boolean hashKeyBoolean = redisTemplate.opsForHash().hasKey(“hashValue”,“map3”)
System.out.println(“通过hasKey(H key, Object hashKey)方法判断变量中是否存在map键:” + hashKeyBoolean)

获取变量中的键
keys(H key):
Set keySet = redisTemplate.opsForHash().keys(“hashValue”)
System.out.println(“通过keys(H key)方法获取变量中的键:” + keySet);

获取变量的长度
size(H key):
long hashLength = redisTemplate.opsForHash().size(“hashValue”)
System.out.println(“通过size(H key)方法获取变量的长度:” + hashLength)

使变量中的键以double值的大小进行自增长
increment(H key, HK hashKey, double delta):
double hashIncDouble = redisTemplate.opsForHash().increment(“hashInc”,“map1”,3)
System.out.println(“通过increment(H key, HK hashKey, double delta)方法使变量中的键以值的大小进行自增长:” + hashIncDouble)

使变量中的键以long值的大小进行自增长
increment(H key, HK hashKey, long delta):
long hashIncLong = redisTemplate.opsForHash().increment(“hashInc”,“map2”,6)
System.out.println(“通过increment(H key, HK hashKey, long delta)方法使变量中的键以值的大小进行自增长:” + hashIncLong)

以集合的方式获取变量中的值
multiGet(H key, Collection hashKeys):
List list = new ArrayList()
list.add(“map1”)
list.add(“map2”)
List mapValueList = redisTemplate.opsForHash().multiGet(“hashValue”,list)
System.out.println(“通过multiGet(H key, Collection hashKeys)方法以集合的方式获取变量中的值:”+mapValueList)

以map集合的形式添加键值对
putAll(H key, Map m):
Map newMap = new HashMap()
newMap.put(“map3”,“map3-3”)
newMap.put(“map5”,“map5-5”)
redisTemplate.opsForHash().putAll(“hashValue”,newMap)
map = redisTemplate.opsForHash().entries(“hashValue”)
System.out.println(“通过putAll(H key, Map m)方法以map集合的形式添加键值对:” + map)

删除变量中的键值对,可以传入多个参数,删除多个键值对
delete(H key, Object… hashKeys):
redisTemplate.opsForHash().delete(“hashValue”,“map1”,“map2”)
map = redisTemplate.opsForHash().entries(“hashValue”)
System.out.println(“通过delete(H key, Object… hashKeys)方法删除变量中的键值对后剩余的:” + map)


Mysql的优化 explain执行语句
explain select * from T_EW_OUT_GAUGE where F_DT_DATA_CREATE_TIME >='2021-12-25'


type:指的是查询的类型,分为全表扫描和索引扫描。全表扫描是低效的。索引扫描又分为几个级别,包含辅助索引扫描和聚集索引扫描,各个级别不一样,性能也不一样。

索引扫描对应的执行计划分别为:index,range,ref,eq_ref,const(system),NULL
索引扫描按上面的排序,从左到右性能依次变好

select_type:主要用来分辨SELECT的类型,是普通查询还是联合查询还是子查询:

  • simple(简单表,即不用表连接或子查询)
  • primary(主查询,即外部查询)
  • union(union中的第二个或者后面的查询语句)
  • subquery(子查询中的第一个select)

possible_keys:此次查询中可能选用的索引

key:此次查询中确切使用到的索引

ref:哪个字段或常数与 key 一起被使用

索引–B+树
  • 索引数据和实际数据都存储在磁盘中
  • 当需要读取数据时,磁盘中的索引会加载到内存中
  • 分块进行数据读取

索引的分类:主键索引、唯一索引、普通索引、全文索引、组合索引

索引并不是越多越好:索引的维护会非常麻烦、占用的存储空间会变大,会导致IO增多。

主从复制
  • 有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读
  • 做数据的热备
  • 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能

原理:

  • 从库会生成两个线程,一个I/O线程,一个SQL线程
  • I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中
  • 主库会生成一个log dump线程,用来给从库I/O线程传binlog
  • SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行
读写分离
 master:
      url: 
      username: 
      password: 
      driver-class-name: com.mysql.jdbc.Driver
    slave1:
      url: 
      username: 
      password: 
      driver-class-name: com.mysql.jdbc.Driver
    slave2:
      url:
      username: 
      password: 
      driver-class-name: com.mysql.jdbc.Driver
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681402.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号