当前位置: 首页 > 后端技术 > Java

Java培训基础高频面试题Stereotype作文分享

时间:2023-04-02 00:12:50 Java

Java特性Java是一门面向对象的编程语言。面向对象和面向过程的区别,参考第三个问题。Java独立于平台且可移植。Java有一句??口号:Writeonce,runanywhere,Writeonce,runeverywhere。这也是Java的魅力所在。而实现这一特性的正是Java虚拟机JVM。编译后的Java程序可以在任何带有JVM的平台上运行。你可以在windows平台上写代码,然后让它在linux上运行。Java培训只要在写完代码后将代码编译成.class文件,然后将class文件打包成Java包,jar包就可以在不同的平台上运行了。Java很健壮。Java是一种强类型语言,它允许对潜在的类型不匹配进行扩展的编译时检查。Java需要显式方法声明,它不支持C风格的隐式声明。这些严格的要求确保编译器捕获调用错误,从而产生更可靠的程序。异常处理是Java中使程序更健壮的另一个特性。异常是类似于错误的某种异常情况的信号。使用try/catch/finally语句,程序员可以找到错误处理代码,从而简化了错误处理和恢复的任务。Java和C++的区别Java是纯面向对象的语言,所有的对象都继承自java.lang.Object,C++兼容C,不仅支持面向对象还支持面向过程。Java通过虚拟机实现跨平台的特性,而C++依赖于特定的平台。Java没有指针,它的引用可以理解为安全指针,而C++和C一样有指针。Java支持自动垃圾回收,而C++需要手动回收。Java不支持多重继承,只能通过实现多个接口来达到同样的目的,而C++支持多重继承。面向对象和面向过程有什么区别?面向对象和面向过程是一种软件开发思想。面向过程就是分析解决问题所需要的步骤,然后用函数来实现这些步骤,使用的时候依次调用。面向对象就是将组成问题的事务分解成一个个的对象,对这些对象分别进行设计,然后将它们组装成一个功能完整的系统。面向过程只是用函数实现,面向对象是用类来实现各个功能模块。以西洋双陆棋为例,面向过程的设计思想是分析问题的第一步:1.开始游戏;,判断输赢,8,返回第2步,9,输出最终结果。用单独的函数实现上面的每一步,问题就解决了。面向对象设计是从另一种思路来解决问题。整个五子棋可以分为:黑白板系统,负责画图规则系统,负责判定如犯规,输赢等,黑白两边负责接受用户的输入,并通知棋盘系统,棋子的布局发生了变化。棋盘系统收到棋子变化信息后,负责将变化显示在屏幕上。同时,它使用规则系统来判断棋局。JKD和JRE的区别?JDK和JRE是Java开发和运行工具,其中JDK包含JRE,JRE可以独立安装。JDK:JavaDevelopmentKit,JAVA语言的软件工具开发包,是整个JAVA开发的核心。包括JAVA运行时(JVM+JAVA类库)环境和JAVA工具。JRE:JavaRuntimeEnvironment,Java运行时环境,包括JVM标准实现和Java核心类库。JRE是Java运行环境,不是开发环境,因此不包含任何开发工具(如编译器、调试器)。JRE是运行用Java语言编写的程序不可或缺的运行环境。也正是通过它,Java开发者可以将自己开发的程序发布给用户使用。面向对象的特点是什么?面向对象的四大特点:封装、继承、多态、抽象1、封装是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过类实现对隐藏信息的操作和访问类的方法。良好的包装减少了耦合。2.继承就是从一个已经存在的类派生出一个新的类。新类继承了父类的属性和行为,可以扩展新的能力,大大增加了程序的可重用性和易维护性。在Java中是单继承,即一个子类只有一个父类。3.多态性是同一行为具有多种不同表现形式的能力。在不修改程序代码的情况下,更改程序运行时绑定的代码。多态的三要素:继承、重写和指向子类对象的父类引用。静态多态:通过重载实现,同一个方法有不同的参数列表,可以根据不同的参数做不同的处理。动态多态:在子类中覆盖父类的方法。运行时判断被引用对象的实际类型,根据其实际类型调用相应的方法。4.抽象。用代码抽象客观事物。Java的基本数据类型有哪些?byte,8bitchar,16bitshort,16bitint,32bitfloat,32bitlong,64bitdouble,64bitboolean,只有两个值:true,false,可以用1bit来存储什么是值传递和引用传递?值传递是针对基本变量的,传递的是变量的副本,改变副本不会影响原变量。引用传递一般是针对对象变量,传递的是对象地址的副本,而不是原始对象本身。所以对引用对象的操作也会改变原始对象。Java中自动装箱拆箱的基本数据类型及其对应的包装类如下表所示:装箱:将基本类型转换为包装类型。拆箱:将包装类型转换为基础类型。当基本类型及其封装类有以下几种情况时,编译器会自动帮我们装箱或拆箱:赋值操作(装箱或拆箱)进行加减乘除混合运算(拆箱)>、<、==比较操作(拆箱)调用equals进行比较(装箱)ArrayList、HashMap等集合类添加基本类型数据(装箱)示例代码:Integerx=1;//装箱调用Integer.valueOf(1)inty=x;//拆箱并调用X.intValue()来看一个常见的面试题:publicvoidtestAutoBox(){inta=100;Integerb=100;System.out.println(a==b);Integerc=100;整数d=100;System.out.println(c==d);整数e=200;整数f=200;System.out.println(e==f);}output:truetruefalse为什么第三个输出是假的?看看Integer类的源代码就知道了。publicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}整数e=200;将调用Integer.valueOf(200)。从Integer的valueOf()的源码可以看出,这里的实现并不是简单的newInteger,而是使用了IntegerCache作为缓存。privatestaticclassIntegerCache{staticfinalintlow=-128;staticfinalinthigh;staticfinalIntegercache[];static{//高值可以通过property配置inth=127;StringintegerCacheHighPropValue=sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if(integerCacheHighPropValue!=null){try{inti=parseInt(integerCacheHighPropValue);i=Math.max(i,127);//最大数组大小为整数.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE-(-low)-1);}catch(NumberFormatExceptionnfe){//如果属性不能解析成int,忽略它。}}high=h;}...}这是IntegerCache静态代码块的一部分。Integer缓存默认下限为-128,上限默认为127。在给Integer赋值100的时候,刚好在这个范围内,所以从缓存中取出对应的Integer返回,所以同一个对象返回了两次,所以==比较相等。给Integer赋值200时,不在缓存范围内,所以会返回新的Integer,当然==比较的结果不是equal_java培训机构。为什么String是不可变的?先看Java8String类的源码:publicfinalclassStringimplementsjava.io.Serializable,Comparable,CharSequence{/*value用于字符存储。/privatefinalcharvalue[];/*缓存字符串的哈希码/privateinthash;//默认为0}String类是final的,它的所有成员变量也是final的。为什么它是最终的?线程安全。同一个字符串实例可以被多个线程共享,因为字符串是不可变的和线程安全的。支持哈希映射和缓存。因为String的hash值经常用到,比如Map的key,不可变的特性使得hash值不变,不需要重新计算。字符串常量池优化。String对象创建后,会缓存在字符串常量池中。下次需要创建相同的对象时,直接返回缓存的引用即可。String、StringBuffer和StringBuilder之间的区别是可变的。字符串是不可变的。StringBuffer和StringBuilder是可变的和线程安全的。字符串是不可变的,所以它是线程安全的。StringBuilder不是线程安全的。StringBuffer是线程安全的,内部使用synchronized进行同步。String类的常用方法有哪些??indexOf():返回指定字符的索引。charAt():返回指定索引处的字符。replace():字符串替换。trim():去除字符串两端的空白。split():对字符串进行拆分,返回拆分后的字符串数组。getBytes():返回字节类型的字符串数组。length():返回字符串的长度。toLowerCase():将字符串转换为小写字母。toUpperCase():将字符串转换为大写字符。substring():截取一个字符串。equals():字符串比较。newString("dabin")会创建多少个对象?使用该方法会创建两个字符串对象(前提是字符串常量池中没有“dabin”字符串对象)。“dabin”是一个字符串字面量,所以编译时会在字符串常量池中创建一个字符串对象,指向“dabin”字符串字面量;使用new将在堆中创建一个字符串对象。什么是字符串常量池?字符串常量池保存所有字符串文字,这些文字在编译时确定。字符串常量池位于堆内存中,专门用于存放字符串常量。在创建字符串时,JVM首先检查字符串常量池。如果该字符串已存在于池中,则返回其引用。如果不存在,则创建该字符串并将其放入池中,并返回其引用。Object的常用方法有哪些?Object的常用方法有:toString()、equals()、hashCode()、clone()、getClass()等。toString:默认输出对象地址。toString方法可以根据重写逻辑重写为输出对象值。equals:默认比较两个引用变量是否指向同一个对象(内存地址)。hashCode:将与对象相关的信息映射成一个哈希值。默认实现hashCode值是根据内存地址转换的。clone:可以实现对象中各个属性的复制。getClass:返回此Object的运行时类,常用于java反射机制。wait:当前线程调用对象的wait()方法后,当前线程会释放对象锁,进入等待状态。等待其他线程调用本对象的notify()/notifyAll()唤醒或等待超时wait(longtimeout)自动唤醒。线程在调用obj.wait()之前需要获取obj对象锁。notify:唤醒等待该对象的单个线程,选择任意。notifyAll()唤醒所有等待这个对象的线程。文章来自程序员大斌