封装、继承、多态
Java中实现多态的机制是什么?
父类持有子类的实例化对象。有一个前提,子类必须覆写父类的相关方法。
类是对象的抽象,接口是功能的抽象。
类可以直接实例化,接口可以持有实现该接口的实例化对象。
抽象类和接口的区别?
byte 1
char 2
short 2
int 4
float 4
double 8
long 8
boolean 1
String是引用类型。他是final的。
Throwable
Java中所有异常的根类是:java.lang.Throwable。
异常分类
大类上分Error和Exception。
Exception又分:运行时异常(Runtime Exception),又称系统异常和受检查的异常(Checked Exception ),又称普通异常。
Java异常有一个原则,如果catch里面遇到return或异常或其他任何能使方法终止的情况。都会先去执行finally里面的内容,然后再回来进行return或退出方法的操作;如果finally里面也有return,那么久不会再回到catch里面了。
一个是存储单列数据的集合,List 中存储的数据是有顺序,并且允许重复。
ArrayList 内部是用Object[]实现的。如果构造方法为空,则以系统默认的数值确定数组大小(为0);如果传入int值,就以传入int值确定;如果传入集合,就调用集合toArray()方法,将该数组结合直接复制给内部数组。
自动扩容,如果小于等于常量值的一半,就扩一半,如果超过,就扩需要扩容的一半。
删除机制:删除一个,将其后的通过System.arraycopy();将后面的整体向前移一位,将最后一个置为null。
保存相关联的键值对,是存储键值对式的双列数据的集合。数据是没有顺序的,其键是不能重复的,值是可以有重复的。
1 for Entry
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
使用Iterator
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
HashMap,是数组链表。一个数组,每一项是一个链表。
Set不保存重复元素。
Comparator.compare()
返回负是升序排序,O1 - O2,把大的放后面;返回正是倒序排序,O2 - O1,会把大的放前面。
在集合中线程安全的只有:Vector 和 HashTable是。
Collections.synchronizedXXX()可以让对应的List,Map,Set成为安全的。
成为线程安全的都是在其核心方法上加上了synchronized。
java 中有普通集合、同步(线程安全)的集合、并发集合。
普通集合通常性能最高,但是不保证多线程的安全性和并发的可靠性。
线程安全集合仅仅是给集合添加了 synchronized 同步锁,严重牺牲了性能,而且对并发的效率
就更低了。
并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率。
并发集合常见的有 ConcurrentHashMap、ConcurrentLinkedQueue等。并发集合位 于 java.util.concurrent 包 下 。
字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于InputStreamReader 和OutputStreamWriter。
必须实现Serializable 接口,然后再需要的地方使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化。
在底层设备是只支持字节流的。由于字符流操作太常用,字符流是字节流的包装类。字符字节转化时,需要注意编码问题。本质上就是将字符转为该编码的字节形式。
Robert Martin大师提出了面向对象设计原则----依赖倒置原则:
A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽象。
B. 抽象不能依赖于具象,具象依赖于抽象。
例如:车和发动机。车不应该依赖具体的发动机,当需求变更换时是可以更换的。
实现抽象的具体肯定是要依赖抽象的,抽象不应该去依赖别的具体,应该依赖抽象。
控制反转(IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。是一个思想概念,一般具体实现用:依赖注入。
在配置文件中进行配置,通过反射创建对象。将对象的控制权转移出去,交给IOC容器。原先车依赖具体发动机,转为车依赖IOC容器,动态生成。
依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
Spring主要有三种:构造方法注入,setter注入,基于注解的注入。
注解的注入:主要通过两个概念来实现IoC,首先通过注解或配置文件,将对象和依赖对象都配置到某个XML文件中或注解来,然后通过架构中的BeanFactroy类,来自动实现上文所述注入过程。