- java基本数据类型
(说明:所有取值范围的计算方式为:2的位数减一次方~~~~2的位数次方减一)
Byte:8位 取值范围-128~127(-2^7 ~(2^7)-1 )
Short:16位 取值范围-32768~32767 (-2^15 ~(2^15)-1 )
Int:32位 取值范围(-2^31 ~(2^31)-1 )
long:64位 取值范围(-2^63 ~(2^63)-1 )
Float:32位 1bit(符号位) 8bits(指数位) 23bits(尾数位)
精度是由尾数的位数来决定的,2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
Double: 64位 有效位数为17-18位
Char:16位
Boolean
- List
list接口继承collection接口,collection接口继承iterable接口。
List特性
- 可以存放同一类型的元素
- 内部维护元素之间的顺序,是有序集合
- 元素是可以重复的
List接口的实现类:
- Arraylist
ArrayList内部存储的数据结构是数组存储。数组的特点:元素可以快速访问,每个元素之间紧邻的,不能有间隔,缺点:数组空间不够元素存储需要扩容的时候会开辟一个新的数组把旧的元素copy过去,比较消耗性能。从ArrayList中间位置插入和删除元素时都需要循环移动元素位置,因此,ArrayList 适合查询和修改操作,不适合插入和删除操作。
- Vector
vector内部实现和ArrayList一样都是数组存储,但是vector支持线程的同步,所以访问比ArrayList慢,但是数据安全,所以对元素的操作没有并发操作的时候ArrayList比较快。
- LinkList
LinkList内部存储用的数据结构是链表。链表的特点:适合动态的插入和删除。访问遍历比较慢。不支持get,remove,insert,list方法。可以当做堆栈、队列及双向队列使用。Linklist是线程不安全的。所以需要同步的时候需要自己手动同步,比较费劲,可以使用提供的集合工具类实例化的时候同步:具体使用List springoklist=Collections.synchronizedCollection(new 需要同步的类);
ArrayList和Vector主要区别如下:
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是;">
(2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
3、HashMap ArrayList 默认大小
ArrayList 默认容量:10 增长数量变化为10--16--25(增加当前的一半加一个)
HashMap 默认容量:16 增长数量为2倍
4、HashMap 、HashTable、TreeMap
1、HashMap 非线程安全,HashTable线程安全
2、HashMap 键和值都允许有null存在,HashTable 不允许
3、因为线程安全问题,HashMap效率比HashTable高
4、ConcurrentHashMap是线程安全的HashMap的实现,HashTable同步是通过synchronize关键字对对象进行枷锁,而concurrentHashMap基于lock操作的,保证同步的时候锁住的不是整个对象
TreeMap 简介
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。
TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。
TreeMap主要使用于基于排序的统计功能。
5、序列化
Java序列化是指把java对象转换为字节序列的过程;
反序列化是指把字节序列恢复为java对象的过程。
序列化方式:
实现Serializable接口,通过ObjectOutputStream序列化非transient的实例变量。通过ObjectInputStream进行反序列化。
实现Externalnalizable接口,不分是否被transient修饰都会被实例化。
6、 多线程
多线程的实现:
- 继承thread类
- 实现runnable接口
线程的启动:
Start();
线程的生命周期:
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。
调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。
1. start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发
多线程并发包:CountDownLatch????
- Java三大特性
- 、封装
- 、继承
- 、多态、
- 接口/抽象类/多态
抽象类:抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。(说白了就是提前定义好方法,子类好继承)。
接口:接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
两者的区别:
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
多态:多态是同一个 行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同的操作,
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩展性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件:
- 继承2、重写、3父类引用指向子类对象
(多态详情及相关案例:http://www.runoob.com/
- 重载、重写
重载:
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重写:
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
(3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
10、StringBuilder StringBuffer
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
11. Java设计模式
https://blog.csdn.net/u014537931/article/details/94632640
12.spring MVC 的工作原理
13.spring 的工作原理
14.spring bean的生命周期