Java面试/笔试题目之Java基础(持续更新中)

Java面试、笔试题 19、Jdo是什么?4、J2EE是什么?1、Tomcat的优化经验..................................................................................................................................................................................................................47。 阅读详情

GitHub:https://github.com/JDawnF

声明:题目大部分来源于Java后端公众号,有些个人整理,但答案皆为个人整理,仅供参考。

目录

Java中有几种基本数据类型,各占几个字节?

面向对象的特征:继承、封装和多态

final, finally, finalize 的区别

Exception、Error、运行时异常与一般异常有何异同​

请写出5种常见到的runtime exception

int 和 Integer 有什么区别,Integer的值缓存范围https://blog.youkuaiyun.com/why15732625998/article/details/79437930#commentBox

包装类,装箱和拆箱

String、StringBuilder、StringBuffer

重载和重写的区别

抽象类和接口有什么区别

说说反射的用途及实现

泛型与类型擦除

说说自定义注解的场景及实现

HTTP请求的GET与POST方式的区别

HTTP请求总共有哪几种类型

常见的状态码

Session与Cookie区别

列出自己常用的JDK包

MVC设计思想

equals与==的区别

hashCode和equals方法的区别与联系

什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用

Object类中常见的方法,为什么wait  notify会放在Object里边?

Java的平台无关性如何体现出来的

JDK和JRE的区别

Java 8有哪些新特性


  1. Java中有几种基本数据类型,各占几个字节?

     

  2. 面向对象的特征:继承、封装和多态

    1. 继承:多个类具有共同的属性(成员变量)与行为(成员方法)的时候,将这些共同的部分抽取出来定义到一个公共的类中,其他及各类可以与这个公共的类形成继承关系,从而在多个类中不需要重 复定义公共部分!这个公共的类就是父类,也称为超类或者基类,其他的类就是子类。子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.get()方法。
    2. 封装:所谓封装指的是隐藏对象的属性以及实现细节,仅对外提供访问方式,将不需要对外提供的内容进行隐藏,把属性隐藏对外提供访问方式。使用private修饰。
    3. 多态: java程序中定义的引用变量所指向的具体类型和通过该引用类型发出的方法在调用时不确定,该引用变量发出的方法到底调用哪个类的实现的方法,必须在程序运行期间才能决定。
      1. 多态的成员特点:成员变量:编译与运行时期都看父类!
                                     成员方法:编译时期看父类,运行时期看子类
  3. final, finally, finalize 的区别

    1. final:Java的关键字之一,被final修饰的类不能被继承,所以要注意一个类不能被abstract和final同时修饰;被final修饰的变量不能被修改,所以一开始要先赋值。当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的。
    2. finally:捕获异常中的finally模块,不管有没有异常被抛出、捕获,finally块都会被执行。
      1. finally什么时候会被执行:

        1. 在try...catch...finally语句中,只要try语句之前程序没有抛异常,或者在try语句中程序没有退出(System.exit(0))的话,就会执行;
        2. 加入try语句中有return语句,那么会先执行finally语句中的内容,因为如果执行了return语句程序就会结束退出;
        3. 此外,要注意方法内部的变量都是存放在栈里面,函数执行结束后,其对应的栈会被回收,那么方法体中定义的变量也就不存在了,所以return语句实际上是拷贝了一份值,然后再返回的。所以在finally中如果有return语句的话,对基本类型的值不影响,但是对引用类型的值就会有影响。
    3. finalize:这是Object类中的一个方法,在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,它与析构函数不同。
  4. Exception、Error、运行时异常与一般异常有何异同

    1. Exception:分为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。 
      IOException(其他异常) 
      FileNotFoundException(文件未找到异常。) 
      IOException(操作输入流和输出流时可能出现的异常。) 
      EOFException (文件已结束异常)
    2. Error:描述了java运行时系统的内部错误和资源耗尽错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。应用程序不应该抛出这种类型的对象。 
    3. 运行时异常:对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
    4. Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显示地进行捕获处理,这是编译期检查的一部分。Error,是 Throwable 不是 Exception。不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

    5. 粉色的异常是需要被抛出的。

  5. 请写出5种常见到的runtime exception

    1. IndexOutOfBoundsException(下标越界异常) 
    2. NullPointerException(空指针异常) 
    3. NumberFormatException (String转换为指定的数字类型异常) 
    4. ArithmeticException -(算术运算异常 如除数为0) 
    5. ArrayStoreException - (向数组中存放与声明类型不兼容对象异常) 
    6. SecurityException -(安全异常) 
  6. int 和 Integer 有什么区别,Integer的值缓存范围

    1. Integer是int的包装类;int是基本数据类型; 
    2. Integer变量必须实例化后才能使用;int变量不需要; 
    3. Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 
    4. Integer的默认值是null;int的默认值是0。
    5. 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
    6. Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
    7. 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
    8. 对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
    9. 深入描述
      1. public class Test {  
                public static void main(String[] args) {  
                    //在-128~127 之外的数
                    Integer num1 = 128;   Integer num2 = 128;           
                    System.out.println(num1==num2);   //false
        
                    // 在-128~127 之内的数 
                    Integer num3 = 9;   Integer num4 = 9;   
                    System.out.println(num3==num4);   //true
                }  
            }  

        解析原因:归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。 
        加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。 
        而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。

      2. https://blog.youkuaiyun.com/why15732625998/article/details/79437930#commentBox

    10. 源码分析:
      1. 给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,源码如下:
      2. public static Integer valueOf(String s, int radix) throws NumberFormatException {
                return Integer.valueOf(parseInt(s,radix));
            }
        
        
        public static Integer valueOf(int i) {
                assert IntegerCache.high >= 127;
                if (i >= IntegerCache.low && i <= IntegerCache.high)
                    return IntegerCache.cache[i + (-IntegerCache.low)];
                return new Integer(i);
            }

         

      3. IntegerCache是Integer的内部类,源码如下:
        /**
              * 缓存支持自动装箱的对象标识语义
              * -128和127(含)。
              *
              * 缓存在第一次使用时初始化。 缓存的大小
              * 可以由-XX:AutoBoxCacheMax = <size>选项控制。
              * 在VM初始化期间,java.lang.Integer.IntegerCache.high属性
              * 可以设置并保存在私有系统属性中
             */
            private static class IntegerCache {
                static final int low = -128;
                static final int high;
                static final Integer cache[];
        
                static {
                    // high value may be configured by property
                    int h = 127;
                    String integerCacheHighPropValue =
                        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                    if (integerCacheHighPropValue != null) {
                        int i = parseInt(integerCacheHighPropValue);
                        i = Math.max(i, 127);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    }
                    high = h;
        
                    cache = new Integer[(high - low) + 1];
                    int j = low;
                    for(int k = 0; k < cache.length; k++)
                        cache[k] = new Integer(j++);
                }
        
                private IntegerCache() {}
            }

         

  7. 包装类,装箱和拆箱

    1. 包装类:每一个基本的数据类型都会一一对应一个包装类型,如:boolean--Boolean,int--Integer;
    2. 装箱:把基本的数据类型转换成对应的包装类型;
      1. Integer.valueOf(1)
      2. Integer i=1;    自动装箱,实际上在编译时会调用Integer.valueOf方法来装箱
      3. 这里留意一下IntegerCache,这是Integer常量池,Integer默认范围在-128~127之间,也就是在这个范围的数我们不用new一个Integer对象,直接Integer i=1定义即可,会实现自动装箱,所以这也说明无论创建多少个在这个范围的数,它们的valueOf()都是“==”,这里的high值是可以调动的。此外,在Long和Short中也有同样的缓存机制
    3. 拆箱:就是把包装类型转换为基本数据类型,基本数据类型  名称=对应的包装类型。

      1. Integer i=1;  

      2. int j=i;   //自动拆箱    int j=i=intValue();   手动拆箱

      3. 自动拆箱:实际上会在编译时调用intValue()。

    4. 基本类型和对应的包装类可以相互装换:

      1. 由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;
      2. 包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。
  8. String、StringBuilder、StringBuffer

    1. 在这方面运行速度快慢为:StringBuilder > StringBuffer > String。效率比较String<StringBuffer<StringBuilder,操作的数据量小的时候可以用String。

            StringBuffer的append方法,他是线程安全的

      1. String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。如下图,String为不可变
      2. String str="abc";
        System.out.println(str);
        str=str+"de";
        System.out.println(str);

        如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。另外,有时候我们会这样对字符串进行赋值。

      3. String str="abc"+"de";
        StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
        System.out.println(str);
        System.out.println(stringBuilder.toString());
        
        

        这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和String str="abcde";是完全一样的,所以会很快,而如果写成下面这种形式:

      4. String str1="abc";
        String str2="de";
        String str=str1+str2;

        那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

    2. 线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的
      1. 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
    3. String:适用于少量的字符串操作的情况

      StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

      StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

    4. 为了实现修改字符序列的目的,StringBuffer 和 SringBuilder 底层都是利用可修改的(char,JDK 9 以后是 byte)数组,二者都继承了 AbstractStringBuilder,里面包含了基本操作,区别仅在于是否加锁。

  9. 重载和重写的区别

    https://blog.youkuaiyun.com/Andya_net/article/details/76815259 

    1. 重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型,是一个类中多态性的一种表现。重载的规则:
      1. 必须具有不同的参数列表;

      2. 可以有不同的返回类型,只要参数列表不同就可以了;

      3. 可以有不同的访问修饰符;可以抛出不同的异常;

    2. 重写要求返回值、方法名和参数都相同,子类抛出的异常不能超过父类相应方法抛出的异常。(子类异常不能超出父类异常);子类方法的的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。重写的规则:
      1. 参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
      2. 返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
      3. 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
      4. 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
      5. 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
  10. 抽象类和接口有什么区别

    1. 抽象类由abstract关键字修饰,不能被private修饰,因为抽象类不能实例化,需要被继承,所以抽象类也不能被final修饰;
    2. 接口中定义了一些动作(即方法),接口中的方法默认为public abstract,可以含有变量,但是接口中的变量默认为public abstract final。

      接口修饰符只能用public、default和abstract。 不能用final、static修饰。在jdk1.8之后,可以用static修饰方法了。

    3. 相同点:都不能被实例化;接口的实现类或者抽象类的子类都只有实现了接口或抽象类中的方法才能被实例化

    4. 不同点:

      1. 接口只能定义方法,抽象类中可以定义和实现接口需要实现,
      2. 抽象类需要继承,一个类可以实现多个接口但只能继承一个类
      3. 接口中成员变量是public static final,只能有静态的不能被修改的数据,必须赋值,所有的方法都是public abstract,而且只能被这两个修饰。抽象类可以有自己的成员变量,抽象类中的成员变量默认default、private、protected和public。可以再子类中重新定义、赋值。抽象类中的方法不能用private、static、synchronized、native修饰符。
  11. 说说反射的用途及实现

    参照:https://blog.youkuaiyun.com/striveb/article/details/84630386

  12. 泛型与类型擦除

    https://www.jianshu.com/p/4de08deb6ba4 

    1. 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。
    2. Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码。
    3. 源程序:
      public static void main(String[] args){
       List <Integer> listInt=new ArrayList <Integer>();
       List <String> listString=new ArrayList <String>();
      
       Map<String, String> map = new HashMap<String, String>();  
          map.put("AAA", "BBB");  
          map.put("CCC", "DDD");  
          System.out.print(map.get("AAA"));
      }
      
      

       

    4. 编译后:

      public static void main(String[] paramArrayOfString)
         {
          ArrayList localArrayList1 = new ArrayList();
          ArrayList localArrayList2 = new ArrayList();
      
              HashMap localHashMap = new HashMap();
          localHashMap.put("AAA", "BBB");
          localHashMap.put("CCC", "DDD");
          System.out.print((String)localHashMap.get("AAA"));
        }
      

      因此对于运行期的Java语言来说,ArrayList <Integer>与ArrayList<String>编译出来的代码是一样的,所以说泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。

    5. 类型擦除:在jdk1.5之后,Java引进了泛型的概念,在不确定具体的类型,或者说想使用多种类型的时候,可以用泛型来表示,但是代码在具体执行的时候需要指定具体的类型,因此会在代码编译阶段,泛型会被具体的类型替换,这也就是类型擦除。举个简单的例子,Map<String,T>  这个map在写代码的时候可以不指定具体的类型,但是具体在执行的时候,需要确定类型的,如果不确定具体的类型,是没有办法确定value是哪一种类型的,而这个确定类型的动作就是在编译的时候确定的,也就是类型擦除。

  13. 说说自定义注解的场景及实现

    1. 参照:https://blog.youkuaiyun.com/striveb/article/details/81981693
    2. https://blog.youkuaiyun.com/bluuusea/article/details/79996572
  14. HTTP请求的GET与POST方式的区别

    参照:https://blog.youkuaiyun.com/striveb/article/details/84635456
  15. HTTP请求总共有哪几种类型

    1. 除了get和post,还有一下这几种:
    2. HEAD:与GET请求类似,不同在与服务器只返回HTTP头部信息,没有页面内容
    3. PUT:上传指定URL的描述
    4. DELETE:删除指定资源
    5. OPTIONS:返回服务器支持的HTTP方法
    6. CONNECT:转换为透明TCP/IP隧道的连接请求
  16. 常见的状态码

    https://blog.youkuaiyun.com/striveb/article/details/84070336
  17. Session与Cookie区别

    1. 前言:HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。
    2. session原理(有时间限制,默认30分钟,浏览器关闭即消失):
      1. 浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=ID的值,创建一个Cookie对象key为JSSIONID,value为ID的值,将这个Cookie写回浏览器;
      2. 浏览器在第二次访问服务器的时候携带Cookie信息JSESSIONID(Java中)=ID的值,如果该JSESSIONID的session已经销毁,那么会重新创建一个新的session再返回一个新的JSESSIONID通过Cookie返回到浏览器;
      3. 针对一个web项目,一个浏览器是共享一个session,就算有两个web项目部署在同一个服务器上,针对两个项目的session是不同的。 如:你在tomcat上同时部署了两个web项目,分别是web1、web2。当你在一个浏览器上同时访问web1时创建的session是A1,访问web2时创建的session是A2。后面你再多次访问web1使用的session还是A1,多次访问web2时使用session就是A2
      4. session是基于Cookie技术实现,重启浏览器后再次访问原有的连接依然会创建一个新的session,因为Cookie在关闭浏览器后就会消失,但是原来服务器的Session还在,只有等到了销毁的时间会自动销毁;

      5. 如果浏览器端禁用了Cookie,那么每次访问都会创建一个新的Session,但是我们可以通过服务器端程序重写URL即可,如果页面多连接多,会增加不必要的工作量,那可以强制让你用户开启接收Cookie后再让其访问即可。无法禁用服务器的session

      6. 两者区别:

        1.  Cookie和Session都是会话技术,Cookie是保存在客户端,Session是保存在服务器端。
        2.  Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。  
        3. Cookie有安全隐患(因为存在客户端),通过拦截或本地文件找得到你的cookie后可以进行攻击。
        4. Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
        5. 存储数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象。
        6. Session过多时会消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端没问题。
        7. 域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享。
  18. 列出自己常用的JDK包

    1. https://blog.youkuaiyun.com/u011915230/article/details/53113525
  19. MVC设计思想

    1. 概念:MVC是一种设计思想,主要分为三层:1)模型层: 主要是业务逻辑,包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
                 2)视图层:展现模型处理的结果,即对数据进行了渲染展示;另外,还要提供相应的操作界面,方便用户使用。

                 3)控制层:接受客户端发过来的请求,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。

    2. 在Java中,对于MVC的应用主要是:

      web层:Servlet(Controller)和JSP(View);service层(业务逻辑层,Model): service和JavaBean;数据访问层:dao

       

  20. equals与==的区别

    1. equals是object类中的方法,从Object类中的源码中可以看出,其实equals主要也是调用了“==”;如果我们程序中没有重写equals方法的话,默认就是调用了Object类中的equals方法
      public boolean equals(Object obj) {
              return (this == obj);
          }
      其他类可以重写equals方法,比如下面这个是Integer类对equals这个方法的重写,先判断类型,再判断是否相等
      public boolean equals(Object obj) {
              if (obj instanceof Integer) {
                  return value == ((Integer)obj).intValue();
              }
              return false;
          }
    2. == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

      1. 1、比较的是操作符两端的操作数是否是同一个对象。
        2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
        3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
        int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

    3. equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    4. 简单说:equals比较的只是值是否相等,而“==”比较的是地址是否相等,此外,要注意String类型的比较,如果常量池中已存在某个字符串的话,那么此时“==”的比较结果为true。

    5. "=="比"equals"运行速度快,因为"=="只是比较引用。

  21. hashCode和equals方法的区别与联系

    1. hashCode方法是通过哈希算法计算一个对象实例的哈希值(即地址);equals方法判断一个对象实例所指向的值或者两个值是否相等;
    2. hashCode效率会比较高,但是并不是完全可靠,因为生成hash值的算法可能有问题,所以可能会导致两个对象生成的hash值是一样的;
    3. 两个obj,如果equals()相等,hashCode()一定相等。
      两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
    4. https://www.cnblogs.com/jesonjason/p/5492208.html
    5. https://www.cnblogs.com/keyi/p/7119825.html
  22. 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用

    1. 序列化与反序列化:将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象。序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间,可以将其保存在硬盘上,进行持久化。
    2. 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
    3. 在IDEA中可以用这个插件生成SerializableID,下载后可以设置快捷键。SerializableID作为唯一标识一个类,如果这个类被修改,增加了某些属性,SerializableID会发生变化,SerializableID用于判断类和对象是否是同一个版本。
  23. Object类中常见的方法,为什么wait  notify会放在Object里边?

    1. wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态。
    2. wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。
    3. 这些方法之所以在Object里头主要是因为:1、这些方法存在于同步中; 2、使用这些方法必须标识同步所属的锁; 
      3、锁可以是任意对象,所以任意对象调用方法一定定义在Object类中。4、因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。等待和唤醒必须是同一个锁。
    4. notify() :唤醒在此对象监视器上等待的单个线程。 
    5. wait() :导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
    6. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 
    7. https://blog.youkuaiyun.com/m0_37531231/article/details/79574665
  24. Java的平台无关性如何体现出来的

    1. 所谓的平台无关就是指软件的运行不会因操作系统、处理器的变化而无法运行或出现运行错误。Java通过jvm来实现平台无关性。 
    2. Java提供了jre,JRE由Java虚拟机,类库和一些核心文件组成,也就是说,只要平台提供了Java运行环境,Java编写的软件就可以在其上运行。 
    3. Java语言的运行原理: 
      在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。由于在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用,所以字节码其实是一种“中间代码”,这也就是为什么“Java语言能够一次编译,处处运行,也就是Java跨平台的原因。”所以称Java是一种“半编译,半解释的语言”,即源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。”

  25. JDK和JRE的区别

    1. JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
    2. Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。
  26. Java 8有哪些新特性

    1. https://blog.youkuaiyun.com/u014470581/article/details/54944384#commentBox
    2. https://blog.youkuaiyun.com/54powerman/article/details/73188951#commentBox
  27. 成员变量与局部变量的区别有那些

    1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;
    2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存
    3. 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
    4. 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰但没有被 static 修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。

参照:https://blog.youkuaiyun.com/why15732625998/article/details/79437930#commentBox

汇川Easy系列斜坡函数功能块(支持状态输出) IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。 阅读详情

相关推荐

【吃瓜教程】周志华西瓜书课后习题第一章答案

第一章 1.1表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。 编号 色泽 根蒂 敲声 好瓜(标记) 1 青绿 蜷缩 浊响 是Y 4 乌黑 稍蜷 沉闷 否N 知识储备: 假设空间: 所有假设组成的空间 版本空间:与训练集一致的假设集合 从假设空间到版本空间算法大致如下: 1.删除与正例不一致的假设且删除与反例一致的假设 2.删除与正例不一致的假设 3.删除与反例一致的假设 具体选择哪种

MaxQuYY的博客 8368

Java编程50题

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 publicclasslianxi01{ publicstaticvoidma...

chunbo1110的博客 899

Java面试笔试题大汇总(最全+详细答案)

Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。NIO 主要有三大核心部分:Channel(通道)Buffer(缓冲区)Selector。

2401_89221867的博客 4612

海外支付实战:虚拟信用卡订阅ChatGPT Plus等服务的完整指南

在跨境数字服务消费中,支付环节常因地区限制、银行风控等因素受阻。其核心原理在于国际信用卡交易需通过发卡行风控系统,而国内银行对高频、小额或商户名非常规的境外线上交易敏感,导致成功率不稳定。为解决这一痛点,虚拟信用卡技术应运而生,它通过服务商生成关联预充值账户的虚拟卡号,提供地域灵活性与资金可控性,显著提升了支付通过率。这项技术的价值在于以较低学习成本,为个人用户打通了访问ChatGPT Plus、Midjourney、Claude Pro等前沿AI服务的支付通道。其典型应用场景包括订阅各类海外SaaS、内容

weixin_42531579的博客 1017

Cadence Allegro安装全攻略:从准备到优化的完整指南

本文提供了一份详尽的Cadence Allegro安装教程,涵盖从系统准备、硬件要求到获取安装文件的完整前期工作。指南逐步解析了自定义安装、路径选择及核心组件配置,并重点阐述了许可证服务器的环境变量设置与服务启动等关键激活步骤,最后给出了首次启动验证、个性化优化及常见问题排错方案,助您高效完成安装与配置。

weixin_29243063的博客 185

Java程序员不得不会的124道面试题(含答案)

double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。

Javaesandyou的博客 3万+

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 677

java面试/笔试题目之Java常见集合(持续更新中)

声明:题目大部分来源于Java后端公众号,有些个人整理,但答案皆为个人整理,仅供参考。 GitHub:https://github.com/JDawnF 目录 Java中的集合 List 和 Set 区别 1.Set:集合中的对象不按特定方式排序(针对内存地址来说,即非线性),并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。 2.List:集合中的对象线性方式储存,可以...

striveb的博客 3189

深入探究ASP.NET Core读取Request.Body的正确方式

前言# 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中。因为笔者日常开发所使用的主要也是ASP.NET Core所以笔者也遇到这这种场景,关于本篇文章所套路的内容,来自于在开发过程中我遇到的关于Request.Body的读取问题。在之前的使用的时候,基本上都是借助搜索引擎搜索的答案,并没有太关注这个,发现自己理解的和正确的使用之间存在很大的误区。故有感而发,便写下此文,以作记录。学无止境

萌兔兔MMQ!! 776

【气候模式降尺度】分位数增量映射(QDM)原理及MATLAB代码实现

简介QDM原理及其MATLAB代码实现

WW、forever的博客 5858

Java面试线程的锁_java面试/笔试题目之多线程及锁 (持续更新中)

前言:这一模块可以参照徐刘根大佬的博客。目录一.线程和进程的概念、并行和并发的概念1.进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统 进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。2.线程:是程序执行流的 最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度 的执行单元,是系统独立调度和分派CPU的基本...

weixin_39890629的博客 324

[Dify实战] 解决 Dify 导入 DSL 文件时报 “DSL 版本差异” 的兼容性问题

摘要:本文针对Dify开发者在导入.dsl文件时遇到的版本警告提示问题,分析其根源在于DSL文件与当前系统版本不一致。解决方案是通过导出当前Dify应用的DSL文件查看版本号,手动修改待导入文件的version字段以匹配。文章详细说明了操作步骤,并给出使用专业编辑器、避免修改其他字段等实用建议,帮助开发者规避版本不兼容问题,提升多模态AI应用开发效率。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 960

java面试/笔试题目之多线程及锁 (持续更新中)

GitHub:https://github.com/JDawnF 前言:这一模块可以参照徐刘根大佬的博客。 目录 一.线程和进程的概念、并行和并发的概念 二.创建线程的方式及实现 三.线程间通信的方式 四.说说 CountDownLatch、CyclicBarrier 原理和区别 五.说说 Semaphore 原理 六.说说 Exchanger 原理 七.ThreadLocal ...

striveb的博客 1657

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android开发经典笔试面试题汇总(持续更新中)

1.我们都知道Handler是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得很慢,那么线程销毁的方法是:(A) A. onDestroy() B. onClear() C. onFinish() D. onStop() 理解:正确销毁线程的方法应该是handler.removeCallBacks()。 2.SharedPreferences保存文件的路径和

乞力马扎罗的雪CYF的博客 6438

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

2020Java笔试/面试题(持续收集整理更新)

说明: 本篇用于收集知识点方便随时巩固,持续更新与纠错。 关于JDK版本,若无特殊说明,默认为JDK 1.8,。 关于JVM版本,若无特殊说明,默认为 HotSpot。 目录 一、Java 基础 1.1Java中的基本数据类型有哪几种?各占用多少字节? 1.2String 在Java中是个特殊的存在,谈谈? 1.3 谈谈 String、StringBuffer、StringBu...

Never-Say-Never 7622

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java基础笔试练习(四),javaspring面试题及答案

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

2401_84424972的博客 953

Java工程师面试(持续更新中)——完整的面试流程是如何的!!!!

Java工程师面试第一阶段:自我介绍在大学期间做过哪些项目?在实习中担任的角色第二阶段:离职原因我离职的原因第三阶段:项目描述你能详细讲述一下自己所做的项目吗?第四阶段:技术面试超频面试题(不记录答案)HashMap在JDK1.8前后的区别HashMap和ConcurrentHashMap的区别HashMap和HashTable的区别String,StringBuffer,StringBuild的区别线程的几种实现方式线程的几种状态线程池有所了解吗?有哪几种类型线程池的创建方式?了解哪些锁?sychorni

JavaKobeBryant的技术交流 1939

java基础笔试题在线考,java开发面试基础题目

的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。核心学习笔记、全套讲解视频、实战项目源码讲义》

2401_84408418的博客 994

Java高级笔试宝典覆盖近3年Java笔试中98%高频知识点

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!图片转存中…(img-yoHyDYh1-1712035824681)]

2401_84009488的博客 804

java 基础知识面试题(持续更新),java基础面试笔试题

我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。 扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。 推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化 1.权限修饰符 public ,protected ,默认, private 的区别...

agoodcoder777的博客 433

java基础笔试题目,【吐血整理】

什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?ActiveMQ中的消息重发时间间隔和重发次数吗?

2301_82101470的博客 846

rabbitmq入门教程,持续更新大厂面试笔试题

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,算法与数据结构是必备不可少的。

q16974058的博客 699

javahashmap原理,java面试sql笔试题目

面试题文档来啦,内容很多,485页!由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

2401_84413490的博客 650

笔试面试(持续更新)

在这段代码中,变量 b 最初的值是 10。然后,在 try 块中,b 的值增加了 10,变成了 20。接着,由于遇到了 return 语句,try 块中的代码执行到此结束,程序将跳出整个方法。但在方法返回之前,finally 块中的代码会执行。finally 块中的 return 语句会覆盖掉 try 块中的 return 语句,所以最终的返回值是 b 的当前值,即 30。一个印象比较深刻的题目是问try/catch/finally的题目:请问如下代码执行结果?

linjianshaonian_的博客 629

2025华为OD机试已正式切换E卷,E卷新题正在火热更新中,支持在线OJ练习题目,三种语言解答,每日持续更新 (已更新570道)

华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2024年最新题库,一文带你读懂华为OD,华为机试e卷

KJ.JK 6万+
上一篇: 数据库的四大特性及事务
下一篇: java面试/笔试题目之Java常见集合(持续更新中)
striveb
博客等级 码龄10年 242粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值