电子商务网站建设及推广方案,建站公司咨询,网站建设最贵多少钱,学平面设计哪个学校好Java的学习
方法参数多态#xff08;向上和向下转型#xff09;
向上转型#xff1a;
class Text{public static void main(String[] args) {Animals people1 new NiuMa();people1.eat1();//调用继承后公共部分的方法#xff0c;没重写调用没重写的#xff0c;重写了调…Java的学习
方法参数多态向上和向下转型
向上转型
class Text{public static void main(String[] args) {Animals people1 new NiuMa();people1.eat1();//调用继承后公共部分的方法没重写调用没重写的重写了调用重写后的。}
}
父类引用子类对象Fu dui1 new Zi();
可用该对象调用继承后公共部分的方法若该方法被子类重写则调用重写后的方法。
向下转型
class Text{public static void main(String[] args) {Animals people2 new NiuMa();//要先发生一次向上转型NiuMa people3 (NiuMa) people2; //将people2强制类型转换成NiuMa类用people3接收people1.eat1();people3.sleep();}
}
要先发生向上转换Fu dui2 new Zi();
向下转换Zi dui3 (ZI) dui3; 接下来是读书笔记
时间复杂度
所有代码的执行时间T(n)与每行代码的执行次数n成正比在分析一个算法或者一段代码的时间复杂度的时候只关注循环执行次数最多的那一段代码就好了。
加法法则
总复杂度等于两级最大的那段代码的复杂度
乘法法则
嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
最好、最坏情况时间复杂度
分别对应着最理想的情况下或者最糟糕情况下执行这段代码的时间复杂度
均摊时间复杂度
平均复杂度只在某些特殊情况下才会用到而均摊时间复杂度应用的场景比它更加特殊、更加有限。 数组
线性表
线性表包括数组链表、队列、栈等。
如果问到数组和链表的区别
回答:链表适合插入删除时间复杂度是O(1)数组适合查找查找的时间复杂度是O(1)。
但是这个回答不是准确的数组是适合查找操作但是查找的时间复杂度不是O(1)即使是排序好的数据用二分查找时间复杂度也是O(logn)。正确的表述应该是数组支持随机访问根据下标随机访问的时间复杂度为O(1)
注意
1.防止数组越界问题
2.容器不能完全代替数组 容器的优势可以将很多数组操作的细节封装起来支持动态扩容最好在创建ArrayList的时候指定数据大小 数组的优势 Java ArayList无法存储基本类型int、long需要封装为Integer、Long类就会有一定的性能消耗 如果对数据操作非常简单用数组更好
非线性表
非线性表包括二叉树、堆、图等。 链表
对于数组来说需要一块连续的内存空间来存储对内存的要求比较高如果我们申请一个100Mb大小的数组如果有充足的空间但是没有连续的足够大的空间仍然会申请失败。
而链表将一组零散的内存块串联在一起其中吧内存块称为链表的结点为了把所有结点串起来每个链表的结点出来存储数据之外还需要记录链上下一个结点的地址把这个记录下一个结点地址的指针称为后继指针next。 单链表
第一个结点是头结点最后一个结点是尾结点尾结点的后继指针是指向NULL空地址的。
在进行数组的插入、删除操作时为了保持内存数据的连续性需要做大量的数据搬移所以时间复杂度是O(n)。而在链表中插入或者删除一个数据我们并不需要为了保持内存的连续性而搬移结点因为链表的存储空间本身就不是连续的。所以在链表中插入和删除一个数据是非常快速的。 但是对于随机访问第k个元素就没有数组那么高效根据指针一个结点一个结点地依次遍历直到找到相应的结点。
循环列表 和单链表有一个区别尾结点指向的是头结点此时首尾相连循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时就适合采用循环链表。
双向链表 单向链表只有一个方向因为节点只有一个后继指针next指向后面的结点。但是双向链表的结点还有一个前驱指针prev指向前面的结点。
如果存储同样多的数据双向链表要比单链表占用更多的内存空间。虽然两个指针比较浪费存储空间但可以支持双向遍历这样也带来了双向链表操作的灵活性。
链表的删除操作 删除结点中“值等于某个给定值”的结点 删除给定指针指向的结点。
第一种删除的情况对于单链表和双链表来说为了找到给定值的结点都需要从头开始遍历比对知道找到给定值的结点然后进行删除。
第二种删除的情况是知道要删除的结点但是我们要知道该结点的前驱指针和后继指针才能连接前一个结点和后一个结点从而删除结点。对于单链表来说为了找到前驱结点需要从头结点开始遍历链表知道p-nextq说明p是q的前驱结点时间复杂度为On。而双向链表直接存在一个前驱指针可以直接连接要删除结点的前驱结点和后继结点达到删除的效果时间复杂度为O1。