a++:在数据使用之后自增
++a:在数据使用之前自增
逻辑与和短路与,用&连接的两个条件的最后结果计算第一个表达式为false也会计算第二个表达式,而&&如果第一个表达式为false整个表达式直接为false跳过第二个判断表达式
JVM,即Java Vistual Machinal,虚拟机
比较常见的功能就是,
1.提供了Java语言的跨平台性,对于相同的源码会根据操作系统的不同或者版本的不同会编译成不同的字节码文件,从而兼容各个操作系统
2.GC,即Garrbish Collection,垃圾回收机制
因为系统内存是有限的,一旦内存达到的极限我们无法再向其中添加对象,类,方法等,所以JVM提供了垃圾回收机制,根据分代回收算法对不同的对象进行回收,回收无用的内存空间,以提高系统运行性能
GC,即Garbish Collection,垃圾回收机制
参上
数组没有方法,更没有length方法
String有length()方法,查看当前字符串的字符个数
多态,在Java中我们将类型分为编译时类型和运行时类型,如果编译时类型与运行时类型不一致,那我们就称之为多态
多态的三个前提:
父类引用指向子类对象
继承或实现关系
方法重写
不可以,它是一个Final最终类
不可以,它是一个Final最终类
int是基本数据类型,Integer是引用数据类型,我们也称其为基本数据类型的包装类
Integer默认为null,int没有默认值,使用前必须赋值,不然编译报错
继承和实现的区别,Java类只支持单继承,但是接口之间支持多继承,Java类支持多实现,即一个类可以实现多个接口,接口与接口之间不能实现;
继承,即继承父类的非私有属性和非构造或私有方法,可以对父类的方法进行重写,通过可以添加自己独有的属性和方法,如果父类是抽象类,子类必须重写其抽象方法,除非子类也是抽象类;
实现,即子类实现接口,需要实现接口中的所有方法,如果是抽象类也可以不实现;
不可以,但是可以通过super关键字调用父类的构造器
接口可以继承接口
抽象类可以实现接口
抽象类可以继承具体类
抽象类中可以有静态main方法
1.加载阶段
类加载到方法区,生成类对象
2.连接阶段
验证->准备(静态分配)->解析(常量,显式关键字)
3.初始化阶段
静态Field初始化
封装:私有化属性,对外提供get/set方法,即内部结构对外是透明的
继承:Object是基类,所有的类都继承与Object类,子类继承父类可以使用父类的属性和方法,可以重写方法
多态:对于同一个父类的方法,不同子类有不同的实现,从而实现同一个类型不同阶段下实现不同的功能
抽象:当前类的相关方法不能确定其具体实现,就将实现交给子类
Math,String,StringBuffer,StringBuild,SimpleDateFormat,ArrayList,LinkedList,HashMap…
集合分为两大体系,Collection和Map
HashMap底层是哈希表的数据结构,哈希表的数据结构特点就一个字,快,能够在最短时间内获得想要的数据
HashMap使用了链表来解决哈希冲突
对于所有key,哈希表会通过哈希函数获得一个哈希值,只要key是相同的则哈希值一定相同,然后如果两个key的哈希值相同,HashMap则通过链表将key连接起来,当我们查询的时候我们就可以通过key很快的得到哈希值并找到其所在的位置,然后在通过equals()方法比较是否是同一个key将其拿出来
扩容机制的话我们需要知道当前哈希表的填充因子,HashMap的填充因子是0.75,即当哈希表中哈希值的数量达到了哈希表最大容量的0.75那么HashMap就会进行扩容,这也是哈希表所希望的,因为哈希表的性能会随着元素的个数越多而下降,而通过扩容,哈希表可以将元素再次计算打散,使得哈希表的性能得到提升
HashSet底层就是直接使用HashMap存值所以存储原理就是参上的原理
list用来存储一系列有序且允许重复的单个对象
map用来存储无序且唯一个键值对
ArrayList:底层由动态数组实现,线程不安全
LinkedList:底层由双向链表实现,在中间插入和删除元素快
Vector:底层由动态数组实现,线程安全
HashSet:
TreeSet:
HashMap: HashMap的是Map集合的常用实现类,底层采用的是哈希表的数据结构存放数据的。特点是插入和查询速度很快。但是随着元素个数越来越多,效率会有所下降,但是仍然是效率很高的一种数据结构。HashMap的key值是无序且不重复的。
TreeMap:底层采用的红黑树实现的,相对于哈希表,红黑树的插入和查询速度要慢,但是红黑树可以维护元素本身的字典顺序,所以需要对key排序的是时候才考虑使用TreeMap
linkedHashMap:和HashMap相比,多了一个链表维护插入顺序,所以插入和删除性能有所下降,但是查询的速度会比HashMap要快,并且可以按插入的顺序遍历
通过LinkedHashMap实现有序,具体实现同上
Set底层就是Map,Map底层由不同的实现类决定
HashMap是线程不安全的,性能高,key和value都不允许为null
Hashtable是线程安全的,性能低,key和value允许为null,且只有一个null
Collections是工具类,用于集合的排序等…
Collection是单列集合的父接口
List:存储有序可以重复的对象,可以用下表遍历
Set:存储无序唯一的对象,不可以下标遍历
Collections集合工具类
Iterator迭代器
Comparator比较器
Collection.sort(Collection c,Comparator c)
如果不适用工具类可以使用排序算法,比如快速排序,希尔排序,归并排序,堆排序,基数排序
ArrayList: 通过动态数组的方式存储对象,查找和向后追加元素效率高
LinkedList:通过双向链表的方式存储对象,连续位置添加和删除效率高
联系: Set的存储是通过Map来实现的
区别: Set存储单个对象无序且唯一, Map存储键值对(key-value),key无序且唯一
HashMap:
查询和插入速度极快,但是线程不安全,在多线程情况下在扩容的情况下可能会形成闭环链路,耗光cpu资源。
LinkedHashMap:
基本和HashMap实现类似,多了一个链表来维护元素插入的顺序,因此维护的效率会比HashMap略低。但是因为有链表的存在,遍历效率会高于HashMap。
ConcurrentHashMap:
线程安全的,采用了分段锁的机制实现数据同步,因此相对于Hashtable来说效率要高,所以我们一般在多线程情况下都是用ConcurrentMap,但是由于引入了分段锁,底层每次进行元素的插入和获取,需要进行两次哈希算法,第一次先确定段,第二次才能找到数组坐标,因此效率低于HashMap,不过在多线程情况下用来保证数据安全性是值得的,
RuntimeException:可以编译通过,运行时报错
一般异常:检查异常,编译器就会报错,需要处理异常后运行
finally在return中间运行return的数据无法再finally中修改后return
NullPointException
ClassNotFoundException
ClassFormatException
NumberFormatException
算术异常
迭代异常
IllegerAgrumentExcetion
NIO底层采用的是内存映射实现,因此效率会比普通的IO效率要高
N基于通道与缓冲区操作的流,是非堵塞的
IO是基于读写操作的是堵塞的,效率低于NIO
在需要创建和销毁大量临时线程时,可以使用线程池减少线程创建和销毁的消耗
不是
start(),如果直接调用run()则会像调用普通方法一样执行run方法中的内容,就不会有争抢cpu时间片的过程
sleep()是Thread类中的静态方法,当一个线程调用sleep()方法以后不会释放同步资源锁,其他线程仍然会等待资源锁的释放
wai()方法时Object类提供的一个普通方法,而且必须同同步资源锁对象在同步代码或者同步方法资源锁从而继续往下执行
继承Thread的方法
使用这种方法,当前类就是代表一个线程类,可以直接调用start方法启动线程,在线程执行体中药获取当前正在执行的线程只需要通过this关键字就可以了,缺点在Java的单继承特性,一旦当前类继承了Thread类就没有办法在继承其他类了
实现Runable接口的方式
使用这种方法,当前类并不代表线程,只是代表线程的一个执行体,想要启动线程还必须new一个Tread对象,将执行体对象传到构造器中执行,好处是在于Runnable回一个接口,并不会导致其类无法继承其他类,缺点就是稍微有点麻烦,获取当前正在执行的线程不能用this关键词,只能采用Thread.currentThread()方式
使用Callable和Future创建线程
这种方式创建线程可以有返回值
当多个线程互相争抢资源的时候回造成数据不一致,通过线程安全可以保证数据的一致性,
线程安全可以通过以下方式来加锁
1.同步代码块
2.同步方法
3.互斥对象锁
普通方法:要确保调用该方法的对象是同一个对象才能确保线程的安全
静态方法属于类,可以一定确保线程的安全
细粒度不一样,
同步代码块作用范围是{}中
同步方法作用于整个方法
1.实例化线程对象
2.开启线程start
3.进入就绪状态
4.cpu调度后进行运行状态,执行run()方法
5.当cpu调度另一线程,或者当前线程进入阻塞状态后重新回到就绪状态
6.线程的结束
线程池可以提高线程的创建和销毁的开销
jdk提供一下集中线程池:
1.newSingleThreadExecutor单线程的线程池
只有一个线程在执行,相当于单线程执行任务
2.newFixedThreadPool(固定大小的线程池)
固定线程数处理任务,当任务过多则固定线程数谁先执行完任务就执行剩余任务
3.newScheduledThreadPool(可缓存的线程池)
如果线程池长度超过处理需要可灵活回收空闲线程,若无可回收,则新建线程
多线程是程序中的多条执行路径,每个线程在程序中互抢资源;在购票系统,通讯聊天中可以用到多线程
newCachedThreadPool:带缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
无连接的传输协议,数据不安全,性能高
建立连接的传输协议,数据安全,性能低
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
应用层,传输层,网络层.网络接口层
一种可靠的安全传输协议,传输效率低,需要建立连接,经过三次握手
超文本传输协议,是一种明文的传输协议
https进行加密的传输协议
请求行,请求头,空行和请求体4个部分组成
SAX,DOM,PULL
运行时获得类属性的能力
重点在于运行时
通过反射机制可以获取私有的属性,方法构造器
在应用上更灵活,例如文件注入方面的使用,通过加载类名,可以得到所属属性对象的信息
平常用什么工具解析json?xml转换成json字符展示出来是什么样子?
解析json的工具json-lib,Gson,Fast-json
xml解析为josn