首页 > 编程语言 >Java面试题1

Java面试题1

时间:2023-11-02 18:22:40浏览次数:34  
标签:面试题 Java String System public println final out

Java面试题(第一天)

1.JDK、JRE、JVM三者区别和联系

区别:

JDK:Java Development Kit(Java开发环境)

JRE:Java Runtime Environment(Java运行环境)

JVM:Java Virtual Machine(Java虚拟机)

联系:
image-20230907211853387

.java文件被javac编译成.class文件然后被jvm使用lib类库编译为机器码然后通过jvm映射到操作系统中!

2.面向对象

什么是面向对象?

对比面向过程,是两种不同的处理问题的角度

面向过程更加注重一个事情的每一个步骤和顺序,面向对象更加注重事情有哪些参与者(对象),以及各自需要做什么

比如:洗衣机洗衣服

面向过程一般会将任务解成一系列的步骤(函数):打开洗衣机--->放衣服--->放洗衣粉--->清洗---->烘干

面向对象会拆成人和洗衣机两个对象:
人:打开洗衣机 放衣服 放洗衣粉

洗衣机:清洗 烘干

以上例子可以看出,面向过程比较直接高效,而面向对象更易于复用、扩展和维护。

面向对象三大特性

1.封装

封装的意义,在于明确指出外部使用的所有成员函数和数据项

内部细节对外部调用透明,外部调用无需关心内部的实现

例子:
a.javabean的属性私有,提供get/set对外访问,因为属性的赋值或者获取逻辑只能由javabean本身决定,而不能有外部胡乱修改:

public class User {
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = "qisui"+name;
    }
}

比如在这里set赋值的时候我需要为名字加上一个前缀,就是由javabean本身控制!

b.ORM框架

操作数据库,我们不需要关系连接如何建立的,sql如何执行,只需要引入mybatis,调用方法即可!

2.继承

继承基类的方法,并且做出自己的扩展或者改变!

子类共性的方法或者属性直接用父类的,而不需要自己去再定义,只需要扩展自己个性化的即可

3.多态

基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。

父类类型 变量名 = new 子类对象;
变量名.方法名();

实际调用的子类中重写过的父类方法或者是父类自己有的方法,无法调用子类特有的功能。

3.==和equals

==:比较的是栈中的值,基本数据类型比较的是变量值,引用数据类型比较的是内存对象的地址

equals:在object中也是用的==来比较,但是一般要重写

Object:

public boolean equals(Object obj) {
    return (this == obj);
}

String:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

例题:

String str1="hello";					//在常量池
String str2 = new String("hello");		 //堆中新开辟一个地址
String str3=str2;					    //指向同一个地址	
System.out.println(str1==str2);//false
System.out.println(str1==str3);//false
System.out.println(str2==str3);//true
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true

4.final

1.final作用?

a.当final修饰方法的时候,表明该方法是最终方法,不可以被重写

b.当final修饰类的时候,表明是最终类,不能被继承

c.当final修饰变量的时候,我们也可以叫他为常量,只能被赋值一次

  • final修饰的变量是基本数据类型,那么变量储存的数据值不能发生改变
  • final修饰的变量如果是引用数据类型,你们变量储存的地址值不能发生改变,对象内部可以改变(数组),所以字符串是不可以变的

2.为什么局部内部类和匿名内部类只能访问局部final变量?

public class Test {

    public static void main(String[] args) {
    }
    
    public void test(final int b){
        final int a=10;
        new Thread(){
            public void run(){
                System.out.println(a);
                System.out.println(b);
            } 
        }.start();
    }
}


class OutClass { 
    private int age=12;

    public void outPrint(final int x){
        class InClass{
            public void InPrint(){
                System.out.println(x);
                System.out.println(age);
            }
        }
        new InClass().InPrint();
    }

}


这两段代码片段中我们首先要知道一个问题就是,局部内部类和匿名内部类编译后会生成两个class文件,Test.class,Test1.class

内部类和外部类是同一级别的,内部类不会因为外部类的方法执行完毕了就销毁

Test中主方法虽然执行完毕了,但是内部类的线程并不会立马就是,因为他们是完全独立的两个class文件

如果外部类的方法结束了,但是局部变量就回收了,可是内部类可能还存在引用的时候,这时候就访问了一个不存在的值,所以就将局部变量复制了一份在内部类的成员变量位置,这里就又有个问题,为了保持两个变量的唯一性和一致性,所以就加上final不让你对这个变量进行修改!

5.String、StringBuffer、StringBuilder

1.区别和使用场景

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

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

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

StringBuffer方法都是synchronized修饰的

性能:StringBuilder > StringBuffer > String

场景:经常需要改变字符串内容时候使用后面两个

所有场景优先使用StringBuilder,多线程使用需要共享变量时候使用StringBuffer

标签:面试题,Java,String,System,public,println,final,out
From: https://www.cnblogs.com/qisui/p/17805993.html

相关文章

  • Java-并发编程-进阶篇
    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码但是在企业中往往并不能解决实际问题,例如:1.synchronized关键字在企业开发中会大大降低系统的性能2.当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象......
  • Java数组_03数组执行原理
    1、运行主要用到的三个区: 2、执行原理: ......
  • 学习:javaweb-servlet
    1.在Idea中配置maven仓库,需要在idea中的setting设置maven的路径参数,包括maven的setting.xml和本地仓库的路径2.新建一个maven模板的javaweb项目,查看maven的配置setting.xml是否配置成功,成功的话可以下载模板所需要的一依赖包。3.查看projectStructure中的Modules项目中是否生成......
  • React面试题: 我是否可以在项目中不断使用React.Component来优化项目
    React.PureComponent是React的一个组件,主要用于性能优化,可以避免不必要的渲染。它的主要特点是:如果组件的props和state没有发生变化,则不会重新渲染(此处原理类似React.memo)。可以自动检查对象和数组,判断其是否需要重新渲染(是浅比较)。但是,React.PureComponent的缺点......
  • java笔记_14_邮箱发送
    JavaMailSender:默认使用配置文件中的发送人邮箱密码等JavaMailSenderImpl:方法中使用Impl对象,可手动设置发送账户密码application.ymlspring:#spring集成配置(省略创建session过程)mail:host:#邮件服务器地址port:#邮件服务器端口proto......
  • 面试题: 前端处理滚动穿透这个顽疾
    诚如你所知:滚动穿透是指在移动端滑动页面的过程中,页面滚动受到了触摸事件的干扰,导致无法流畅地滚动,这主要是由于事件冒泡造成的。解决方法如下:监听touchmove事件,阻止默认行为监听touchmove事件,阻止事件的默认行为,防止事件冒泡到父元素上。禁止滚动可以通过over......
  • React面试题: useCallBack()与React.memo的区别与使用常见场景
    React.usecallback与React.memo的区别:React.useCallback和React.memo是两种不同的优化方式:主要功能:它们都可以避免不必要的渲染,提高React应用的性能。React.useCallback是Hoc(高阶组件)的解决方案,可以用于优化函数组件和Class组件,注意这里适用于React高阶组件的渲染解......
  • OFD添加图片水印-JAVA
    写出了一个ofd文件加图片水印的工具类,分享给大家参考。1、引入ofdrw<!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>provided</scope></depende......
  • 掌握JavaScript中数组遍历的7种方法
    作为JavaScript开发人员,熟悉数组的遍历和操作是非常重要的。数组遍历是处理和操作数组元素的基本需求之一。本文将介绍JavaScript中的10种常见数组遍历方法,帮助你成为数组操作的达人。数组的遍历for循环forEach方法for...of循环map方法reduce方法for...in循环filter方法for循环or循......
  • jdk环境变量JAVA_HOME修改不生效问题
    近段因一个软件问题,软件需要使用jdk1.7的环境,我现在使用的是1.8,所以下载了jdk1.7,然后将环境变量JAVA_HOME改为了1.7的路径信息然后查看jdk版本还是1.8版本,就很奇怪,为什么修改了环境变量没生效呢?解决方式一:将系统变量path中JAVA_HOME中这一项移动到最上面解决方式二:当使用安装版本......