Java面试_se基础

1、八大基本数据类型

byte,short,int,long,float,double,char,boolean
银行不使用浮点型,float是有限的离散的,要使用BigDecimal计算
在这里插入图片描述

2、拆装箱问题(强制类型转化内存溢出问题)

装箱:基本类型包装成引用类型
拆箱:将包装类型转换为基本数据类型;int和Integer区别
Java5开始引入了自动装拆箱的机制,在-128~127之间自动装箱时不会new新的integer对象,而是直接引用常量池中的integer对象,超过范围为false

3、常量和变量

命名:以美元,下划线,子母开头,区分大小写,可包含数字(不可以以数字开头)、
Final修饰的为常量,常量名一般大写

4、final 有什么用?

  • 用于修饰类、属性和方法;
  • 被final修饰的类不可以被继承
  • 被final修饰的方法不可以被重写
  • 被final修饰的变量不可以被改变

5、==和equals

  • 断两个对象是不是同一个对象。对于基本数据类型来说比较的是值,对于引用数据类型==比较的是内存地址
  • equals():它的作用也是判断两个对象是否相等。它一般有两种使用情况①类没有覆盖equals()方法,通过equals()比较该类的两个对象时,相当于==比较这两个对象②类覆盖了equals()方法,一般,我们都覆盖equals()方法,来判断两个对象的内容是否相等

6、hashcode()与equals()

  • 都是object的方法
  • 2个对象的hashcode()相等,equals()不一定相等;
  • 2个对象的equals()相等,hashcode()必然相等。
  • 重写equals()必须重写hashcode(),因为在Java一些容器中,不允许有2个完全的相同的对象,在插入的时候,如果判断相同则会覆盖,如果没有重写hashcode(),object中hashcode()是根据对象的存储地址形成的哈希值,这时就可能因为没有重写造成相同的对象,散列到不同的位置而造成对象不能覆盖的问题。

7、值传递

Java 语言的方法调用只支持参数的值传递。

8、break,continue,return

  • break跳出总上一层循环,不再执行循环(结束当前的循环体)
  • continue跳出本次循环,继续执行下次循环(结束正在执行的循环进入下一个循环条件)
  • return程序返回,不再执行下面的代码(结束当前的方法直接返回)

跳出多重循环体,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出多重循环体。带标签的continue,相当于goto,但现在不再使用。

9、重载 重写

  • 重载是在一个类中方法名相同,参数类型,个数,顺序不同,与返回值与修饰符无关。
  • 重写是运行时的多态,他是在子类继承父类,重写父类中的方法。
  • 构造器不能被重写,但可以被重载

10、数组的定义

Int[] arr=new int[3];
Int[] arr=new int[]{1,2,3,4,5};
Int[] arr={1,2,3,4,5};

11、面向对象 面向过程

面向过程是具体化的,流程化的,解决一个问题,需要一步一步的分析,一步一步的实现。面向对象是模型化的,相当于抽象成一个盒子,你需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,使用的人不需要理会。而面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装

面向对象三大特性:封装,继承,多态

  • 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,提高复用性
  • 继承:1.子类拥有父类非private的属性和方法。2.子类可以拥有自己属性和方法,即子类可以对父类进行扩展。3.子类可以用自己的方式实现父类的方法。通过使用继承可以提高代码复用性
  • 多态:多态分为运行时多态和编译时多态。编译时多态就是我们说的一个重载,运行时多态是体现在子类继承父类。

向上转型,子类对象转换为父类类型,Animal animal=new Cat();这个时候animal这个引用调用的方法是子类方法。向上转型时,子类单独定义的方法会丢失。子类引用不能指向父类对象。Cat c=(Cat)new Animal()这样是不行的。
向下转型,把父类对象指向的是子类对象(也就是说在向下转型的时候需要先向上转型),向下转型只能转型为本类对象,就是说得存在继承关系的。比如Animal a=new Cat();Cat c=((Cat)a);

12、OOP五大基本原则:

  • 单一职责原则SRP(Single Responsibility Principle):类的功能要单一
  • 开放封闭原则OCP(Open-Close Principle):一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
  • 里式替换原则LSP(the Liskov Substitution Principle ):子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
  • 依赖倒置原则DIP(the Dependency Inversion Principle ):高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
  • 接口分离原则ISP(the Interface Segregation Principle ):设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
  • 迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话
  • 合成复用原则:尽量先使用组合或者聚合等关系来实现,其次考虑使用继承关系来实现

13、Super和this

继承链中对象方法的调用的优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)

  • this是自身的一个对象,代表对象本身;
  • super是代表超(父)类对象,可以说是指向自己超(父)类对象的一个指针。

注意
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。this和super不能同时出现在一个构造函数里面,this()和super()都指的是对象,所以,均不可以在static环境中使用。

14、访问修饰符

使用访问修饰符来保护对类、变量、方法和构造方法的访问

  • private:在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)
  • default(即缺省,什么也不写,不使用任何关键字):在同一包内可见使用对象:类、变量、 方法。
  • protected:对同一包内的类和所有子类可见。使用对象:变量、方法。注意不能修饰类(外 部类)。
  • public:对所有类可见。使用对象:类、变量、方法

15、接口和抽象类

  • 接口是对行为的抽象,抽象类是对类的抽象,是一种模板设计思想。
  • 接口和抽象类都不能实例化都包含抽象方法,其子类都必须重写这些抽象方法
  • 不同的是抽象类可以有非抽象的方法,而接口中只能存在public abstract方法,在Java8中接口引入了默认方法和静态方法。
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
  • 抽象类中可以有构造器,接口中不能有构造器。

16、成员变量和局部变量

  • 成员变量方法外部,类内部定义的变量。
  • 局部变量:类的方法中的变量。
  • 成员变量针对整个类有效,局部变量只在某个范围内有效(一般指的就是方法,语句体内)
  • 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中,局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。
  • 成员变量有默认初始值,局部变量没有默认初始值,使用前必须赋值。
  • 在使用变量时需要遵循的原则为就近原则首先在局部范围找,有就使用;接着在成员位置找

17、构造方法

类名与方法名相同,无返回值,但不能是void,用来实例化对象,即生成类的对象的时候自动执行,不需要调用。

18、Static

static用来修饰变量,方法,静态代码块,修饰类也就是静态内部类。被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享,而且在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只加载一次。1、静态只能访问静态。2、非静态既可以访问非静态的,也可以访问静态的。

19、内部类

成员内部类,局部内部类,匿名内部类,静态内部类。当某个类除了它的外部类,不再被其他的类使用时,我们一般使用内部类。

  • 静态内部类:定义在类内部的静态类。可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;通过外部类.内部类类名=new外部类.静态内部类()来创建。
  • 成员内部类:定义在类内部,成员位置上的非静态类,成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有,但外部类想访问内部类属性或方法时,必须要创建一个内部类对象。成员内部类依赖于外部类的实例,它的创建方式:外部类.内部类类名=外部类实例.new内部类(),如果成员内部类的属性和方法与外部类同名,将导致外部类的这些属性与方法在内部类被隐藏,也可按照外部类.this.属性方法。
  • 局部内部类:定义在方法中的内部类,可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new内部类()。
  • 匿名内部类就是没有名字的内部类,日常开发中使用的比较多,没有构造方法,也是唯一没有构造方法的内部类,匿名内部类必须继承一个抽象类或者实现一个接口,匿名内部类不能定义任何静态成员和静态方法,只能访问外部类的的final变量,匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
new/接口{ 
//匿名内部类实现部分 
}

1.内部类可以获得外部类的私有属性和私有方法
2.静态内部类无法访问非静态的属性
3.一个java类中可以有多个class类,但只能有一个public类

20、异常

  • 所有的异常都有一个共同的祖先java.lang包中的Throwable类
  • Throwable:有两个重要的子类:Exception(异常)和Error(错误)。
  • Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题,比如awt相关,JVM栈溢出问题
  • Exception(异常):是程序本身可以处理的异常。Exception类有一个重要的子类
RuntimeException异常由Java虚拟机抛出
NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、
ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和
ArrayIndexOutOfBoundsException(下标越界异常)
  • try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块
  • catch块:用于处理try捕获到的异常
  • finally块:无论是否捕获或处理异常,finally块里的语句都会被执行,当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

在以下4种特殊情况下,finally块不会被执行:

  • 在 finally 语句块中发生了异常。
  • 在前面的代码中用了 System.exit()退出程序。
  • 程序所在的线程死亡。
  • 关闭 CPU

Throw手动抛出,throws方法抛出,可以抛出多个异常

自定义异常,继承exception类,习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详细描述信息的构造函数(Throwable的toString方法会打印这些详细信息,调试时很有用)

21、 final、finally、finalize 有什么区别?

  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,Java中使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

22、String,stringbuffer,stringbuilder

String的底层是char类型的数组,string是不变的,String对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回。String采用final修饰,String类不能被继承,数组没有length()方法,有length属性,String有length()方法

字符串反转:reverse(),indexOf():返回指定字符的索引,charAt():返回指定索引处的字符。replace():字符串替换,trim():去除字符串两端空白,substring():截取字符串。

StringBuilder与StringBuffer都是可变的,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,StringBuilder是非线程安全的。

23、泛型

用来约束的作用,避免类型之前强制转换,jdk1.5新特性

24、JDK 中常用的包有哪些

java.lang:这个是系统的基础类;
java.io:这里面是所有输入输出有关的类,比如文件操作等;
java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
java.net:这里面是与网络有关的类;
java.util:这个是系统辅助类,特别是集合类;
java.sql:这个是数据库操作的类

25、集合

  • 集合用于存储数据的容器,可变长
    Map接口和Collection接口是所有集合框架的父接口,Collection集合的子接口有Set、List、Queue三种子接口
  • List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有ArrayList、LinkedList和Vector。
  • Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set接口常用实现类是HashSet、LinkedHashSet以及TreeSet。
  • Map是一个键值对集合。Key无序,唯一;value不要求有序,允许重复。Map的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。

底层实现

  • Arraylist:Object数组Vector:Object数组LinkedList:双向循环链表
  • HashSet(无序,唯一):基于HashMap实现的,底层采用HashMap来保存元素
  • LinkedHashSet:LinkedHashSet继承与HashSet,并且其内部是通过LinkedHashMap来实现的。
  • TreeSet(有序,唯一):红黑树(自平衡的排序二叉树。)
  • HashMap:JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
  • LinkedHashMap:LinkedHashMap继承自HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
  • HashTable࿱


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部