java开发基础知识

333 阅读9分钟

HashMap

  • 1.HashMap线程不安全的原因:在多线程情况下,会导致hashmap出现链表闭环,一旦进入了闭环get数据,程序就会进入死循环,所以导致HashMap是非线程安全的。
  • 2.多线程情况下使用map的方案: 1)Collections.synchronizedMap 2)Hashtable 3)ConcurrentHashMap
  • 3.使用场景:非并发操作下存储键值对,防止出现链表闭环,导致cpu过高,系统崩溃。并发条件下使用Hashtable,但推荐使用ConcurrentHashMap,效率更高。

ConcurrentHashMap

  • 1.实现原理:底层是使用段实现的,每个段是一个Hashtable,Hashtable是线程安全的,当多个操作发生在不同的段上,就可以并发执行,执行效率比Hashtable高
  • 2.使用场景:并发操作下使用,效率比Hashtable高

List

  • ArrayList: 1.数组结构 2.查找较快 3.增删较慢 4.线程不安全
  • LinkedList 1.链表结构 2.查找较慢 3.增删较快 4.线程不安全
  • Vector 1.数组结构 2.查找较快 3.增删较慢 4.线程安全
  • Stack 1.继承Vector 2.线程安全
  • 使用场景: 1.对于需要增删的使用LinkedList 2.对于单线程需要查找的使用ArrayList 3.对于并发,只有单线程操作就使用ArrayList,对于多线程,并发操作列表的就使用Vector

NIO

  • NIO的优点:1.不用read或者write就可以操作文件 2.采用虚拟内存技术,提高了IO的效率 3.修改自动flash到文件

线程

  • 类锁:synchroized修饰静态方法,对该类的所有对象生效,同一时间只能有一个线程获取该锁,其他线程则阻塞等待
  • 对象锁:synchronized修饰非静态方法或者是对象的同步代码块,只对该对象生效,即同一时间只能有一个线程获取该对象锁,对象锁和类锁是不一样的锁,一个线程可以同时获得对象锁和类锁
  • wait:线程等待,释放对象锁,放弃cpu的控制权,等待被唤醒,yield是让给优先级高的进行,wait等待,所有线程竞争资源 notify:唤醒一个正在等待的线程 notifyAll:唤醒所有等待的线程 以上3个方法多是final的,不能被重写,wait,notify与notifyAll都是配合着synchronized使用的,达到线程间的互斥访问
  • 线程通信的常见方式: 1.共享内存 2.socket通信 3.信号量 4.消息队列:piedInputstream和pipedOutputStream
  • 线程与进程的区别:一个程序就是一个进程,进程可以包含多个线程,线程是程序种一个最小单元
  • happens-before规则:如果两个操作时happed-before的关系,则前一个操作对后一个操作可见
  • CAS无锁算法:乐观锁技术,有3个值,内存知V,预期值A,修改值B,若A=V,则修改,否则什么都不会做

Redis

  • redis常见的数据库结构: 1.key-value 2.List 3.Hash 4.Set 5.Sort-Set
  • redis常见的持久化机制: RDB,默认开启,每5分钟生成一次快照,同时也可以触发生成,save和bgsave命令 AOF,默认不开启,每秒钟附加命令到备份文件,备份数据最高的一种持久化方式
  • redis与memcache比较:
    • 1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
    • 2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
    • 3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
    • 4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
    • 5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;
    • 6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
    • 7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
    • 8、Redis支持数据的备份,即master-slave模式的数据备份;
    • 9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
  • redis实现分布式锁:
    • 1.互斥性,同一时间只有一个客户端获取到锁
    • 2.不会发生死锁,如果一个客户端获取到锁后奔溃了,下一个客户端能正常获取锁
    • 3.释放性,谁获得锁就谁来解锁
    • 4.容错性,只要redis大部分节点正常,客户端就能正常的获取锁和解锁 关键代码:String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
  • redis单机性能:redis读取性能最高在7w/s以上

MySQL

常见的MySQL引擎类型

  • InnoDB:支持提交,回滚,崩溃恢复等事务安全,行锁,外键,能缓存索引,也能缓存数据, 使用场景:需要提供提交,回滚,奔溃恢复等事务安全能力,提供并发控制

  • MyISAM:不支持事务,表级锁定,读取和写入互相阻塞,索引缓存, 使用场景:如果只是提供数据的插入和查询,并且数据以读为主,并发少,MyISAM是很好的选择

  • Memory:存在内存中,查询速度快, 使用场景:如果存储一些临时数据,数据量不大,该引擎会是最好的选择,如一些临时的数据

  • Archive:不支持事务,不支持索引,只支持SELECT和INSERT操作 使用场景:如果表操作只有SELECT和INSERT,该引擎是最好的选择,Archive支持高并发的插入操作,但不是事务安全的,该引擎经常用来存储归档信息,如一些日志记录信息

  • SQL语句执行慢如何排查解决 1.用explain分析SQL语句 2.是否能单表查询,若不能,若是多表连接查询,看连接类型,最好到最差const、eq_reg、ref、range、indexhe和ALL 3.一般在where,group by语句后面使用索引字段

  • 常见的SQL优化手段 1)不使用子查询 2)避免函数索引 3)用IN来替换OR 4)like双%号无法使用到索引 5)读取适当的记录LIMIT N,M 6)避免数据类型不一致 7)分组统计可以禁止排序 8)禁止随机取数据 9)避免不必要的ORDER BY 10)批量INSERT插入

  • 索引作用

    • 优点: 1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 2)可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 4)在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
  • 缺点: 1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

  • 创建索引:索引的创建可以在 CREATE TABLE 语句中进行,也可以单独用 CREATE INDEX 或 ALTER TABLE 来给表增加索引

  • 数据结构:B-树和B+树,通过该数据结构快速的达到快速的查找的目的

Kafka

基本介绍:Kafka是一个分布式的消息缓存系统,稳定性高,吞吐量高,适合并发量高的开发项目 优点: 1.分布式 2.实时 3.高吞吐量 4.消息持久化 应用场景: 1.异步处理:如用户注册系统,发送短信,发送邮件与注册系统分开 2.应用解耦的,如订单系统与库存系统 3.流量削锋,如秒杀活动 4.日志系统,如大量日志的采集与落地 5.聊天室系统

Elasticsearch

  • 基本介绍:是一个实时的分布式搜索引擎 优点: 1)分布式 2)高性能 3)实时搜索大量数据,搜索速度快
  • 应用场景:大数据检索应用,如栈内搜索,大数据全文检索等系统

ZooKeeper

  • 基本介绍:是一个分布式的协调服务,如提供主从协调,配置管理,分布式共享锁,服务器节点动态上下线,统一的命名服务
  • 优点: 1)分布式 2)高性能
  • 基本原理:Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议
  • 应用场景: 1)消息的发布与订阅 2)统一的命名服务 3)心跳检测 4)配置管理

Mybatis

  • 基本介绍:Mybatis是支持SQL查询,存储过程和高度映射的优秀持久化层框架,它消除了几乎所有的JDBC代码基本实现原理:mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSessionExecutor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程
  • 使用场景:主要应用在一些需求较多的项目,互联网项目,敏捷开发

Dubbo

  • 基本介绍:Dubbo 是阿里巴巴开源项目的一个分布式服务框架。其致力于提供高性能和透明化的 RPC 远程调用方案,以及 SOA 服务治理方案。
  • 基本原理:使用ZooKeeper的主从协调与订阅/发布的服务,利用RMI远程方法调用实现分布式的微服务框架
  • 使用场景: 1)商城做活动流量暴涨:防止系统崩掉 可以通过dubbo来控制访问量 2)分布式服务器rpc过程调用压力分担

计算机网络

  • 为什么是4次挥手而不是3次? 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。 其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手