JAVA学习

1.面对对象:继承、封装、多态

继承:子类继承父类,就是复用的一个概念,增加代码的复用性

封装:封装一些类的一些内部机制,在不影响代码的使用情况下,改变类的内部结构,同时也保护了数据,增加了代码可维护性

多态:必备三个要素(继承、重写、父类引用指向子类对象),增加了代码的健壮性,灵活性,可移植性

2.ACID是靠什么保证的

原子性由undolog日志来保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql
一致性是由其他三大特性保证,程序代码要保证业务上的一致性
隔离性是由MVCC(多版本并发控制)来保证
持久性由redolog来保证,mysql修改数据的时候会在redolog中记录一份日志数据,就算数据没有保存成功,只要日志保存成功了,数据仍然不会丢失

redolog 和binlog如何保持一致的?两阶段提交

3.BeanFactory和ApplicationContent有什么区别

相同:

  • Spring提供了两种不同的IOC容器,一个是BeanFactorg(对象工厂),另外一个是ApplicationContext(应用程序上下文),它们都是Java interfaceApplicationContext继承于BeanFactory(ApplicationContext继承ListableBeanFactory
  • 它们都可以用XML属性配置,也支持属性的自动注入。
  • 而ListableBeanFactory继承BeanFactory),BeanFactory和ApplicationContext都提供了一种方式,使用 getBean("bean name")获取bean

不同:

  • 当你调用getBean()方法时,BeanFactory仅实例化bean,而ApplicationContext在启动容器的时候实例化单例bean,不会等待调用getBean()方法时再实例化(ApplicationContext启动容器就实例化单例bean了,BeanFactory调用时才会调用)。
  • BeanFactory不支持国际化,即i18n,但ApplicationContext提供了对它的支持(BeanFactory只支持国内访问)。
  • BeanFactory与ApplicationContext之间的另一个区别是能够将事件发布到注册为监听器的bean
  • BeanFactory的一个核心实现是XMLBeanFactory而ApplicationContext的一个核心实现是
  • ClassPathXmlApplicationContext,Web容器的环境我们使用WebApplicationContext并且增加了 getServletContext方法。
  • 如果使用自动注入并使用BeanFactory,则需要使用API注册AutoWiredBeanPostProcessor,如果使用 ApplicationContext,则可以使用XML进行配置。
  • 简而言之,BeanFactory提供基本的IOC和DI功能,而ApplicationContext提供高级功能,BeanFactory可用于测试和非生产使用,但ApplicationContext是功能更丰富的容器实现,应该优于BeanFactory

4.HashMap和HashTable的区别是什么?

  •  HashTable线程同步,HashMap非线程同步。
  • HashTable不允许<键值>有空值,HashMap允许<键,值>有空值。
  • HashTable使用Enumeration,HashMap使用Iterator现在版本都支持Iterator
  • HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式是2的指数倍。
  • hashtable继承与Dictionarv类,hashmap继承自AbstractMap类(父类不同,接口相同

5.HashMap有哪些线程安全的方式

 HashMap不是线程安全的,往往在写程序时需要通过一些方法来回,其实JDK原生的提供了2种方法让HashMap支持线程安全.

  • 方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的.这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现

特点:通过Collections.synchronizedMap()来封装所有不安全的HashMap的方法,就连toStringhashCode都进行了封装.封装的关键点有2处1)使用了经典的synchronized来进行互斥,2)使用了代理模式new了一个新的类,这个类同样实现了Map接口在Hashmap上面,synchronized锁住的是对象,所以第一个申请的得到锁,其他线程将进入阻塞,等待唤醒.优点:代码实现十分简单,一看就懂

缺点:从锁的角度来看方法一直接使用了锁住方法,基本上是锁住了尽可能大的代码块,性能会比较差。

  • 方法二:重新改写了HashMap,具体的可以查看javautilconcurrentConcurrentHashMap.这个方法比方法一有了很大的改进

特点:重新写了HashMap比较大的改变有如下几点,使用了新的锁机制,把HashMap进行了拆分,拆分成了多个独立的块这样在高并发的情ZQ况下减少了锁冲突的可能,使用的是NonfairSync.这个特性调用CAS指令来确保原子性与互斥性当如果多个线程恰好操作到同一个segment上面,那么只会有一个线程得到运行。
优点:需要互斥的代码段比较少,性能会比较好ConcurrentHashMap把整个Map切分成了多个块,发生锁碰撞的几率大大降低,性能会比较好缺点:代码繁琐

6.HashMap在扩容上有哪些优化?

在idk1.7版本的时候,扩容的计算每次都是对元素进行rehash算法,计算原来每个元素在扩容之后的哈希表中的位置,而在idk1.8之后借助2倍扩容机制.元素不需要进行重新计算位置
hashmap使用的是2次幕的扩展(指长度扩为原来2倍),所以,元素的位置要么是在原位置,要么是在原位置再移动2次幕的位置。看下图可以明白这句话的意思,n为table的长度,图(a)表示扩容前的key1和key2两种key确定索引位置的示例,图(b)表示扩容后key1和key2两种key确定索引位置的示例,其中hash1是key1对应的哈希与高位运算结果。

7.MVCC解决的问题是什么?
数据库并发场景有三种,分别为:

  • 读读:不存在任何问题,也不需要并发控制
  • 读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读
  • 写写:有线程安全问顾,可能存在更新丢失问题

MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决以下问题:

  1. 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
  2. 解决脏读,幻读、不可重复读等事务隔离问题,但是不能解决更新丢失问题

8.mybatis的优缺点有哪些?
1Mybait的优点:

  • 简单易学,容易上手(相比于Hibernate)基于SQL编程:
  • IDBC相比,减少了50%以上的代码量,消除了IDBC大量冗余的代码,不需要手动开关连接:
  • 很好的与各种数据库兼容(因为MyBatis使用IDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持,而IDBC提供了可扩展性,所以只要这个数据库有针对lava的jar包就可以就可以与MvBatis兼容),开发人员不需要考虑数据库的差异性。
  • 提供了很多第三方插件(分页播件/逆向工程);(5)能够与Spring很好的集成;
  • MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,解除sql与程序代码的耦合,便于统一管理和优化,并可重用。(7)提供XML标签,支持编写动态SQL语句。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射。(9)提供对象关系映射标签,支持对象关系组建维护。

2、MyBatis框架的缺点:

  • SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

9.MySQL的隔离级别有哪些?

MySQL定义了四种隔离级别,包括一些具体规则,用于限定事务内外哪些改变是可见的,哪些改变是不可见的。低级别的隔离一般支持更高的并发处理,并且拥有更低的系统开销。
READUNCOMMITTED读取未提交内容
I
在这个隔离级别,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。本隔离级别很少用于实际应用,因为它的性能也不必其他性能好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称为“脏读"
READ COMMITTED读取提交内容
大多数数据库系统的默认隔离级别(但是不是MySQL的默认隔离级别),满足了隔离的早先简单定义:一个事务开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”。这意味着用户运行同一个语句两次,看到的结果是不同的。
REPEATABLE READ 可重复读
MvSOL数据库默认的隔离级别。该级别解决了READUNCOMMITTED隔离级别导致的问题。它保证同一事务的多个实例在并发读取事务时,会"看到同样的"数据行。不过,这会导致另外一个鼓手问题"幻诗”InnoDB和Falcon存储引擎通过多版本并发控制机制解决了幻读问题,
SERIALIZABLE可串行化
该级别是最高级别的隔离级。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之。
SERIAUZARIF早在个请的数据行上加铺 在这个级别可能导致大量的超时Timeout和销音争lock Contention现象

 10.mysql复制原理是什么?
(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个/OThread请求master二进制事件
(3)同时主节点为每个1/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SOL线程从中继日志中读取二进制日志。在本地重放,使得其数据和主节点的保持一致,最后i/OThread和SOLThread将进入睡眠状态,等待下一次被唤醒
也就是说:
.从库会生成两个线程一个IO线程,一个SQL线程:
IO线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;主库会生成一个logdump线程,用来给从库1/O线程传binlog
*SQL线程,会读取relaylog文件中的日志,并解析成sq语句逐一执行:
注意:

  • master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
  • slave开启两个线程:IO线程和SQL线程。其中:10线程负责读取master的binlog内容到中继日志relaylog里: SOL线程负责从relaylog日志里读出biniog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
  • Mysqi复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
  • Mvsai复制最好确保master和slave服务器上的Mvsl版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)5--master和slave两节点间时间需同步

  具体步骤:
1、从库通过手工执行change masterto语句连接主库,提供了连接的用户一切条件(userpassword. portip),并且让从库知道,二进制日志的起点位置(file名position号);start slave
2、从库的1O线程和主库的dump线程建立连接。
3、从库根据changemasterto语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlogevents,并存放到本地relaylog中,传送过来的信息,会记录到masterinfo中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-loginfo中,默认情况下,已经应用过的relay会自动被清理purge

11.mysql聚簇和非聚簇索引的区别是什么?

索引存在磁盘,mysql的索引类型跟存储引擎是相关的,innodb存储引擎数据文件跟索引文件全部放在ibd文件中,而
myisam的数据文件放在myd文件中,索引放在myi文件中,其实区分聚簇索引和非聚簇索引非常简单,只要判断数据跟索引是否存储在一起就可以了
innodb存储引擎在进行数据插入的时候,数据必须要跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一键,没有唯一键就使用6字节的rowid,因此跟数据绑定在一起的就是聚簇索引,而为了避免数据冗余存储,其他的索引的叶子节点中存储的都是聚簇索引的key值,因此innodb中既有聚簇索引也有非聚簇索引,而 myisam中只有非聚簇索引。

12.spring、springmvc、springboot的区别是什么?
spring和springMvc:
1.spring是一个一站式的轻量级的iava开发框架,核心是控制反转(OC)和面向切面(AOP),针对于开发的 WEB层(springMvc)、业务层(loc)、持久层(jdbcTemplate)等都提供了多种配置解决方案;
2.springMvc是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中
WEB层开发的一部分; I 
springMvc和springBoot:
1springMvc属于一个企业WEB开发的MVC框架,涵盖面包括前端视图开发、文件配置、后台接口逻辑开发等,XML、config等配置相对比较繁琐复杂;
2、springBoot框架相对于springMvc框架来说,更专注于开发微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置xml,相对springmvc,大大简化了配置流程;
总结:
1Spring框架就像一个家族,有众多衍生产品例如bootsecurityjpa等等。但他们的基础都是Spring的 ioc、aop等ioc提供了依赖注入的容器,aop解决了面向横切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能;
2、springMvc主要解决WEB开发的问题,是基于Serviet的一个MVC框架,通过XML配置,统一开发前端视图和后端逻辑;

3、由于Spring的配置非常复杂,各种XMLavaConfig、servlet处理起来比较繁琐,为了简化开发者的使用,从而创造性地推出了sprineBoot框架,默认优千配置,简化了springMvc的配置流程:但区别干springMvc的是 springBoot专注于单体微服务接口开发,和前端解耦,虽然springBoot也可以做成springMvc前后台一起开发,但是这就有点不符合springBoot框架的初衷了;

13.LinkedList和ArrayList区别?

插入和删除数据比较多的时候用LinkedList(是从头开始访问),访问数据比较多可用ArrayList(直接访问某一节点)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值