java复习1

面向对象编程
优点
代码模块化,提供更好的可重用性,可扩展性和可维护性
特性
封装Encapsulation
将对象的实现细节隐藏起来,通过一些公用方法暴露该对象
多态Polymorphism
给不同的底层数据类型做相同的接口展示
一个多态类型的操作可以应用到其他类型的值上面
同一个类型的对象在执行同一个方法时,表现出多种行为特征
子类对象赋值给父类,运行时表现子类的特征
继承Inheritance
从基类获得方法和字段
提高的代码的重用性
抽象
把类的行为和实现细节分离开
抽象&封装
抽象关注对象的行为
封装可以看成是提供抽象的一种策略
Java虚拟机
是一个可执行Java字节码的虚拟机进程,Java源文件被编译成能被Java虚拟机执行的字节
码文件
知道底层硬件平台的指令长度和其他特性
JDK
java开发工具包,完整的Java软件开发包,包含jre,编译器和javaDoc,Java调试器等
可以让开发者开发,编译执行Java应用程序
JRE
运行时环境,执行Java程序的虚拟机,包含applet需要的浏览器插件
static
表明一个类的变量或成员方法 可以在没有所属类实例的情况下被访问
static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,static是编译时静态绑
定的
当类被Java虚拟机加载时,会对static变量初始化,不用实例来访问非static的变量,编译
器会报错
8大数据类型
byte short int long float double boolean char
自动装拆箱
Java编译器在基本数据类型和对应的对象包装类型之间的一个转换
overriding覆盖&overloading重载
重载:同一个类中,方法名相同,参数不同
覆盖:相同的方法名,传参类型,返回类型
构造方法(构造函数)
创建新对象时,调用对象的构造方法
构造方法重载
每一个构造方法都必须有自己唯一的参数列表
Java不支持多继承,可以实现多个接口
接口类&抽象类
接口类中所有方法都是抽象的,抽象类可以同时包含抽象方法和非抽象方法
可以实现多个接口,不可以继承多个抽象类
实现接口声明的所有方法,可以不用继承抽象类所有的方法,这种情况下,此类也
必须时抽象类
抽象类可以在不提供接口方法实现的情况下实现接口
接口类中声明的变量默认时final,抽象类可以包含非final的变量
接口类中成员默认public,抽象类中成员可以是private protected 或public
。。。
值传递和引用传递
值传递,传递对象的一个副本,不会影响源对象的值
引用传递,引用对象的改变会反映到所有的对象上
Java线程
进程:正在执行的应用程序
线程:进程内部的一个执行序列,一个进程可以有多个线程,又叫轻量级进程
创建线程
继承Thread类
实现Runnable接口
实现Executor框架来创建线程池
线程的几种可用状态
就绪runnable:准备,不一定立马就能执行
运行中running:正在执行的代码
等待waiting:线程处于阻塞状态,等待外部的处理结果
I/O阻塞blocked on I/O:等待I/O操作完成
睡眠中sleeping:线程被强制睡眠
同步阻塞blocked on synchronization:等待获取锁
死亡dead:线程完成了执行
同步方法&同步代码块
每一个对象都有一把锁
线程可以通过synchronized关键字类获取对象上的锁
synchronized关键字可应用在方法级别(粗粒度锁)或者是代码级别(细粒度锁)
监视器和锁在Java虚拟机中是一块使用的
监视器监视一个同步代码块,确保一次只有一个线程执行同步代码块
每一个监视器都与一个对象引用相关联,程序在获取锁之前不能执行同步代码块
死锁
两个进程都在等待对方执行完毕后才能继续往下执行的时候就发生了死锁现象,结果是
两个进程都陷入了无限的等待中
避免死锁:指定获取锁的顺序,并强制线程按照指定顺序获取锁,
因此,每个线程都以同样的顺序获取锁和释放锁,九不会出现死锁
集合类:支持对一组对象进行操作的接口和类
基本接口
Collection:代表一组对象,每一个对象都是他的子元素
Set;不包含重复元素的collection
List:有顺序的collection,可以包含重复元素
Map:可以把键key映射到值value的对象,键不能重复
集合类没有实现clone able和serializable
集合类接口指定一组叫元素(element)的对象,
集合类接口的每一个具体的实现类都可以选择自己的方式对元素惊醒保存和排序,有的
允许重复的键,有的不允许
迭代器
Iterator接口提供了很多对集合类元素的迭代方法
每一个集合类都包含可以返回迭代器实例的迭代方法
迭代器可以在迭代过程中删除底层集合的元素
Iterator&ListIterator
iterator可以遍历set和list—listiterator只能遍历list
iterator只可以前向遍历,listiterator可以双向遍历
listiterator实现了iterator接口,并进行了扩展:增加元素,替换元素,获取前一个和后
一个元素的索引…
HashMap是以键值对形式存储数据的
HashMap需要一个hash函数,使用hashCode()和equals()方法 向集合/从集合 添加和检索元

调用put()方法–>计算key的hash值–>把键值对存储到集合中合适的索引上
key已经存在,value会被更新
特性
容量capacity 负载因子load factor 扩容极限threshold resizing
使用hashCode()和equals()方法 保证精确性和正确性
确定键值对的索引 根据键获取值
发现重复元素
HashMap&HashTable
HashMap允许键值为nullHashTable不可以
HashTable是同步的HashMap不是,因此HashMap更适合于单线程环境,HashTable适用
于多线程

Array(数组)&&ArrayList(列表)
Array可以包含基本类型和对象类型,ArrayList只可以包含对象类型
Array大小固定ArrayList大小动态变化
ArrayList提供了更多的方法和特性:addAll() removeAll() iterator()等等
对于基本类型数据,集合使用自动装箱减少编码工作量,当处理固定大小的基本数据类
型时i,这种方式相对比较慢
&LinkedList
ArrayList基于索引的数据接口,底层是数组
LinkedList是以元素列表的形式存储他的数据,每一个元素都和他的前一个和后一个元素
连接在一起
相对于AyyarList,LinkedList插入,添加,删除操作速度更快,不需要像数组那样重新计
算大小或者是跟新索引
LingkedList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个,
一个指向后一个
Comparable&&Comparator
java提供了只包含一个compareTo()方法的Comparable接口,这个方法可以给两个对象排
序,返回负数,0,正数表明输入对象小于等于大于已经存在的对象
Java提供包含compare()和equals()两个方法的接口Comparator接口,
compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数小于等
于大于第二个参数
equals()方法需要一个对象作为参数,决定输入参数是否和Comparator相等,只有输入
参数是一个Comparator并且和当前Comparator的排序结果是相同的时候,这个方法才
返回true
Java优先级队列(Priority Queue)
基于优先级堆的无界队列,
他的元素按照自然顺序(natural order)排序
在创建的时候,我们可以给他提供一个负责给元素排序的比较器
不允许null值,。。。
不是线程安全的
大O符号(big-O notation)
大O符号描述了当数据结构里面元素在增加的时候,算法规模或者性能最坏的场景下有
多好 也描述其他行为,比如:内存消耗
因为集合类实际上是数据类型,我们用大O符号基于时间,内存和性能来选择最好的实
现,大O符号可以对大量数据的性能给出一个很好的说明
权衡有序数组和无序数组
有序数组优点是查找的时间复杂度是O(log n),无序数组是O(n)
无序数组优点是插入时间复杂度是O(1),有序数组是O(n)
集合类框架的最佳实践
元素的大小是事先知道,而且固定,Array
有些集合类允许指定初始容量,因此,我们能估计出存储元素的数目,我们可以设置初
始容量,避免重新计算hash值或者是扩容
为了类型安全,可读性强,健壮性,我们总是使用泛型,使用泛型可以避免运行时
ClassCastExceptin
使用JDK提供的不变类(immutable class)作为Map的键可以避免我们自己的类实现
hashCode()和equals()方法
底层集合实际上是空的情况下,返回长度是0或者是数组,不要返回null
Enumeration&&Iterator
Enumeration速度是Iterator的两倍,同时占用更少的内存
Iterator远远比Enumeration安全,因为其他线程不能修改正在被Iterator遍历的集合里面
的元素,
Iterator允许调用者删除底层集合中的元素,Enumeration不可以
HashSet&&TreeSet
HashSet是有一个hash表来实现的,因此,他的元素无序,
add()remove()contains()方法时间复杂度是O(1)
TreeSet是有一个树形结构来实现的,元素是有序的,
add()remove()contains()时间复杂度是O(log n)
垃圾回收器(Garbage Collector)
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放资源和重用资源
System,gc()&&Rentime.gc()
-两个方法用来提示JVM要进行垃圾回收,但是,立即回收还是延迟回收取决于JVM
-在释放对象占用的资源之前,垃圾收集器会调用finalize()方法,一般在方法内释放对象
持有的资源
如果对象的引用被置为null,垃圾回收器不会立即释放对象占用的资源,在下一个垃圾回
收周期,之歌对象将是可被回收的
Java的堆结构
-JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存,他在JVM启动
时被创建,对象所占用的堆内存是由自动内存管理系统也就是垃圾回收器回收
-堆内存是由存活和死亡的对象组成,存活的对象是应用可以访问的,不会被垃圾回收
器回收,,死亡的对象是不可访问尚且未被垃圾回收器回收的对象,一直到垃圾回收
器回收这些对象之前,他们会一直占用堆内存空间
串行(serial)收集器&&吞吐量(throughout)收集器
吞吐量收集器使用并行版本的新生代垃圾收集器,用于中等和大规模数据的应用程序
串行收集器对大多数的小应用
当对象对当前使用这个对象的应用程序变得不可触及的时候,可以被回收了
JVM的永久带(Perm Gen Space) 堆中的永久带
垃圾回收不会发生在永久带,
如果永久带满了或者超出了临界值,会触发完全垃圾回收(full GC)
正确的永久带大小对避免FullGC是非常重要的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值