96SEO 2026-02-20 03:57 10
.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性原理是什么Java语言有哪些特点什么是字节码采用字节码的大好处是什么什么是Java程序的主类应用程序和小程序的主类有何不同Java应用程序与小程序之间有那些差别Java和C的区别Oracle

public,private,protected,以及不写默认时的
finalize区别this关键字的用法super关键字的用法this与super的区别static存在的主要意义static的独特之处static应用场景static注意事项
三.面向对象1.面向对象概述面向对象和面向过程的区别面向过程面向对象
2.面向对象三大特性面向对象的特征有哪些方面什么是多态机制Java语言是如何实现多态的
四.类与接口抽象类和接口的对比普通类和抽象类有哪些区别抽象类能使用
五.变量与方法成员变量与局部变量的区别有哪些作用域存储位置生命周期初始值
在Java中定义一个不做事且没有参数的构造方法的作用在调用子类构造方法之前会先调用父类没有参数的构造方法其
改程序能正确执行吗为什么构造方法有哪些特性静态变量和实例变量区别静态变量与普通变量区别静态方法和实例方法有何不同在一个静态方法内调用一个非静态成员为什么是非法的什么是方法的返回值返回值的作用是什么
六.内部类什么是内部类内部类的分类有哪些静态内部类成员内部类局部内部类匿名内部类匿名内部类创建方式
内部类的优点内部类有哪些应用场景局部内部类和匿名内部类访问局部变量的时候为什么变量必须
七.重写与重载构造器constructor是否可被重写override重载Overload和重写Override的区别。
重载的方法能
hashCodehashCode()与equals()的相关规定因此equals
九.值传递当一个对象被当作参数传递到一个方法后此方法可改变这个对
十三.网络编程十四.常用APIString相关字符型常量和字符串常量的区别什么是字符串常量池String
是最基本的数据类型吗String有哪些特性String为什么是不可变的吗String真的是不可变的吗是否可以继承
有什么好处String和StringBuffer、StringBuilder的区别是什么String
编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码并
为了使计算机能够理解人的意图人类就必须要将需解决的问题的思路、方法、
和手段通过计算机能够理解的形式告诉计算机使得计算机能够根据人的指令一
步一步去工作完成某种特定的任务。
这种人和计算机之间交流的过程就是编
Java是一门面向对象编程语言不仅吸收了C语言的各种优点还摒弃了
C里难以理解的多继承、指针等概念因此Java语言具有功能强大和简单易
用两个特征。
Java语言作为静态面向对象编程语言的代表极好地实现了面向对
J2SE。
它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使
J2EE。
企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器
API可以用来实现企业级的面向服务体系结构service-oriented
机顶盒和打印机上运行的应用程序提供一个健壮且灵活的环境。
Java
户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序
Machine是Java虚拟机Java程序需要运行在虚拟机上不同的平
Environment包括Java虚拟机和Java程序所需的核心类库等。
核
心类库主要是java.lang包包含了运行Java程序必不可少的系统类如基本数
据类型、基本数学函数、字符串处理、线程、异常处理类等系统缺省加载这个包
如果想要运行一个开发好的Java程序计算机中只需要安装JRE即可。
工具也包括了JRE。
所以安装了JDK就无需再单独安装JRE了。
其中的开发工
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mFIOelzo-1692506313322)(01-Java基础知识面试题2020最新版.assets/image-20201106172325865.png)]
所谓跨平台性是指java语言编写的程序一次编译后可以在多个系统平台上
实现原理Java程序是通过java虚拟机在系统平台上运行的只要该系统可以安
支持网络编程并且很方便Java语言诞生本身就是为简化网络编程设计的
字节码Java源代码经过虚拟机编译器编译后产生的文件即扩展为.class的文
Java语言通过字节码的方式在一定程度上解决了传统解释型语言执行效率低的
问题同时又保留了解释型语言可移植的特点。
所以Java程序运行时比较高效
而且由于字节码并不专对一种特定的机器因此Java程序无须重新编译便可
Java中引入了虚拟机的概念即在机器和编译程序之间加入了一层抽象的虚拟机
器。
这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。
编译程
序只需要面向虚拟机生成虚拟机能够理解的代码然后由解释器来将虚拟机代
码转换为特定系统的机器码执行。
在Java中这种供虚拟机理解的代码叫做字节
码即扩展为.class的文件它不面向任何特定的处理器只面向虚拟机。
每
一种平台的解释器是不同的但是实现的虚拟机是相同的。
Java源程序经过编译
器编译后变成字节码字节码由虚拟机解释执行虚拟机将每一条要执行的字节
码送给解释器解释器将其翻译成特定机器上的机器码然后在特定的机器上运
Java源代码‐‐‐‐编译器‐‐‐‐jvm可执行的Java字节码(即虚拟指令)‐‐‐‐jvm‐‐‐‐jvm中
解释器‐‐‐‐‐机器可执行的二进制机器码‐‐‐‐程序运行。
什么是Java程序的主类应用程序和小程序的主类有何不同
一个程序中可以有多个类但只能有一个类是主类。
在Java应用程序中这个主
类是指包含main()方法的类。
而在Java小程序中这个主类是一个继承自系统
类JApplet或Applet的子类。
应用程序的主类不一定要求是public类但小程序
的主类要求必须是public类。
主类是Java程序执行的入口点。
简单说应用程序是从主线程启动(也就是main()方法)。
applet小程序没有main
方法主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动)嵌入浏
我知道很多人没学过C但是面试官就是没事喜欢拿咱们Java和C比呀
都是面向对象的语言都支持封装、继承和多态Java不提供指针来直接访问内存程序内存更加安全Java的类是单继承的C支持多重继承虽然Java的类不可以多继承但是
接口可以多继承。
Java有自动内存管理机制不需要程序员手动释放无用内存
JDK根据二进制代码许可协议获得许可而OpenJDK根据GPL
定义Java语言是强类型语言对于每一种数据都定义了明确的具体的数据类
下转型down-casting也称为窄化会造成精度损失因此需要强制类型转
Java语言采用Unicode编码标准Unicode标准码它为每个字符制订了一
在程序中尤其是复杂的程序中适当地加入注释可以增加程序的可读性有利
于程序的修改、调试和交流。
注释的内容在程序编译的时候会被忽视不会产生
public,private,protected,以及不写默认时的
定义Java中可以使用访问修饰符来保护对类、变量、方法和构造方法的访
运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的虽然二者都要
被final修饰的类不可以被继承被final修饰的方法不可以被重写被final修饰的变量不可以被改变被final修饰不可变的是变量的引用而不是引用指向的内容引用指向的内容是可以改变的
final可以修饰类、变量、方法修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中在处理异常的时候通常我们将一定要执行的代码方法finally代码块中表示不管是否出现异常该代码块都会执行一般用来存放一些关闭资源的代码。
finalize是一个方法属于Object类的一个方法而Object类是所有类的父类该方法一般由垃圾回收器来调用当我们调用System.gc()
方法的时候由垃圾回收器调用finalize()回收垃圾一个对象是否可回收的最后判断。
this是自身的一个对象代表对象本身可以理解为指向对象本身的一个指
super可以理解为是指向自己超父类对象的一个指针而这个超类指的是离
与this类似super相当于是指向当前对象的父类的引用这样就可以用
2.子类中的成员变量或方法与父类中的成员变量或方法同名时用super进行区
System.out.println(super.name);
super参数调用父类中的某一个构造函数应该为构造函数中的第一条语句。
this参数调用本类中另一种形式的构造函数应该为构造函数中的第一条语句。
它引用当前对象的直接父类中的成员用来访问直接父类中被隐藏的父类中成员数据或函数基类与派生类中有相同成员定义时如super.变量名
super.成员函数据名实参this它代表当前对象名在程序中易产生二义性之处应使用this来指明当前对象如果函数的形参与类中的成员数据同名这时需用this来指明成员变量名super()和this()类似,区别是super()在子类中调用父类的构造方法this()在本类内调用本类的其它构造方法。
super()和this()均需放在构造方法内第一行。
尽管可以用this调用一个构造器但却不能调用两个。
this和super不能同时出现在一个构造函数里面因为this必然会调用其它的构造函数其它的构造函数必然也会有super语句的存在所以在同一个构造函数里面有相同的语句就失去了语句的意义编译器也不会通过。
this()和super()都指的是对象所以均不可以在static环境中使用。
包括
static变量,static方法static语句块。
从本质上讲this是一个指向本对象的指针,
static的主要意义是在于创建独立于具体对象的域变量或者方法。
以致于即使没有创建对象也能使用属性和调用方法
用来形成静态代码块以优化程序性能。
static块可以置于类中的任何地方类中可以有多个static块。
在类初次被加载的时候会按照static块的顺序来执行每个static块并且只会执行一次。
为什么说static块可以用来优化程序性能是因为它的特性:只会在类加载的时候
执行一次。
因此很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
1、被static修饰的变量或者方法是独立于该类的任何对象也就是说这些变量和方法不属于任何一个实例对象而是被类的实例对象所共享。
这句话呢就是说一个类的静态成员它是属于大伙的【大伙指的是这个类的多个对象实例我们都知道一个类可以创建多个实例】所有的类对象共享的不像成员变量是自个的【自个指的是这个类的单个实例对象】…我觉得我已经讲的很通俗了你明白了咩
2、在该类被第一次加载的时候就会去加载被static修饰的部分而且只在类第一次使用时加载并进行初始化注意这是第一次用就要初始化后面根据需要是可以再次赋值的。
3、static变量值在类加载的时候分配空间以后创建类对象的时候不会重新分配。
赋值的话是可以任意赋值的
4、被static修饰的变量或者方法是优先于对象存在的也就是说当一个类加载完毕之后即便没有创建对象也可以去访问。
因为static是被类的实例对象所共享因此如果某个成员变量是被所有对象所共享的那么这个成员变量就应该定义为静态变量。
跳出总上一层循环不再执行循环(结束当前的循环体)continue
在Java中要想跳出多重循环可以在外面的循环语句前定义一个标号然后在里层循环体的代码中使用带有标号的break
优点性能比面向对象高因为类调用时需要实例化开销比较大比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发能是最重要的因素。
优点易维护、易复用、易扩展由于面向对象有封装、继承、多态性的特性可以设计出低耦合的系统使系统更加灵活、更加易于维护
面向过程是具体化的流程化的解决一个问题你需要一步一步的分析一步
面向对象是模型化的你只需抽象出一个类这是一个封闭的盒子在这里你拥有数据也拥有解决问题的方法。
需要什么功能直接使用就可以了不必去一步一步的实现至于这个功能是如何实现的管我们什么事我们会用就可以了。
面向对象的底层其实还是面向过程把面向过程抽象成类然后封装方便我们使用的就是面向对象了。
**抽象**抽象是将一类对象的共同特征总结出来构造类的过程包括数据抽象和行
为抽象两方面。
抽象只关注对象有哪些属性和行为并不关注这些行为的细节是
封装把一个对象的属性私有化同时提供一些可以被外界访问的属性的方法如
果属性不想被外界访问我们大可不必提供方法给外界访问。
但是如果一个类没
继承是使用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新
的数据或新的功能也可以用父类的功能但不能选择性地继承父类。
通过使用
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出
的方法调用在编程时并不确定而是在程序运行期间才确定即一个引用变量到
底会指向哪个类的实例对象该引用变量发出的方法调用到底是哪个类中实现的
在Java中有两种形式可以实现多态继承多个子类对同一方法的重写和接口
封装隐藏对象的属性和实现细节仅对外提供公共访问方式将变化隔离便
继承继承是使用已存在的类的定义作为基础建立新类的技术新类的定义可以
增加新的数据或新的功能也可以用父类的功能但不能选择性地继承父类。
通
的属性和方法。
子类可以拥有自己属性和方法即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
多态性父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
提
在Java中有两种形式可以实现多态继承多个子类对同一方法的重写和接口
方法重载overload实现的是编译时的多态性也称为前绑定而方法重
一个引用变量到底会指向哪个类的实例对象该引用变量发出的方法调用到底是
哪个类中实现的方法必须在由程序运行期间才能决定。
运行时的多态是面向对
方法重写子类继承父类并重写父类中已有的或抽象的方法对象造型用父类型引用子类型对象这样同样的引用调用同样的方法就会根据
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出
的方法调用在编程时并不确定而是在程序运行期间才确定即一个引用变量倒
底会指向哪个类的实例对象该引用变量发出的方法调用到底是哪个类中实现的
方法必须在由程序运行期间才能决定。
因为在程序运行时才确定具体的类这
样不用修改源程序代码就可以让引用变量绑定到各种不同的类实现上从而
导致该引用调用的具体方法随之改变即不修改程序代码就可以改变程序运行时
多态分为编译时多态和运行时多态。
其中编辑时多态是静态的主要是指方法的
重载它是根据参数列表的不同来区分不同的函数通过编辑之后会变成两个不
同的函数在运行时谈不上多态。
而运行时多态是动态的它是通过动态绑定来
重写子类对父类中某些方法进行重新定义在调用这些方法时就会调用子类的
向上转型在多态中需要将子类的引用赋给父类对象只有这样该引用才能够具
只有满足了上述三个条件我们才能够在同一个继承结构中使用统一的逻辑实现
对于Java而言它多态的实现机制遵循一个原则当超类对象引用变量引用子类
对象时被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法但
是这个被调用的方法必须是在超类中定义过的也就是说被子类覆盖的方法。
Principle)一个模块对于拓展是开放的对于修改是封闭的想要增加功能热烈欢迎想要修改哼
LSP)子类可以替换父类出现在父类能够出现的任何地方。
比如你能代表你爸去你姥姥家干活。
哈哈~~依赖倒置原则DIP(***
DIP)高层次的模块不应该依赖于低层次的模块他们都应该依赖于抽象。
抽象不应该依赖于具体实现具体实现应该依赖于抽象。
就是你出国要说你是中国人而不能说你是哪个村子的。
比如说中国人是抽象的下面有具体的xx省xx市xx县。
你要依赖的抽象是中国人而不是你是xx村的。
接口分离原则ISP(***
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
就比如一个手机拥有
打电话看视频玩游戏等功能把这几个功能拆分成不同的接口比在一个接口里要好的
从设计层面来说抽象类是对类的抽象是一种模板设计接口是行为的抽象是一种行为的规范。
接口和抽象类都不能实例化都位于继承的顶端用于被其他实现或继承都包含抽象方法其子类都必须覆写这些抽象方法
参数抽象类接口声明抽象类使用abstract关键字声明接口使用interface关键字声明实现子类使用extends关键字来继承抽象类。
如果子类不是抽象类的话它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。
它需要提供接口中所有声明的方法的实现构造器抽象类可以有构造器接口不能有构造器访问修饰符抽象类中的方法可以是任意访问修饰符接口方法默认修饰符是public。
并且不允许定义为
protected多继承一个类最多只能继承一个抽象类一个类可以实现多个接口字段声明抽象类的字段声明可以是任意的接口的字段默认都是
备注Java8中接口中引入默认方法和静态方法以此来减少抽象类和接口之间
现在我们可以为接口提供默认实现的方法了并且不用强制子类来实现它。
接口和抽象类各有优缺点在接口和抽象类的选择上必须遵守这样一个原则
行为模型应该总是通过接口而不是抽象类定义所以通常是优先选用接口尽量
少用抽象类。
选择抽象类的时候通常是如下情况需要定义子类的行为又要为子类提供通用
普通类不能包含抽象方法抽象类可以包含抽象方法。
抽象类不能直接实例化普通类可以直接实例化。
new关键字new创建对象实例对象实例在堆内存中对象引用指向对象实
例对象引用存放在栈内存中。
一个对象引用可以指向0个或1个对象一根
绳子可以不系气球也可以系一个气球;一个对象可以有n个引用指向它可以
变量在程序执行的过程中在某个范围内其值可以发生改变的量。
从本质上
成员变量随着对象的创建而存在随着对象的消失而消失存储在堆内存中。
局部变量在方法被调用或者语句被执行的时候存在存储在栈内存中。
当方法调用完或者语句结束后就自动释放。
Java程序在执行子类的构造方法之前如果没有用super()来调用父类特定的构
造方法则会调用父类中“没有参数的构造方法”。
因此如果父类中只定义了
有参数的构造方法而在子类的构造方法中又没有用super()来调用父类中特定
的构造方法则编译时将发生错误因为Java程序在父类中找不到没有参数的构
造方法可供执行。
解决办法是在父类里加上一个不做事且没有参数的构造方法。
主要作用是完成对类对象的初始化工作。
可以执行。
因为一个类即使没有声明构
static变量也称作静态变量静态变量和非静态变量的区别是静态变量被所有
的对象所共享在内存中只有一个副本它当且仅当在类初次加载时会被初始
化。
而非静态变量是对象所拥有的在创建对象的时候被初始化存在多个副
还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。
用对象名.方法名的方式。
而实例方法只有后面这种方式。
也就是说调
由于静态方法可以不通过对象进行调用因此在静态方法里不能调用其他非静
方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果前提
是该方法可能产生结果。
返回值的作用:接收出结果使得它可以用于其他的
在Java中可以将一个类的定义放在另外一个类的定义内部这就是内部类。
内
内部类可以分为四种成员内部类、局部内部类、匿名内部类和静态内部类。
}静态内部类可以访问外部类所有的静态变量而不可访问外部类的非静态变量
}成员内部类可以访问外部类所有的变量和方法包括静态和非静态私有和公
有。
成员内部类依赖于外部类的实例它的创建方式外部类实例.new
}定义在实例方法中的局部类可以访问外部类的所有变量和方法定义在静态方法
中的局部类只能访问外部类的静态变量和方法。
局部内部类的创建方式在对应
匿名内部类必须继承一个抽象类或者实现一个接口。
匿名内部类不能定义任何静态成员和静态方法。
当所在的方法的形参需要被匿名内部类使用时必须声明为
final。
匿名内部类不能是抽象的它必须要实现继承的类或者实现的接口的所有抽象方
一个内部类对象可以访问创建它的外部类对象的内容包括私有数据内部类不为同一包的其他类所见具有很好的封装性内部类有效实现了“多重继承”优化
局部内部类和匿名内部类访问局部变量的时候为什么变量必须要加上final呢
栈中当方法执行结束后非final的局部变量就被销毁。
而局部内部类对局部变
量的引用依然存在如果局部内部类要调用局部变量时就会出错。
加了final
可以确保局部内部类使用的变量与外层的局部变量区分开解决了这个问题。
重载Overload和重写Override的区别。
重载的方法能
方法的重载和重写都是实现多态的方式区别在于前者实现的是编译时的多态
重载发生在同一个类中方法名相同参数列表不同参数类型不同、个数不
同、顺序不同与方法返回值和访问修饰符无关即重载的方法不能根据返回
重写发生在父子类中方法名、参数列表必须相同返回值小于等于父类抛
出的异常小于等于父类访问修饰符大于等于父类里氏代换原则如果父类
它的作用是判断两个对象的地址是不是相等。
即判断两个对象是不是同
String中的equals方法是被重写过的因为object的equals方法是比较的对象的
内存地址而String的equals方法比较的是对象的值。
当创建String类型的对象时虚拟机会在常量池中查找有没有已经存在的值和要
创建的值相同的对象如果有就把它赋给当前引用。
如果没有就在常量池中重新创建
数。
这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()
在JDK的Object.java中这就意味着Java中的任何类都包含有hashCode()函数。
散列表存储的是键值对(key-value)它的特点是能根据“键”快速的检索出
没有相符的hashcodeHashSet会假设对象没有重复出现。
但是如果发现有相
同的话就会重新散列到其他位置。
摘自我的Java启蒙书《Head
个参数被传递到方法中时参数的值就是对该对象的引用。
对象的属性可以在被
首先回顾一下在程序设计语言中有关将参数传递给方法或函数的一些专业术
reference)表示方法接收的是调用者提供的变量地址。
一个方法可以
修改传递引用所对应的变量值而不能修改传递值调用所对应的变量值。
Java程序设计语言总是采用按值调用。
也就是说方法得到的是所有参数值的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kxuHrjo-1692506313325)(01-Java基础知识面试题2020最新版.assets/image-20201106190311218.png)]
通过上面例子我们已经知道了一个方法不能修改一个基本数据类型的参数而
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oIrslCIg-1692506313325)(01-Java基础知识面试题2020最新版.assets/image-20201106190416793.png)]
难事。
理由很简单方法得到的是对象引用的拷贝对象引用及其他的拷贝同时
很多程序设计语言特别是C和Pascal)提供了两种参数传递的方式值调
用和引用调用。
有些程序员甚至本书的作者认为Java程序设计语言对对象
采用的是引用调用实际上这种理解是不对的。
由于这种误解具有一定的普遍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5tEDeCP-1692506313326)(01-Java基础知识面试题2020最新版.assets/image-20201106190619059.png)]
对象引用。
swap方法的参数x和y被初始化为两个对象引用的拷贝这个方法交
Java程序设计语言对对象采用的不是引用调用实际上对象引用是按值传递的。
一个方法不能修改一个基本数据类型的参数即数值型或布尔型》一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。
值传递指的是在方法调用时传递的参数是按值的拷贝传递传递的是值的拷
引用传递指的是在方法调用时传递的参数是按引用进行传递其实传递的引
用的地址也就是变量所对应的内存空间的地址。
传递的是值的引用也就是说
java.lang这个是系统的基础类java.io这里面是所有输入输出有关的类比如文件操作等java.nio为了完善
包中性能而写的一个新包java.net这里面是与网络有关的类java.util这个是系统辅助类特别是集合类java.sql这个是数据库操作的类。
Io流共涉及40多个类这些类看上去很杂乱但实际上很有规则而且彼
同步阻塞I/O模式数据的读取写入必须阻塞在一个线程内等待其完成。
在活动连接数不是特别高小于单机1000的情况下这种模型是比较不错的可以让每一个连接专注于自己的
并且编程模型简单也不用过多考虑系统的过载、限流等问题。
线程池本身就是一个天然的漏斗可以缓冲一些系统处理不了的连接或请求。
但是当面对十万甚至百万级连接的时候传统的
N可以理解为Non-blocking不单纯是New。
它支持面向缓冲的基于通道的I/O操作方法。
两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。
阻塞模式使用就像传统中的支持一样比较简单但是性能和可靠性都不好非阻塞模式正好与之相反。
对于低负载、低并发的应用程序可以使用同步阻塞I/O来提升开发速率和更好的维护性对于高负载、高并发的网络应用应使用
是基于事件和回调机制实现的也就是应用操作之后会直接返回不会堵塞在那里当后台处理完成操作系统会通知相应的线程进行后续的操作。
AIO
JAVA反射机制是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法和属性这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
在我们平时的项目开发过程中基本上很少会直接使用到反射机制但这不能说明反射机制没有用实际上有很多设计、开发都与反射机制有关例如模块化的开发通过反射去调用对应的字节码动态代理设计模式也采用了反射机制还有我们日常使用的
举例①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序②Spring框架也用到很多反射机制
2)Java类里面解析xml或properties里面的内容得到对应实体类的字节码字符串以及相关的属性信息;
System.out.println(classobj1.getName());
System.out.println(classobj2.getName());
System.out.println(classobj3.getName());
网络编程的面试题可以查看我的这篇文章重学TCP/IP协议和三次握手四次挥手内容不仅包括TCP/IP协议和三次握手四次挥手的知识还包括计算机网络
体系结构HTTP协议get请求和post请求区别session和cookie的区别等欢迎大家阅读。
字符串常量池位于堆内存中专门用来存储字符串常量可以提高内存的使用率避免开辟多块空间存储相同的字符串在创建字符串时
会首先检查字符串常量池如果该字符串已经存在池中则返回它的引用如果不存在则实例化一个字符串放到池中并返回其引用。
double、char、boolean除了基本类型primitive
类型的数组只是使用的时候开发者不需要直接操作底层数组用更加简便的方式即可完成对字符串的使用。
对象对它进行任何操作其实都是创建一个新的对象再把引用指向该对象。
不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时可以保证数据的一致性。
常量池优化String
对象创建之后会在字符串常量池中进行缓存如果下次创建同样的对象时会直接返回缓存的引用。
final使用
简单来说就是String类利用了final修饰的char类型数组存储字符源码如下图所以
实际上原来String的内容是不变的只是str由原来指向Hello的内存地址转为指向Hello
World的内存地址而已也就是说多开辟了一块内存区域给Hello
String.class.getDeclaredField(value);89
valueFieldOfString.setAccessible(true);1112
进而改变通过获得的value引用改变数组的结构。
但是一般我们不会这么做这里只是简单提一下有这个东西。
String(“i”)一样吗不一样因为内存的分配方式不一样。
String
String(“xyz”);创建了几个字符串对象两个对象一个是静态区的xyz”一个是用new创建在堆上的对象。
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str4));
indexOf()返回指定字符的索引。
charAt()返回指定索引处的字符。
replace()字符串替换。
trim()去除字符串两端空白。
split()分割字符串返回一个分割后的字符串数组。
getBytes()返回字符串的
类型数组。
length()返回字符串长度。
toLowerCase()将字符串转成小写字母。
toUpperCase()将字符串转成大写字符。
substring()截取字符串。
equals()字符串比较。
String和StringBuffer、StringBuilder的区别是什么String
string对象是不可变的。
StringBuilder与StringBuffer都继承自
AbstractStringBuilder类在AbstractStringBuilder中也是使用字符数组保存字符串char[]
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类定义了一些字符串的基本操作如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁所以是线程安全的。
StringBuilder并没有对方法进行加同步锁所以是非线程安全的。
类型进行改变的时候都会生成一个新的String对象然后将指针指向新的String
对象。
StringBuffer每次都会对StringBuffer对象本身进行操
作而不是生成新的对象并改变对象引用。
相同情况下使用StirngBuilder
是一个近乎纯洁的面向对象编程语言但是为了编程的方便还是引入了基本数据类型但是为了能够将这些基本数据类型当成对象操作Java
booleancharbyteshortintlongfloatdouble
包装类型BooleanCharacterByteShortIntegerLongFloat
对于基本数据类型比较的是值。
如果整型字面量的值在-128到127之间那么自动装箱时不会new新的Integer
}者对调用的方法加了同步锁所以是线程安全的。
StringBuilder并没有对方法进行加同步锁所以是非线程安全的。
类型进行改变的时候都会生成一个新的String对象然后将指针指向新的String
对象。
StringBuffer每次都会对StringBuffer对象本身进行操
作而不是生成新的对象并改变对象引用。
相同情况下使用StirngBuilder
是一个近乎纯洁的面向对象编程语言但是为了编程的方便还是引入了基本数据类型但是为了能够将这些基本数据类型当成对象操作Java
booleancharbyteshortintlongfloatdouble
包装类型BooleanCharacterByteShortIntegerLongFloat
对于基本数据类型比较的是值。
如果整型字面量的值在-128到127之间那么自动装箱时不会new新的Integer
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback