一、&和&&的区别? | 和|| 的区别?
1.当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
2.当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
二、final作用? finally finalize区别
用于修饰类、属性和方法;
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
finally一般作用在try-catch代码块中,在处理异常的时,用于执行必须执行的方法。一般在return之前会调用,或者在异常之后。
finalize是一个方法,属于Object类的一个方法,调用System.gc() 方法的时候,垃圾回收器调用finalize(),一个对象是否可回收的
最后判断。
三、this关键字的用法?
1.this指当前对象,在方法中调用this.xxx()方法,就是调用对象中的方法。
2.形参成员名字重名,用this来区分, this.name=name表示当然对象中的属性name=形参中的name
3.引用本类的构造函数,一般子类调用父类中的构造函数用super(参数),想调用自己中的方法和构造函数属性等。
四、super关键字用法?
super 表示调用父类的方法属性构造器,
当子类继承父类,调用父类的方法属性和构造器的时候可以使用super。没有继承的类,默认object中的方法。
五、static有和作用?
static关键字,用来修饰属性方法内部类代码块的
修饰属性,当多个对象有同一属性的时候可以用static修饰同一属性。
static修饰的方法随着类的加载而加载,按照static块的顺序来执行每个static块,并且只会加载一次
不能调用实例变量和非静态方法。因为加载时机不同。
调用静态方法使用类名字.方法名或者对象名都方法名。
不能和thissuper一起使用
六、interfacek接口关键字作用?
接口:没有构造方法不能被实例化
接口不能实现另一个接口,可以继承多个接口。接口中的方法默认都是抽象方法。
接口中只能有常量和抽象方法,在java8之后多了静态方法和默认方法,实现类继承接口需要重写接口中的方法,
在默认方法中,有类优先原则,实现类和接口中的默认方法相同的时候优先调用类中的方法。
七、break ,continue ,return 的区别及作用?
break 跳出总上一层循环,不再执行循环(结束当前的循环体)
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
八、abstract关键字?
absrtat 用来修饰方法和类的。被修饰的方法叫抽象方法被修饰的类叫抽象类。
抽象类的话不能被实例化,抽象类有构造器和抽象方法和非抽象方法,抽象类被继承子类需要重写抽象类的中抽象方法,如果不想重写自己把子类改成抽象类。
抽象方法:没有方法体。必须在抽象类中(接口)。absrtat不能和private 和final和static 一起使用
九、什么是多态机制?
一个类多种形态。
多态表现形式:对父类的方法重写和重载,父类引用指向子类对象,为了使用子类的属性和方法采用向下转型,向上转行就是多态,向下转型就是把父类引用转成子类引用。
不能随便类型转换,会出现异常,用instanceof判断A对象是否是B类型的一个实例。
多态是运行时行为,(编译看左边,运行看右边)使用动态绑定技术,因为编译时不确定会指向那个实例对象,只有在运行时才能决定。
多态的好处可以调用父类中的方法和属性,可以提高可扩充性和可维护性
(比如有一个dog类中有吃狗粮的方法(),继承的父类是动物类中有会叫的方法(),Ainmal ainmal=new dog(那么子类就可以调用父类中的方法。向上转型)
Dog dog= (Dog) ainmal; 向下转型就可以调用父类和子类中的方法了。
十、抽象类和接口的对比?
相同点:
接口和抽象类都不能实例化
都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法
不相同:
抽象类是继承,接口是实现
抽象类有构造器,接口无构造器
抽象类中的抽象方法可以任意权限修饰符,接口中只能是public
抽象类单继承,接口多实现
十一、重写和重载?==和equals?
重载(Overload):方法名称相同,参数列表不同
重写(Override):方法名称和参数必须相同。
==:基本数据类型比较的是值,引用数据类型(重写equlas方法),比如String,比较的是地址值。
equals:覆盖equlas方法比较的是值,没有覆盖equals方法的类比较的是地址值。
十二、equals和Hashcode?
Hashcode的作用是获取哈希码,也称为散列码,哈希码的作用是确定该对象在哈希表中的索引位置
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同
HashSet中添加对象,hashcode是用来判断对象加入的位置,hashcode值进行比较,如果有相同的值就会调用equls方法内容是否相等。
equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
对象相等hashcode值一定相同,(指equals比较2个对象返回true时)
两个对象相等,对两个对象分别调用equals方法都返回true
对象中重写equals方法是为了让new user(xxx,xxx)2个对象的xxx,xxx内容相同,所以重写equals方法中会比较内容相等的字段返回为true
而hashcod是通常在添加到集合(hashset)中的时候,new user(xxx,xxx)2个对象因为没有重写hashcode方法,code值不同所以都会被存入到set集合中
重写的hashcode方法中根据什么字段(属性)内容是判断hashcode值是相同的。
十三、值传递和引用传递?
值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝。
引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
十四、Integer值超过127之后发生了什么?
Integer.class在装载(Java虚拟机启动)时,其内部类型IntegerCache的static块即开始执行,
实例化并暂存数值在-128到127之间的Integer类型对象。
当自动装箱int型值在-128到127之间时,即直接返回IntegerCache中暂存的Integer类型对象。
-128-127在缓存里取。否则就返回一个新对象。对象的地址值就不相同了,一个在静态区,一个在对象区
十五、throw 和 throws区别?
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
throws 属于异常处理的一种方式,声明在方法的声明处。
十六、String为什么被final修饰?
1.节约内存:创建字符串时,如果该字符串已经存在于池中,则将返回现有字符串的引用,而不是创建新对象。可以有多个String对象指向同一个内存地址。 字符串池存在于堆中。
2.缓存hashcode:使用hashmap和set和table时,不可变的特征可以保证他的hashcode相同,不用每次计算hashcode值。集合是通过hashcode判断集合中是否存在对象。
3.保证数据和线程安全:Java内部参数使用了许多String类型的数据,如果String可变,那我们可以随意更改那些内部参数。不需要做其他同步操作
十七、String, StringBuffer,StringBuilder的区别?
String 被fianl修饰不能被继承。
String 可以被序列化, 可以操作字符串,是一个不可变的字符序列,底层是一个char[]数组被fianl修饰
Stringbuff 是可变的字符序列,也可以操作字符串内容,线程是安全的,效率较慢
Stringbuider 是可变的字符串序列,可以操作字符串内容1,线程是不安全的,效率快
Stringbuff和Stringbuider底层扩容机制,底层是char[]数组默认初始内量为16,如果数据超出了数组长度,就会创建新的数组保存以(16*2)+2的形式创建;
十八、对象类中如何比较对象中某个值的大小进行排序?
重写Comparable接口和Comparator中的方法
十九、枚举和常量有何区别?
常量一般定义是用来做内容比较的,被final修饰,通过equals去判断两者是否相等
因为是被static修饰,是直接把常量的值编译到类的二进制代码里,常量的值如果需要改变,就需要重新编译引用常量的类,因为里面存的是旧值。扩展性较低。
枚举:举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。使用枚举支持更多操作变量的方法,扩展性高,在某个范围之内值会发生变化就使用枚举,比如星期几或者颜色等。
二十、数组array和集合区别?
1.数组初始化之后长度就固定了。
2.定义好了数据类型就只能存放同一数据类型。
3.长度不能改变,提供的增删改查不方便,效率低,只能存放有序的元素,可以添加重复元素
集合:长度是可以改变的,存储的元素可以有序无序,对于增删改查的方法也较方便。
二十一、Collection和Collections的区别?
Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体Set List的集合提供了操作方法,比如list继承Collection重写里面的方法在list中具体去做什么。
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作。