Java是一种广泛使用的编程语言,具有许多特性使其成为开发者的首选。以下是一些关键的Java特性:
简单易学:Java的语法相对简单,易于理解和学习。它采用了C和C++的语法,去除了一些复杂的特性,使得编程变得更加简单。
面向对象:Java是一种纯粹的面向对象编程语言。它支持封装、继承和多态等面向对象的特性,使得代码更加可重用和可维护。
平台无关性:Java是一种跨平台的语言,也被称为“Write Once, Run Anywhere”(一次编写,到处运行)。Java程序可以在不同的操作系统上运行,只需在目标平台上安装Java虚拟机(JVM)。
内存管理:Java通过自动垃圾回收机制来管理内存,减轻了开发者的负担。开发者不需要手动分配和释放内存,而是交给垃圾回收器来处理。
强类型检查:Java是一种强类型语言,要求变量在使用之前必须先声明类型。这样可以避免潜在的类型错误,提高代码的健壮性。
安全性:Java内置了安全性机制,可以防止未经授权的访问和恶意代码的执行。Java的安全性特性包括类加载器、安全管理器和字节码校验等。
多线程支持:Java具有强大的多线程支持,可以同时执行多个任务。多线程可以提高程序的性能和响应能力,使得程序可以同时处理多个请求。
异常处理:Java提供了异常处理机制,可以捕获和处理程序运行时出现的异常。这样可以避免程序崩溃,并提供友好的错误提示。
大量的开发库和框架:Java拥有丰富的开发库和框架,可以加快开发速度,提高代码质量。一些知名的Java开发库和框架包括Spring、Hibernate和Apache Commons等。
开源生态系统:Java有一个庞大的开源社区,提供了大量的开源工具和库。开发者可以利用这些开源资源来加速开发过程,降低开发成本。
总而言之,Java是一种功能强大且易于学习的编程语言,具有广泛的应用领域。它的特性使得开发者可以更加高效地开发出可靠、安全且高性能的应用程序。无论是开发桌面应用、移动应用还是企业级应用,Java都是一个理想的选择。
JVM vs JDK vs JRE
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。
JDK(Java Development Kit),它是功能齐全的 Java SDK,是提供给开发者使用的,能够创建和编译 Java 程序。他包含了 JRE,同时还包含了编译 java 源码的编译器 javac 以及一些其他工具比如 javadoc(文档注释工具)、jdb(调试器)、jconsole(基于 JMX 的可视化监控⼯具)、javap(反编译工具)等等。
JRE(Java Runtime Environment) 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,主要包括 Java 虚拟机(JVM)、Java 基础类库(Class Library)。
为什么说 Java 语言“编译与解释并存”?
这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。
Oracle JDK vs OpenJDK
是否开源
是否免费
功能性
稳定性
协议
Java 和 C++ 的区别?
区别一:解释对编译
Java是一种解释性语言,意味着其在执行时会被“翻译”为二进制形式,也就是java跑得时候必须有人(jvm)去解释它。而C++则是编译语言,意味着程序只能在特定操作系统上编译并在特定系统上运行,也就是说C++一步到位成机器语言的。
区别二:内存安全
Java是一种内存安全型语言,意味着大家可以为给定数组分配任意参数,即使超出范围也只会返回错误提示。C++更为灵活,但代价是一旦分配的参数超出资源范围,则会引起错误甚至严重崩溃。
区别三:性能
Java人气极高,但其代码由于需要在运行前进行解释因此性能表现更差。C++会被编译为二进制形式,因此其能够立即运行且速度更快。如果你写一个c++的程序和做同样事情的java程序,可能你感觉两者速度差不多。但如果这两个程序都足够大、而且c++的代码经过过优化,两者的速度差就会变得很显著甚至很惊人,C++会比java快很多。
区别四:指针
指针是一种C++结构,允许您直接在内存空间中进行值管理。Java不支持指针,因此您可能使用值引用的方式进行值传递。
区别五:重载
重载是指对某种方法或者运算符的功能进行“重新定义”。Java允许方法重载,而C++则允许进行运算符重载。
了解了c++和java有什么区别,你觉得哪个更好呢?其实小千认为这两种语言各有各的优势,在目前看来,Java编程语言实用性更为广泛。
注释有哪几种形式?
- 单行注释:通常用于解释方法内某单行代码的作用。
- 多行注释:通常用于解释一段代码的作用。
- 文档注释:通常用于生成 Java 开发文档。
标识符和关键字的区别是什么?
标识符就是一个名字 。
关键字是被赋予特殊含义的标识符
Java 语言关键字有哪些?
分类关键字
访问控制privateprotectedpublic
类,方法和变量修饰符abstractclassextendsfinalimplementsinterfacenativenewstaticstrictfpsynchronizedtransientvolatileenum
程序控制breakcontinuereturndowhileifelseforinstanceofswitchcasedefaultassert
错误处理trycatchthrowthrowsfinally
包相关importpackage
基本类型booleanbytechardoublefloatintlongshort
变量引用superthisvoid
保留字gotoconst
移位运算符
-
<<
:左移运算符,向左移若干位,高位丢弃,低位补零。x << 1
,相当于 x 乘以 2(不溢出的情况下)。 -
>>
:带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。x >> 1
,相当于 x 除以 2。 -
>>>
:无符号右移,忽略符号位,空位都以 0 补齐。
如果移位的位数超过数值所占有的位数会怎样?
当 int 类型左移/右移位数大于等于 32 位操作时,会先求余(%)后再进行左移/右移操作。也就是说左移/右移 32 位相当于不进行移位操作(32%32=0),左移/右移 42 位相当于左移/右移 10 位(42%32=10)。当 long 类型进行左移/右移操作时,由于 long 对应的二进制是 64 位,因此求余操作的基数也变成了 64。
也就是说:x<<42
等同于x<<10
,x>>42
等同于x>>10
,x >>>42
等同于x >>> 10
。
continue、break 和 return 的区别是什么?
-
continue
:指跳出当前的这一次循环,继续下一次循环。 -
break
:指跳出整个循环体,继续执行循环下面的语句。
return
用于跳出所在方法,结束该方法的运行。return 一般有两种用法:
-
return;
:直接使用 return 结束方法执行,用于没有返回值函数的方法 -
return value;
:return 一个特定值,用于有返回值函数的方法
Java 中的几种基本数据类型了解么?
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数型:
byte
、short
、int
、long
- 2 种浮点型:
float
、double
- 1 种字符类型:
char
- 1 种布尔型:
boolean
。
基本类型和包装类型的区别?
- 用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。
- 存储方式:基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被
static
修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。 - 占用空间:相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小。
- 默认值:成员变量包装类型不赋值就是
null
,而基本类型有默认值且不是null
。 - 比较方式:对于基本数据类型来说,
==
比较的是值。对于包装数据类型来说,==
比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用equals()
方法。
自动装箱与拆箱了解吗?原理是什么?
什么是自动拆装箱?
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
为什么浮点数运算的时候会有精度丢失的风险?
计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。
如何解决浮点数运算的精度丢失问题?
BigDecimal
可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal
来做的。
成员变量与局部变量的区别?
- 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被
public
,private
,static
等修饰符所修饰,而局部变量不能被访问控制修饰符及static
所修饰;但是,成员变量和局部变量都能被final
所修饰。 - 存储方式:从变量在内存中的存储方式来看,如果成员变量是使用
static
修饰的,那么这个成员变量是属于类的,如果没有使用static
修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。 - 生存时间:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。
- 默认值:从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被
final
修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。
静态变量有什么作用?
静态变量也就是被 static
关键字修饰的变量。它可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。也就是说,静态变量只会被分配一次内存,即使创建多个对象,这样可以节省内存。
字符型常量和字符串常量的区别?
- 形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符。
- 含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。
- 占内存大小:字符常量只占 2 个字节; 字符串常量占若干个字节。
重载和重写有什么区别?
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
什么是可变长参数?
从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。就比如下面的这个 printVariable
方法就可以接受 0 个或者多个参数。
面向对象和面向过程的区别
面向对象和面向过程的区别:1、思路不同2、特点不同3、优势不同。面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用就可以了;而面向对象是将构成问题的事物,分解成若干个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决问题过程中的行为。面向过程思想偏向于我们做一件事的流程,首先做什么,其次做什么,最后做什么。面向对象思想偏向于了解一个人,这个人的性格、特长是怎么样的,有没有遗传到什么能力,有没有家族病史。
面向过程是一种以过程为中心的编程思想,面向过程编程是基于“冯·诺依曼”模型的。面向过程的优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。缺点:需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。面向对象优点:易维护、易扩展、易复用,有封装、继承、多态的特性、更容易设计出耦合的系统。缺点:性能比面向过程低。
如何理解面向对象的三个特性?
1.封装性
就是把属性和方法都放在一个类里面,而且还可以通过访问类的权限属性给区分开,更加安全,不想要释放的功能,直接搞成私有机制。
2.继承性
就是把之前已经实现好的代码或者方法通过继承的方法拿过来使用,能节省大量的代码量,符合代码设计里面的继承优秀代码特性。
3.多态性
由于可以继承多个类,能够组合成多种特性,但多态的关键是覆盖,就是同一个方法可以用不同的方式去实现,展现出多态性。
创建一个对象用什么运算符?对象实体与对象引用有何不同?
new 运算符,new 创建对象实例(对象实例在 内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
- 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
- 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。
对象的相等和引用相等的区别
- 对象的相等一般比较的是内存中存放的内容是否相等。
- 引用相等一般比较的是他们指向的内存地址是否相等。
构造方法有哪些特点?是否可被 override?
构造方法特点如下:
- 名字与类名相同。
- 没有返回值,但不能用 void 声明构造函数。
- 生成类的对象时自动执行,无需调用。
构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。
接口和抽象类有什么共同点和区别?
共同点:
- 都不能被实例化。
- 都可以包含抽象方法。
- 都可以有默认实现的方法(Java 8 可以用
default
关键字在接口中定义默认方法)。
区别:
- 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
- 一个类只能继承一个类,但是可以实现多个接口。
- 接口中的成员变量只能是
public static final
类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
关于深拷贝和浅拷贝区别,我这里先给结论:
- 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
- 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
== 和 equals() 的区别
==
- 对于基本数据类型来说,
==
比较的是值。 - 对于引用数据类型来说,
==
比较的是对象的内存地址。
为什么重写 equals() 时必须重写 hashCode() 方法?
因为两个相等的对象的 hashCode
值必须是相等。也就是说如果 equals
方法判断两个对象是相等的,那这两个对象的 hashCode
值也要相等。
如果重写 equals()
时没有重写 hashCode()
方法的话就可能会导致 equals
方法判断是相等的两个对象,hashCode
值却不相等。
String、StringBuffer、StringBuilder 的区别?
可变性
线程安全性
性能
- 操作少量的数据: 适用
String
- 单线程操作字符串缓冲区下操作大量数据: 适用
StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用
StringBuffer
String 为什么是不可变的?
- 保存字符串的数组被
final
修饰且为私有的,并且String
类没有提供/暴露修改这个字符串的方法。 -
String
类被final
修饰导致其不能被继承,进而避免了子类破坏String
不可变。
Java 9 为何要将 String
的底层实现由 char[]
改成了 byte[]
?
新版的 String 其实支持两个编码方案:Latin-1 和 UTF-16。如果字符串中包含的汉字没有超过 Latin-1 可表示范围内的字符,那就会使用 Latin-1 作为编码方案。Latin-1 编码方案下,byte
占一个字节(8 位),char
占用 2 个字节(16),byte
相较 char
节省一半的内存空间。
String#equals() 和 Object#equals() 有何区别?
String
中的 equals
方法是被重写过的,比较的是 String 字符串的值是否相等。 Object
的 equals
方法是比较的对象的内存地址。
字符串拼接用“+” 还是 StringBuilder?
字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder
调用 append()
方法实现的,拼接完成之后调用 toString()
得到一个 String
对象 。
在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder
以复用,会导致创建过多的 StringBuilder
对象。在 JDK9 当中,字符串相加 “+” 改为了用动态方法 makeConcatWithConstants()
来实现
String#equals() 和 Object#equals() 有何区别?
String
中的 equals
方法是被重写过的,比较的是 String 字符串的值是否相等。 Object
的 equals
方法是比较的对象的内存地址。
字符串常量池的作用了解吗?
字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
String#intern 方法有什么作用?
String.intern()
是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
- 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
- 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。
标签:总结,Java,String,对象,常见,字符串,方法,变量 From: https://blog.51cto.com/u_4172728/7608434