面试题
抽象类和接口有什么共同点和不同点?
如果两个对象不一样那他们的hash code一定不同?
错误 小概率相同
如果两个对象的hash code不同 对象一定不同
如果重写equals需要注意什么?
重写equals一定要重写hash code方法
为什么重写hash code?
因为使用hash map(是一个数据结构) 需要equals和hash code配合计算
如何在hash map中配合工作?
key值判断相等需要用到equals()
hashmap存储的时候需要用到hashcode()
key一样的对象会根据hashcode分配到同一个桶同一个数组单元
装箱和拆箱?
基本类型转包装类交装箱 包装类转基本类型叫拆箱
什么是128陷阱?
在-128--127中间输出为true 超出就位false
Integer, float, long, double, short, byte, character, void, boolean都是这样的
为了节省内存在这个范围内会出现一个自己的常量池 指向一个地址所以会true超出范围 变为false
使用intValue()进行比较 拆箱比较
public class Test8{
public static void main(String[] aaa){
Integer a = 5211314;
Integer b = 5211314;
System.out.println(a.intValue()==b.intValue());
}
}
使用包的主要原因是确保类名的唯一性。假如两个程序员不约而同地建立了 Employee 类。
Java会出现出现重名类 通过包来区分
包的引入
- 第一种方式是在每个类名之前添加完整的包名。 例如:
java.tiie.LocalDate today = java.tine.Local Date.now();
- 更简单且更常用的方式是使用 import 语句。import 语句是一种引用包含在包中的类的简明描述。一旦使用了 import 语句,在使用类时,就不必写出包的全名了。可以使用 import 语句导人一个特定的类或者整个包。import 语句应该位于源文件的顶部(但位于 package 语句的后面)。例如, 可以使用下面这条语句导人 java.util 包中所有的类。
import java.util .*;
静态包导入后一直存在
Person类叫父类 超类 基类
Son1 叫 子类 派生类
子类执行时父类一定优先执行 子类执行继承父类的全部
子类和父类定义一样的东西时 子类执行时父类的东西会消失 父类被覆盖
public class Person{
public Person(){
System.out.println("我是构造方法");
}
public void m1(){
System.out.println("我是父类Person");
}
public int age = 9;
}
public class Son1 extends Person {
public void m1(){
System.out.println("我是子类Son1");
}
}
public class Test8{
public static void main(String[] aaa){
Son1 xx = new Son1();
System.out.println(xx.age);
xx.m1();
}
}
子类调用父类的与自己重复的方法用super.m1();就是子类构造器调用父类加super()
多态
父类的引用可以指向子类的值的地址
有一个用来判断是否应该设计为继承 关系的简单规则, 这就是“ is-a” 规则,它表明子类的每个对象也是超类的对象。
一个类只能有一个父类
一个父类有好多派生类
object是所有派生类的父类 除了他派生类就只有一个父类
- equals()
比较两个值的地址是否是同一个地址
字符串当中比较两个字符串的值是否相等
String类里对equals重写了
==基本类型比较值
引用类型比较地址
- getClass()
获取类信息
- notify()
唤醒一个线程
- notifyAll()
唤醒全部进程
- wait()
让当前线程进入等待队列 从就绪队列进入
Final
强制类型转换
满足祖先类引用=子孙后代类的堆中值的地址
判断是否是当前类或者是子孙后代类的对象
抽象类
抽象类去定义本身是父类 有子类去实现它
每个动物都会移动 每种动物之间移动方式不一样自己去实现
抽象类的派生类想要继承派生类必须具备抽象类定义的每个功能
public class PersonTest{
public static void main(String[] args){
Person[] people = new Person[2];
people[0] = new Employee("Harry Hacker",20000,1919,10,1);
people[1] = new Student("Harry Hacker","computer science");
for(Person p:people){
System.out.println(p.getName()+","+p.getDescription());
}
}
}
public abstract class Person{
public abstract String getDescription();
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return name;
}
}
public class Student extends Person
{
private String major;
public Student(String name , String major)
{
super(name);
this.major = major;
}
public String getDescription()
{
return "a student majoring in "+major;
}
}
import java.time.*;
public class Employee extends Person{
private double salary;
private LocalDate hireDay;
public Employee(String name , double salary , int year, int month, int day){
super(name);
this.salary=salary;
hireDay = LocalDate.of(year,month,day);
}
public double getSalary(){
return salary;
}
public LocalDate getHireDay(){
return hireDay;
}
public String getDescription(){
return String.format("an employee with a salary of $%.2f", salary);
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent/100;
salary+=raise;
}
}
散列码
是由对象导出的一个整型值。散列码是没有规律的。如果 x 和 y 是 两个不同的对象, x.hashCode( ) 与 y.hashCode( ) 基本上不会相同。
因为equals值重写了hash code也就跟着重写了 String比较的是值所以s和t散列码相等
toString
泛型
广泛代表所有类型
public class Arr{
public E a;
}
public class Test8{
public static void main(String[] aaa){
Person x=new Person();
x.age = 20;
Arra1 = new Arr<>();
a1.a = x;
System.out.println(a1.a);
Arra2 = new Arr<>();
a2.a = "大江户";
System.out.println(a2.a);
Arr a3 = new Arr<>();
a3.a = new int[]{1,2,3,4};
System.out.println(a3.a[0]);
}
}
参数数量可变
public class Test8{
public static void main(String[] aaa){
m1("宋宇");
m1("212121");
m1("123456");
m1("11111");
}
public static void m1(String ... a){
for(int i=0;i
System.out.println(a[i]);
}
}
}
枚举类指定实例