String,Stringbuilder和Stringbuffer的区别
- String底层使用一个不可变的字符数组private final char value[];所以它内容不可变。
- StringBuffer和StringBuilder都继承了AbstractStringBuilder底层使用的是可变字符数组:char[] value;
- StringBuilder是线程不安全的,效率较高;而StringBuffer是线程安全的,效率较低。
- 通过他们的append()方法来看,StringBuffer是有同步锁,而StringBuilder没有
io流用的是什么设计模式?
- 装饰者设计模式:给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,
装饰对象持有被装饰对象的实例(各种字符流间装饰,各种字节流间装饰) - 适配器设计模式:有时候我们需要实现一个接口,但那个接口可能有很多抽象方法,我们只需要其中一个或多个方法。
这时候我们可以创建一个类(适配器)实现接口,并重写接口中所有方法(空方法,有方法体,但方法体中无内容)。
当我们需要接口中的某个方法时,只需继承类似于适配器的类 ,然后重写对应的方法即可。
将某个类的接口转换成我们期望的另一个接口表示,目的是消除由于接口不匹配所造成类的不兼容问题(字符流与字节流间互相适配)
hashMap和hashTable的区别?
- hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
- hashMap允许空键值,而hashTable不允许
- HashMap线程不安全,效率高。HashTable线程安全,效率低。
- HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast(就是最快的时间能把错误抛出而不是让程序执行。)的。
HashMap 的实现原理
- HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体
- 当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
hashTable的实现
- 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。
Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
Hashtable中的映射不是有序的。
ConcurrentHashMap底层怎么实现的
- 锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问
ConcurrentHashMap将整个Map分为N个segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认N为16
数据库:怎么优化的?
- 将表中字段的宽度设得尽可能小
- 尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值
- 使用联合(UNION)来代替手动创建的临时表
- 使用事务操作数据库:BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book'; COMMIT;
(事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。) - 使用索引:选择合适的索引列,选择在where,group by,order by,on从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引
- 根据业务需求分割数据库表
Redis有哪些数据类型,用Redis做过一些什么
- Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
Spring中用到了哪些设计模式
- 工厂设计模式
单例设计模式
代理设计模式
模板方法设计模式
观察者设计模式
适配器设计模式
装饰者设计模式
策略设计模式