知识点清单(持续更新)

这些都是网上集合的知识点结合个人总结

Final是什么

修饰变量:等于常量

修饰参数为最终参数

不能修饰抽象类

修饰类:表示类不可被继承

修饰方法:表示方法不可被子类覆盖,但是可以重载

修饰变量:变量一旦被赋值就不可以修改值

  1. 修饰成员变量

  2. 修饰类变量:只能在静态初始化块中指定初始值或声明该类变量时指定初始值

  3. 修饰成员变量:可在非静态初始化块声明该变量或执行初始值

  4. 修饰局部变量:不会为局部变量初始化,由程序员初始化。可以在定义时指定默认值(后面不能再对变量赋值),也不可以指定默认值,而在后面对final变量赋初值
    为什么局部内部类和匿名内部类只能访问局部final变量?

    内部类和外部类是出于同一级别的,内部类不会因为定义在方法中就会随方法执行完毕被销毁

    这里会产生一个问题:当外部类方法结束时候,局部变量就会被销毁了,但是内部类对象可能会存在(只有没人再引用它时候才会死亡)。这里会出现一个矛盾:内部类对象访问一个不存在的变量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,当局部变量死亡后,内部类仍可以访问它,实际访问的时局部变量的copy。这样就好像延长局部变量的生命周期。

    将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们再内部类中修改成员变量,方法中的局部变量也会跟着改变,这个问题怎么解决呢,就将局部变量设置 final,对它初始化后,我就不会再去修改这个变量,保证了内部类的成员变量和方法的局部变量的一致性。**使得局部变量与内部类建议的拷贝保持一致

String,StringBuffer,StringBuilder的区别以及使用场景

String:是final修饰的,不可变,每次操作都会产生新的String对象

StringBuffer和StringBuilder都是在原对象上操作的

StringBuffer是线程安全的,StringBuider是线程不安全的,

StringBuffer方法都是synchronized修饰的

性能>StringBuilder>StringBuffer>String

场景:经常需要改变字符串内容使用StringBuffer和StringBuilder

效率优先StringBuilder,多线程使用共享变量时使用StringBuffer

重载和重写区别:

重载:方法名相同,参数列表不一样

发生在同一个类中。方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和修饰符可以不同,发生在编译时

重写:子类继承父类,方法明参数列表相同

发生在父子类中,方法名参数列表必须相同,返回值访问小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法修饰符为private则子类不能重写该方法

pubilc String add(int a,String b);
public int add(int a,String b);
//编译报错不是重载

接口和抽象类的区别

在新版本java8是可以有非抽象方法,default方法

抽象类存在普遍成员函数,接口只存在public abstract方法

抽象类的成员变量可以是各种类型的,接口成员变量只能是public abstarct final类型的

抽象类只能继承一个,接口可以实现多个

接口设计目的往往是对类行为进行约束(准确来说是有约束,因为接口不能规定类不可以有什么行为),提供了一种机制,可以强制要求不同的类具有相同行为约束行为有无,不对如何实现进行约束

抽象类的设计目的是代码的复用,当不同的类有相同的行为(A),且一部分行为实现方法一致(B),可以让这些类**派生出一个抽象类(子类生成父类),**在这个抽象类中实现子类方法,避免让所有子类都实现子类方法。这就达到子代码复用目的。因为A(相同方法)-B(相同实现方式)在这里没有实现,所以抽象类不允许实例化否则调用到A-B时无法执行

抽象类是对类本质的抽象,表达的是 is a的关系将子类存在差异化的特征进行抽象,交由子类去实现

接口是对行为抽象,表达的是like a关系,但其本质上是is a。接口核心是定义行为,及实现类可以做什么,至于实现类主体是谁,如何实现,接口不关心

使用场景:关注类本质用抽象类,关注行为操作用接口

抽象类功能比接口多,但是代价高。从实际实际(或者高级语言)因为每个类只能继承一个类。在这个类你必须继承和编写出其所有子类的所有共性。虽然接口功能弱,但是它针对一个动作描述,而且一个类可以实现多个接口设计难度会降低

hashCode与equals区别

equals用来定义:对比两个对象,默认==(对比地址)如果不重写的话

可以重写去对比值

hashCode()作用是获取哈希码,也成为散列码;返回的是一个int整数。哈希码的作用是确定对象在哈希表中的索引位置。hashCode定义在JDK的Object.java中java任何类都包含hashCode()的函数,散列表存储的量键值对是(key-value),特点是:能根据键快速检索出对应的值,这其中就用到散列码(可以快速找到所有对象)

为什么要有hashCode

以"HashSet如何检查重复"(不可以有重复对象)来说明

对象加入HashSet时,HashSSet会先计算对象的hashcode值来判断对象加入的位置,判断对象是否有值,如果没有,Hashset会假设对象没有重复出现。但是如果有,就会调要equals()判断两个对象是否真相同,如果相同就不会加入成功,如果不同就会重新散列到其他位置,这样就减少equals的次数,大大提高执行速度

  • 如果两个对象相等那hashcode一定相同
  • 两个对象相等,对象调用equals方法都返回true
  • 两个对象有相同hashcode值,他们不一定相等
  • equals方法被覆盖,hashCode方法也必须被覆盖
  • hashCode()默认行为是对堆上的对象产生独特值,如果没有重写hashCode()则class两个对象无论如何都不会相等(即使两个对象指向相同数据)

ArrayList和LinkedList区别

ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制;因为数组长度固定,超出长度存数据需要新建数组,然后将老数组拷贝到新数组,如果不是尾部插入数据还会涉及到元素移动(往后复制一份,插入新元素),使用尾插法并插入初始容量可以极大提升性能,甚至超过LinkedList(需要创建大量node对象)

LinkedList:基于链表,可以存储在分散的内存中,适合数据插入及删除操作,不适合查询;需要逐一遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体通过get(i)取得某一元素时都要对List重新遍历,性能消耗大

不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexiOf对List进行遍历,当结果为空会遍历整个列表

List和Set的区别

List有序可以重复

按对象进入顺序保存对象可以重复允许多个Null元素对象,可以使用Iterator取出所有元素再逐一遍历,还可以使用get(int index)获取指定下标元素

Set无序不可重复,最多允许一个Null元素对象,取元素时只能用Iterator接口取得所有元素再逐一遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值