注:我不会的或是需要我重点理解的都用删除线来表示,嘻嘻。
1.接口和抽象类的区别:
抽象类有构造器,接口没有构造器。
抽象类有普通成员变量,接口没有普通成员变量 。
抽象类中可以有非抽象的方法,接口中全部都是抽象方法(不能有任何方法体不能有任何东西)。
一个类可以实现多个接口,但只能继承一个抽象类。
抽象类和接口都可以包含静态static成员变量(方便用类.变量来表示嘛),接口中只能是并且默认为public static final类型,抽象类不作具体规范,什么都可以。所以接口是更为抽象的抽象类。
抽象类中的抽象方法是public 或protected的,接口中只能是public 类型的
2.ArrayList和LinkedList的区别和用途:
- Collection单例集合接口 List : ArrayList
-
LinkedList
-
Vector
-
Set: HashSet
-
TreeSet
- Map双例集合接口 HashMap
-
TreeMap
-
HashTable
- Collections操作集合的工具类
区别:
1.底层数据结构:ArrayList底层用动态Object数组,LinkedList底层用双向链表。
2.增删改查的差异:随机访问get(index),set操作,ArrayList更合适,无需移动指针。增加add和删除remove操作,LinkedList更合适,操作后无需移动元素。
3.内存差异:LinkedList更耗内存,除了保存数据本身,还要两个引用指针,前置和后置。
注:
ArrayList初始默认容量10,可以扩容,扩容后是扩容前的1.5倍,且利用数组复制Arrays.copyOf的原理扩容。
LinkedList双向,所以迭代可以直接前向和后向,直接获取最后元素等。
List接口统一具有index属性。LinkedList也是有的,比如add(index,element)
Vector jdk1.0 ArrayList Jdk1.2线程不同步,操作效率更高。
3.map和set的区别用途:
区别:
1.接口不同:set集合继承Collecton单例接口,Map没有继承Collection接口。
2.存数据方式:set无序存储且元素不可重复(相当于key value只有key),map键值对方式(key不可重复,value可重复)。LIst有序可重复存储。
注:
1.List比collecton多了某些东西,set完全没有额外的,就是collection产生不同的行为(继承于多态)。
2.HashSet底层基于HashMap,利用哈希算法存入的元素必须有hashCode()。HashMap底层基于散列表(哈希表)结构(数组+链表)。都有hashCode和equals问题。
3.TreeSet和TreeMap底层红黑树结构,key会自动排序(若无自然顺序则按照Comparable或Comparator决定)
4.hash code(散列码)是转换而来的int值
5hashmap初始容量 扩容…与hashtable,concurrenthashmap一起说。
4.对封装继承多态的理解:
Java三大属性:封装继承多态 (3p)
Java四大特征:抽象封装继承多态
抽象:
对一系列看上去不同但是本质相同的具体概念的抽象~~。在Java 中一个类没有足够的信息来描述一个具体的对象,必须借助其它类来加以 支撑,这样的类就是抽象类。~~ 过程抽象和数据抽象。抽象就是为了继 承而存在的,若定义了抽象类而不去继承则白白创建。这里会涉及抽象方法与抽象类的知识。
注:
abstract与final不能同时修饰一个类,abstract不能与private final static native同时修饰一个方法。
继承:
从已有的类中派生出新的类称为子类。子类继承父类(超类)的数据属性和行为,并根据自己的需求扩展出新的行为,提高代码复用性。
注:
1.java官方文档:子类对父类的no private属性是无法继承的,但是如果子类中的公有方法影响到了父类的私有属性,那么父类的私有属性是可以被子类使用的。
eg:父类的公有A方法用到了私有属性并打印他,那么子类在继承了A方法并调用的时候,是可以顺利打印出的。但是无法直接访问,只能间接。
我们不可能完全继承父母的一切(性格),但是父母的一些无法继承的东西却会深刻的影响着我们
2.this和super:
this用法3:普通直接引用,指向自身this.name。形参与成员名字重名this.age=age。引用构造函数this(参数)或this()调用自身。
super用法3:普通引用super.name。子类中成员变量或方法和父类中的同名。引用构造函数super(参数)或super()调用父类。
用在构造函数中,必须写在第一行。未指定,所有的子类构造方法都会默认调用super无参。父类若只有有参没有无参则报错(类默认拥有无参,有有参则无参失效)
封装:
首先是抽象的,抽象成一个类,才能封装,将事物的属性和动作隐藏起来,只保留特定的方法与外界联系。
为什么要封装?把自己做的事情封装起来,而不是暴露给其他的类,当内部的逻辑发生变化,外调用不用因此而修改,他们只调用相应的接口,而不关心内部的实现。
多态:
封装和继承都是为多态准备的,多态就是父类引用子类对象。所以程序定义的引用变量所指向的具体类型和方法调用在编译时不能确定,只有程序运行期间才确定,动态绑定,这就是运行时多态 。
编译时多态就是重载。
酒 a=剑南春
酒 b=五粮液 (向上转型)
缺点: 必须强转子类
只能访问父类中拥有的方法和属性,对于子类中存在父类中不存在的方法不能用的。子类若重写了父类方法,调用的时候调用的是子类定义的方法(动态连接嘛)
实现条件:继承 重写 向上转型
实现形式: 方法体的扩充
继承 :主要是多个子类重写父类方法,相同调用不同行为结果。
接口:
重载:同名函数,不同参数个数或者类型或者顺序不同。返回型无关!
注:父类动物都有叫的方法,子类都去重写这个方法。动物 a=鸟,动物b=狗。a.叫,b.叫出来的不一样
5.java基本类型,字节长度,int表示范围
整形:int 4 字节 -231 ——231-1
short 2
long 8
byte 1
浮点型 float 4
double 8
char型 2
boolean型 1
正数:补码就是本身。
负数:补码是它的正数对应的二进制取反+1
6.List和Set的区别:
1.list元素有存放顺序,可以存放重复元素。set不可以存放相同元素,后来的会把前面的覆盖掉。
2list检索效率更高,插入删除效率低。set检索效率低,插入删除效率高 (没有下标)Set存储位置是由它的HashCode码决定的,所以它存储的对象必须有equals()方法,而且Set遍历只能用迭代,因为它没有下标。