2024年Java面试八股文5万字(持续更新ing)腾讯云开发者社区

继承是OOP的另一个核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。

多态是OOP的第三个核心概念,它允许不同类的对象对同一消息做出响应,但具体的行为会根据对象的实际类型而有所不同。

重载指的是在同一个类中可以定义多个同名的方法,但它们的参数列表(参数的类型和数量)必须不同。重载是编译时多态的一个体现。

重载的特点:

重写指的是在子类中提供一个与父类中具有完全相同方法签名的方法。重写是运行时多态的一个体现。

重写的特点:

理解重载和重写的区别对于正确使用Java的面向对象特性至关重要,它们在设计灵活且可扩展的类层次结构中发挥着重要作用。

单一职责原则(SRP)是面向对象设计中的重要原则,它要求一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项职责。这样做的好处是使类的设计更加清晰、可维护性更高,并且降低了对其他类的影响。

让我们以一个简单的示例来说明单一职责原则的应用。假设我们正在开发一个学生管理系统,其中有一个Student类负责表示学生的基本信息,如下所示:

publicclassStudent{privateStringname;privateintage;privateStringaddress;//构造方法、getter和setter方法等}这个Student类负责表示学生的基本信息,包括姓名、年龄和地址。根据单一职责原则,我们可以将其拆分为独立的类,每个类负责一个职责。例如,我们可以创建一个StudentInfo类来负责管理学生的基本信息,如下所示:

开放封闭原则(OCP)是软件工程中的一个基本原则,它要求软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。换句话说,我们应该通过添加新的代码来扩展系统的功能,而不是修改已有的代码。

让我们通过一个示例来说明开放封闭原则的应用。假设我们有一个订单处理系统,其中有一个Order类负责处理订单的创建和支付,如下所示:

publicclassOrder{privateStringorderId;privatedoubleamount;privatebooleanisPaid;//构造方法、getter和setter方法等publicvoidcreateOrder(){//创建订单的逻辑}publicvoidmakePayment(){//支付订单的逻辑}}现在,我们需要为订单增加一个新的功能:发送确认邮件给客户。根据开放封闭原则,我们不应该直接修改Order类的代码来实现这个新功能,而是应该通过扩展来实现。我们可以创建一个新的类OrderConfirmation,负责发送确认邮件的逻辑,如下所示:

publicclassOrderConfirmation{publicvoidsendConfirmationEmail(StringorderId){//发送确认邮件的逻辑}}通过这种方式,我们遵循了开放封闭原则,通过扩展OrderConfirmation类来添加发送确认邮件的功能,而不是修改Order类的代码。

里氏替换原则(LSP)是面向对象设计中的一个重要原则,它要求子类对象可以替换父类对象,而不会影响程序的正确性。换句话说,子类应该能够完全替代父类并且可以在不破坏程序正确性的情况下使用。

让我们通过一个示例来说明里氏替换原则的应用。假设我们有一个图形类的继承体系,其中有一个Rectangle类表示矩形,如下所示:

publicclassRectangle{protectedintwidth;protectedintheight;publicRectangle(intwidth,intheight){this.width=width;this.height=height;}publicintgetWidth(){returnwidth;}publicvoidsetWidth(intwidth){this.width=width;}publicintgetHeight(){returnheight;}publicvoidsetHeight(intheight){this.height=height;}publicintcalculateArea(){returnwidth*height;}}现在,我们希望在图形类的继承体系中添加一个新的类Square表示正方形。根据里氏替换原则,我们应该确保子类对象(正方形)可以替换父类对象(矩形)而不会引起错误。然而,如果我们直接创建一个Square类继承自Rectangle类,并且重写setWidth和setHeight方法,会导致违反里氏替换原则,因为正方形的宽度和高度应该是相等的。

为了遵循里氏替换原则,我们可以重新设计继承体系,例如创建一个Shape类作为父类,Rectangle和Square类分别继承Shape类,并且共享一个抽象方法calculateArea,如下所示:

publicabstractclassShape{publicabstractintcalculateArea();}publicclassRectangleextendsShape{protectedintwidth;protectedintheight;publicRectangle(intwidth,intheight){this.width=width;this.height=height;}//getter和setter方法publicintcalculateArea(){returnwidth*height;}}publicclassSquareextendsShape{protectedintside;publicSquare(intside){this.side=side;}//getter和setter方法publicintcalculateArea(){returnside*side;}}通过这种方式,我们保持了继承体系的一致性,并且确保子类对象(正方形)可以替代父类对象(矩形)而不会引起错误。

依赖倒置原则(DIP)是面向对象设计中的一个重要原则,它要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。换句话说,我们应该通过抽象来解耦高层模块和低层模块,并且依赖于抽象而不是具体实现。

让我们通过一个示例来说明依赖倒置原则的应用。假设我们正在开发一个订单处理系统,其中有一个OrderProcessor类负责处理订单,如下所示:

publicclassOrderProcessor{privateDatabasedatabase;publicOrderProcessor(){this.database=newDatabase();}publicvoidprocessOrder(Orderorder){//处理订单的逻辑database.saveOrder(order);}}在上述示例中,OrderProcessor类直接依赖于具体的Database类,导致高层模块(OrderProcessor)与低层模块(Database)之间存在紧耦合关系。

为了遵循依赖倒置原则,我们可以通过引入抽象来解耦高层模块和低层模块的依赖关系。我们可以创建一个抽象的Database接口,让OrderProcessor类依赖于该接口而不是具体实现类,如下所示:

publicinterfaceDatabase{voidsaveOrder(Orderorder);}publicclassOrderProcessor{privateDatabasedatabase;publicOrderProcessor(Databasedatabase){this.database=database;}publicvoidprocessOrder(Orderorder){//处理订单的逻辑database.saveOrder(order);}}publicclassMySQLDatabaseimplementsDatabase{publicvoidsaveOrder(Orderorder){//使用MySQL数据库保存订单的逻辑}}publicclassOracleDatabaseimplementsDatabase{publicvoidsaveOrder(Orderorder){//使用Oracle数据库保存订单的逻辑}}通过引入抽象的Database接口,我们将高层模块(OrderProcessor)与低层模块(具体的数据库实现类)解耦,并且依赖于抽象而不是具体实现。这样,我们可以轻松地切换不同的数据库实现,而不会对OrderProcessor类产生影响。

接口隔离原则(ISP)是面向对象设计中的一个重要原则,它要求客户端不应该依赖于它不需要的接口。换句话说,我们应该将大接口拆分为小接口,让客户端只依赖于它需要的接口。

让我们通过一个示例来说明接口隔离原则的应用。假设我们有一个图形编辑器,其中有一个Shape接口表示图形,如下所示:

publicinterfaceShape{voiddraw();voidresize();voidrotate();}现在,我们希望添加一个新的功能:填充图形的颜色。根据接口隔离原则,我们应该将大接口拆分为小接口,让客户端只依赖于它需要的接口。所以,我们可以将Shape接口拆分为Drawable接口和Resizable接口,如下所示:

publicinterfaceDrawable{voiddraw();}publicinterfaceResizable{voidresize();}publicinterfaceShapeextendsDrawable,Resizable{voidrotate();}通过这种方式,我们将大接口Shape拆分为小接口Drawable和Resizable,让客户端只需要依赖于它们需要的接口。这样,当我们需要添加填充颜色的功能时,只需要让图形类实现Drawable接口即可,而不需要修改已有的代码。

合成复用原则(CRP)是面向对象设计中的一个重要原则,它要求尽量使用对象组合而不是继承来达到代码复用的目的。换句话说,我们应该优先使用对象组合来构建系统,而不是过度依赖继承。

让我们通过一个示例来说明合成复用原则的应用。假设我们正在开发一个游戏,其中有一个Character类表示游戏中的角色,如下所示:

publicclassCharacter{privateWeaponweapon;publicCharacter(){this.weapon=newSword();}publicvoidattack(){weapon.use();}}在上述示例中,Character类通过继承和创建具体的武器类(Sword)来实现攻击功能。然而,这种使用继承的方式可能导致系统的扩展和维护困难。

为了遵循合成复用原则,我们可以使用对象组合来实现攻击功能。我们可以创建一个Weapon接口,让Character类组合一个实现了Weapon接口

在Java中,接口(Interface)和抽象类(AbstractClass)都是实现面向对象编程中的抽象概念的工具。它们都可以用来定义一组抽象的方法,这些方法可以由实现类(ImplementingClass)或子类(Subclass)来实现(提供具体的实现)。尽管它们有相似之处,但它们之间存在一些关键的区别:

在设计类和接口时,通常会根据以下准则来选择使用接口还是抽象类:

选择使用接口还是抽象类取决于具体的应用场景和设计需求。在Java8之后,由于接口可以包含具有方法体的默认方法,这使得接口在某些情况下可以作为更灵活的抽象类型来使用。

在Java中,泛化关系和实现关系是面向对象编程的两个基本概念,它们描述了类与类、类与接口之间的不同连接方式。

泛化关系通常指的是继承关系,即一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。这种关系建立了一个“是一个”(is-a)的关系。

泛化关系的特点:

实现关系指的是一个类对一个或多个接口的实现。这种关系建立了一个“可以是”(can-be-a)或“像一个”(like-a)的关系。

实现关系的特点:

在实际应用中,泛化关系和实现关系经常结合使用,以构建灵活和可扩展的系统。选择使用泛化关系还是实现关系取决于设计的具体需求,以及如何平衡代码的抽象性和具体性。

Java是一种静态类型语言,这意味着在编译时就需要确定所有变量的类型。Java提供了两种基本的数据类型:基本类型和引用类型。

基本类型是Java中最简单的数据类型,它们直接对应于计算机的最小数据单位。Java有八种基本类型:

引用类型是对象的引用,它们指向内存中的对象。在Java中,除了基本类型之外的都是引用类型,包括类、接口、数组等。

整数类型用于表示整数值,它们在内存中的大小是固定的。例如,int类型占用4个字节(32位),可以表示从-2^31到2^31-1的整数。

intnumber=10;//正确的整数赋值intlargeNumber=2147483647;//最大值赋值//inttooLargeNumber=2147483648;//超出范围的赋值,会编译错误浮点类型浮点类型用于表示有小数点的数值。float类型占用4个字节,而double类型占用8个字节,后者提供更高的精度。

floatpi=3.14f;//float类型的赋值doublepiDouble=3.141592653589793;//double类型的赋值字符类型char类型用于表示单个字符,它占用2个字节。字符类型使用单引号表示。

booleanisTrue=true;//布尔类型的赋值引用类型的奥秘引用类型是Java中更高级的概念,它们指向内存中的对象。在Java中,所有的对象都是通过引用来操作的。

Stringname="Java";//String是一个引用类型类型转换在Java中,类型转换是将一种数据类型转换为另一种数据类型的过程。这可以是自动的(隐式)或显式的(强制)。

intnumber=10;longlargeNumber=number;//隐式类型转换类型提升在某些情况下,当操作涉及不同类型的数值时,较小的数据类型会自动转换为较大的数据类型,这个过程称为类型提升。

intnumber=10;doublepi=3.14;doubleresult=number/pi;//结果是double类型数据类型的应用在实际编程中,选择合适的数据类型对于性能和内存管理至关重要。例如,如果你知道一个数值不会超过255,那么使用byte类型会比使用int更节省内存。

bytesmallNumber=10;//使用byte类型在Java中,基本类型(primitivetypes)和包装类型(wrappertypes)之间的转换是常见的操作。基本类型是Java的原始数据类型,而包装类型是基本类型的封装,它们是java.lang包中的类。

从Java5开始,Java引入了自动装箱和拆箱的特性,使得在基本类型和对应的包装类型之间可以自动转换。

基本类型转换为对应的包装类型。

IntegerintegerObject=123;//int到Integer的自动装箱自动拆箱(Unboxing):包装类型转换为对应的基本类型。

intintValue=integerObject;//Integer到int的自动拆箱显式装箱(ExplicitBoxing)和拆箱(ExplicitUnboxing):虽然自动装箱和拆箱非常方便,但有时候需要显式地进行类型转换。

使用包装类型的静态方法valueOf()进行装箱。

IntegerintegerObject=Integer.valueOf(123);//显式装箱显式拆箱(ExplicitUnboxing):使用包装类型的xxxValue方法进行拆箱。

intintValue=integerObject.intValue();//显式拆箱注意事项:示例:代码语言:java复制publicclassBoxingUnboxingExample{publicstaticvoidmain(String[]args){//自动装箱intnum=100;Integerwrapper=num;//自动装箱//自动拆箱intnumber=wrapper;//自动拆箱//显式装箱Integerwrapper2=Integer.valueOf(100);//显式拆箱intnumber2=wrapper2.intValue();//使用equals()方法比较包装类型的值Integera=10;Integerb=10;Integerc=200;booleanareEqual=(a.intValue()==b.intValue());//truebooleanareNotEqual=(a.equals(c));//false}}理解基本类型与包装类型之间的转换对于编写正确和高效的Java程序非常重要。

privatestaticclassIntegerCache{staticfinalintlow=-128;staticfinalinthigh;staticfinalIntegercache[];static{//highvaluemaybeconfiguredbypropertyinth=127;StringintegerCacheHighPropValue=VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if(integerCacheHighPropValue!=null){try{inti=parseInt(integerCacheHighPropValue);i=Math.max(i,127);//MaximumarraysizeisInteger.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE-(-low)-1);}catch(NumberFormatExceptionnfe){//Ifthepropertycannotbeparsedintoanint,ignoreit.}}high=h;cache=newInteger[(high-low)+1];intj=low;for(intk=0;k=127;}privateIntegerCache(){}}@HotSpotIntrinsicCandidatepublicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}mustbeinterned:被拘留的

/***Cachetosupporttheobjectidentitysemanticsofautoboxingforvaluesbetween*-128and127(inclusive)asrequiredbyJLS.**Thecacheisinitializedonfirstusage.Thesizeofthecache*maybecontrolledbythe{@code-XX:AutoBoxCacheMax=}option.*DuringVMinitialization,java.lang.Integer.IntegerCache.highproperty*maybesetandsavedintheprivatesystempropertiesinthe*jdk.internal.misc.VMclass.*//***缓存以支持之间的值的自动装箱的对象标识语义*-128和127(包括在内),按照JLS的要求。**缓存在首次使用时初始化。缓存的大小*可以由{@code-XX:AutoBoxCacheMax=}选项控制。*在VM初始化期间,java.lang.Integer。IntegerCache.high属性*可以设置并保存在中的专用系统属性中*jdk.internal.misc。VM类。*/在Java编程中,对Integer对象的创建和使用是常见的操作。然而,很多开发者可能没有意识到,通过不同的方法创建Integer对象,其背后的实现机制和性能影响可能截然不同。

Java为Integer类提供了一个缓存池,在Integer.valueOf(inti)方法的实现中,有一个内部的缓存机制。根据Java的自动装箱规范,Integer.valueOf()方法会缓存从-128到127范围内的Integer对象。

使用Integer.valueOf()而不是直接使用new操作符可以减少内存使用和垃圾收集的开销,特别是当处理大量Integer对象时,尤其是它们的值集中在上述的缓存范围内。

publicclassIntegerCachingDemo{publicstaticvoidmain(String[]args){intnumber=127;Integeri1=newInteger(number);Integeri2=Integer.valueOf(number);System.out.println("i1==i2"+(i1==i2));//输出true,因为valueOf返回了缓存的对象intanotherNumber=128;Integeri3=newInteger(anotherNumber);Integeri4=Integer.valueOf(anotherNumber);System.out.println("i3==i4"+(i3==i4));//输出false,因为valueOf没有缓存这个值,创建了新对象}}案例2:循环创建大量Integer对象代码语言:java复制publicclassIntegerLoopCreation{publicstaticvoidmain(String[]args){Listlist=newArrayList<>();for(inti=0;i<200;i++){//使用valueOf()创建缓存范围内的Integer对象list.add(Integer.valueOf(i));//使用new创建Integer对象,即使在缓存范围内也会创建新对象list.add(newInteger(i));}}}在Java中,基本类型对应的缓冲池主要指的是Integer类的缓存池,因为其他的基本类型(如int,long,double等)并不具有类似的缓存机制。这个缓存池是由Java虚拟机(JVM)自动管理的,旨在提高性能,特别是在创建大量相同整数值的Integer对象时。

缓存池主要用于以下场景:

publicclassIntegerCacheDemo{publicstaticvoidmain(String[]args){Integerint1=123;Integerint2=123;System.out.println(int1==int2);//输出false,因为123不在缓存池范围内Integerint3=Integer.valueOf(123);Integerint4=Integer.valueOf(123);System.out.println(int3==int4);//输出true,因为valueOf使用了缓存池}}在这个示例中,直接使用newInteger(123)创建的两个对象int1和int2不相等,因为它们是两个不同的实例。而使用Integer.valueOf(123)创建的两个对象int3和int4相等,因为它们引用了缓存池中的同一个实例。

通过理解基本类型对应的缓冲池,开发者可以更好地利用Java的自动装箱特性,编写出更高效、更节省资源的代码。

字符串是常量;它们的值在它们之后不能更改

*创建。字符串缓冲区支持可变字符串。

*因为String对象是不可变的,所以它们可以共享

这些基本数据类型的变量是线程安全的,因为它们的值在赋值后不能被更改。但是,如果你有一个指向这些基本数据类型数组的引用,并且多个线程可以访问这个数组,那么这个数组就不是线程安全的,因为不同的线程可以独立修改数组的不同元素。

此外,虽然基本数据类型本身是线程安全的,但是涉及到这些类型的操作(如计算和更新)在多线程环境下可能会导致线程安全问题,特别是当多个线程尝试同时修改同一变量时。为了确保线程安全,可能需要使用同步代码块、锁、原子变量(如AtomicInteger)或其他并发控制机制。

publicclassThreadSafeExample{privateintcounter=0;publicvoidincrement(){counter++;//非原子操作,可能在多线程环境下导致问题}}//正确的线程安全方式使用原子类publicclassAtomicExample{privateAtomicIntegercounter=newAtomicInteger(0);publicvoidincrement(){counter.incrementAndGet();//原子操作,线程安全}}在第一个示例中,尽管int类型本身是线程安全的,但是counter++操作不是原子的,这意味着在多线程环境下可能会遇到竞争条件。在第二个示例中,使用AtomicInteger确保了incrementAndGet()操作的原子性,从而避免了线程安全问题。

总结来说,基本数据类型本身是不可变的,因此是线程安全的,但在多线程环境中使用这些类型的变量时,仍然需要注意同步和并发控制。

@Override@HotSpotIntrinsicCandidatepublicsynchronizedStringBufferappend(Stringstr){toStringCache=null;super.append(str);returnthis;}在Java中,String、StringBuffer和StringBuilder是三种不同的类,它们在处理字符串时有不同的用途和性能特点。以下是它们的主要区别:

Stringstr1="Hello";Stringstr2=str1+"World";//创建了一个新的String对象StringBuffersb=newStringBuffer("Hello");sb.append("World");//在原有对象上修改StringBuildersbd=newStringBuilder("Hello");sbd.append("World");//在原有对象上修改在这个例子中,使用String进行字符串连接时,每次连接操作都会产生一个新的String对象。而StringBuffer和StringBuilder则允许在原有对象上进行修改,避免了创建多个对象的开销。

选择使用String、StringBuffer还是StringBuilder取决于具体的应用场景:

字符串常量池是Java虚拟机(JVM)用来存储字符串常量和通过String.intern()方法产生的字符串的内存区域。其主要目的是为了节省内存空间,避免相同的字符串字面量被多次创建。

String.intern()方法的作用是将一个字符串对象与字符串常量池中的字符串对象进行比较。如果常量池中已经包含了该字符串,则返回常量池中的字符串对象的引用;如果没有,则将该字符串对象添加到常量池中,并返回这个新字符串对象的引用。

publicnativeStringintern()intern()方法是String类的成员方法,它是一个本地方法,用native关键字标识,这意味着其底层实现是用C/C++或其他非Java语言编写的。

Strings1="hello";Strings2=newString("hello");Strings3=s2.intern();System.out.println(s1==s2);//输出falseSystem.out.println(s1==s3);//输出true,因为s3调用intern()后,引用了常量池中的"hello"在这个示例中,s1直接通过字符串字面量创建,自动存储在字符串常量池中。s2通过newString()创建,不会自动存储在常量池中。s3通过调用s2.intern()后,引用了常量池中的字符串对象。

String.intern()**方法是一个非常有用的特性,可以帮助优化字符串的使用。然而,开发者应当谨慎使用,避免滥用导致内存问题。在某些特定场景下,如处理大量相似字符串时,合理使用**intern()**可以带来性能上的提升。**

在不同的JVM实现中,字符串常量池的存储位置可能有所不同,但以OracleHotSpotJVM为例,其发展过程中经历了几次变化:

Stringstr1="Hello";Stringstr2="Hello";Stringstr3=newString("Hello");在这个例子中:

HotSpot是Java虚拟机(JVM)的一种流行实现,广泛用于运行Java应用程序。它由SunMicrosystems(现在是OracleCorporation的一部分)开发,并作为OracleJDK和OpenJDK的一部分进行分发。HotSpotVM以其性能优化技术而闻名,包括即时编译(JIT)编译器、垃圾回收和逃逸分析。

HotSpotVM使用多种先进技术为Java应用程序提供高性能,包括:

HotSpotVM自1997年推出以来一直是Java开发者的首选,并且随着Java语言的发展不断进化和改进。

Java语言之所以能够在性能要求极高的应用场景中占据一席之地,JVM的即时编译(JIT)编译器、垃圾回收机制和逃逸分析技术功不可没。本文将深入探讨这三项技术,揭示它们是如何在幕后优化Java程序性能的。

Java代码首先被编译为字节码,再由JVM执行。JIT编译器的作用是在运行时将热点代码(经常执行的代码)编译为本地机器码,从而提高执行效率。

Java的垃圾回收机制负责自动管理内存,回收不再使用的对象,避免了内存泄漏和野指针问题。

逃逸分析是JVM的一项优化技术,用于确定对象的作用域是否逃逸到方法外部。

以下是一个简单的Java程序示例,展示了一个热点方法,该方法可能会被JIT编译器优化。

publicclassHotspotExample{publicstaticvoidmain(String[]args){intresult=0;for(inti=0;i<10000000;i++){result+=i;}System.out.println(result);}}在这个例子中,由于循环执行了足够多次,JIT编译器很可能会将循环体编译为优化的机器码。

JIT编译器、垃圾回收和逃逸分析是Java虚拟机优化程序性能的三大法宝。理解它们的原理和工作方式,对于编写高效的Java程序至关重要。希望本文能够为你打开Java性能优化的大门。

HTTP状态码415表示“UnsupportedMediaType”,即服务器无法处理请求附带的媒体格式。这个错误通常发生在客户端发送的请求中包含了一个服务器无法识别或不支持的Content-Type头部。以下是一些可能导致HTTP415错误的原因:

为了解决这个问题,你可以采取以下步骤:

在Java编程中,参数传递是方法调用的核心机制,它决定了如何将数据传递给方法以及方法如何接收和处理这些数据。深入理解参数传递,对于编写高效、安全和可维护的代码至关重要。本文将带你走进Java参数传递的世界,探索其背后的机制和最佳实践。

在Java中,方法的参数传递主要有两种形式:值传递和引用传递。

Java5引入了自动装箱和拆箱特性,这在参数传递时尤其有用。

publicclassAutoboxingExample{publicstaticvoidmain(String[]args){Integerinteger=100;increment(integer);System.out.println(integer);//输出101}staticvoidincrement(Integern){n=n+1;}}参数的评估时机参数的评估是在方法调用之前完成的,这意味着参数表达式在方法调用之前就被求值了。

publicclassArgumentEvaluationExample{publicstaticvoidmain(String[]args){intcounter=0;performActions(incrementCounter(),counter);}staticintincrementCounter(){return++counter;}staticvoidperformActions(inta,intb){//...}}在这个例子中,counter在方法调用之前被增加了两次,因为参数评估的顺序是未定义的。

Java允许方法接受可变数量的参数,这在实践中非常有用。

publicclassVarargsExample{publicstaticvoidprintArgs(Object...args){for(Objectobj:args){System.out.println(obj);}}publicstaticvoidmain(String[]args){printArgs("Hello",123,45.67);}}方法重载与参数传递方法重载时,参数的类型和数量是区分不同方法的关键。

publicclassMethodOverloadingExample{intadd(inta,intb){returna+b;}intadd(inta,intb,intc){returna+b+c;}publicstaticvoidmain(String[]args){//调用不同的add方法}}参数传递是Java程序设计中的基础概念,它直接关系到程序的性能和行为。理解值传递和引用传递的区别,掌握自动装箱、拆箱、可变参数和方法重载等高级特性,对于成为一名优秀的Java开发者至关重要。

在Java编程语言中,浮点数的运用无处不在,无论是在科学计算、图形渲染还是金融分析等领域,float和double类型都扮演着重要角色。然而,两者在精度和使用场景上存在差异,理解这些差异对于编写高效且准确的程序至关重要。本文将深入探讨float与double的精度特性、使用场景以及最佳实践。

浮点数是基于IEEE754标准的二进制浮点数算术标准,它定义了浮点数的存储方式和操作规则。

由于double比float有更多的尾数位,因此double的精度更高,能表示更大的数值范围,也能更精确地表示小数。

publicclassFloatVsDouble{publicstaticvoidmain(String[]args){floatf=1.123456789f;doubled=1.123456789d;System.out.println("Float:"+f);//输出Float:1.1234568System.out.println("Double:"+d);//输出Double:1.123456789}}在这个示例中,由于float的精度限制,小数点后的某些数字被舍入了。

在某些旧的硬件平台上,float运算可能比double运算更快,因为float的操作更简单。但在现代处理器上,两者的性能差异不大。

封装是面向对象编程的四大原则之一,它有以下几个关键点:

尽管公有字段可以简化访问,但它们也带来了一系列的问题:

为了保持封装性,我们应该遵循以下最佳实践:

虽然公有字段在某些情况下可能看起来很方便,但从长远来看,它们破坏了封装性,增加了代码的耦合性和维护难度。因此,作为高级Java架构师,我们应该坚持使用私有字段,并通过公共访问器来提供对这些字段的访问。这样不仅可以保持代码的整洁和可维护性,还可以为未来可能的变更提供灵活性。记住,封装是面向对象编程的基石,我们应该始终致力于维护和强化这一原则。

在Java的面向对象世界里,抽象类和接口是构建灵活、可扩展架构的基石。它们为实现代码复用、解耦和多态性提供了强大的支持。然而,抽象类和接口在概念和用法上有着明显的区别,同时也存在一定的联系。本文将深入探讨抽象类与接口之间的差异、联系以及如何根据项目需求做出恰当选择。

抽象类是一种不能被直接实例化的类。它通常作为其他类的基类存在,提供一些共同的属性和方法实现,同时保留一些抽象方法供子类实现。

publicabstractclassAnimal{publicvoideat(){System.out.println("Eating");}publicabstractvoidsound();}classDogextendsAnimal{publicvoidsound(){System.out.println("Woof");}}接口:定义行为的契约接口是一种完全抽象的概念,它不提供任何实现,只定义了一组方法的签名。

publicinterfaceUsbDevice{voidconnect();voiddisconnect();defaultvoidstatus(){System.out.println("DevicestatusisOK");}}classSmartphoneimplementsUsbDevice{publicvoidconnect(){System.out.println("ConnectingtoUSB");}publicvoiddisconnect(){System.out.println("DisconnectingfromUSB");}}抽象类与接口的区别抽象类与接口的联系设计选择的考量抽象类和接口是Java面向对象设计中不可或缺的部分。它们各自有着独特的用途和优势,理解它们的区别和联系对于设计灵活、可维护的系统至关重要。

在子类中,如果需要引用父类的成员(包括方法、变量和构造器),可以使用super关键字。

classParent{intvalue=10;}classChildextendsParent{voiddisplay(){System.out.println(super.value);//输出父类的变量值}}1.2引用父类的方法代码语言:java复制classParent{voiddisplay(){System.out.println("Parentdisplay()");}}classChildextendsParent{voiddisplay(){super.display();//调用父类的方法System.out.println("Childdisplay()");}}2.调用父类的构造器在子类的构造器中,可以使用super关键字调用父类的构造器。

classParent{Parent(){System.out.println("ParentConstructor");}}classChildextendsParent{Child(){super();//调用父类的构造器System.out.println("ChildConstructor");}}3.调用父类的重写方法在子类中重写父类的方法时,如果需要在子类的方法中调用父类的实现,可以使用super关键字。

classParent{voiddisplay(){System.out.println("Parentdisplay()");}}classChildextendsParent{voiddisplay(){super.display();//调用父类的display()方法System.out.println("Childdisplay()");}}4.解决变量隐藏问题当子类的成员变量与父类的成员变量同名时,子类的变量会隐藏父类的变量。此时,如果需要访问父类的同名变量,可以使用super关键字。

classParent{intvalue=10;}classChildextendsParent{intvalue=20;voiddisplay(){System.out.println(super.value);//输出父类的value值}}5.super与this的区别super关键字用于引用父类的成员,而this关键字用于引用当前对象的成员。在构造器中,this用于调用当前类的其他构造器,而super用于调用父类的构造器。

classParent{Parent(){System.out.println("ParentConstructor");}}classChildextendsParent{Child(){this(10);//调用当前类的另一个构造器System.out.println("ChildConstructor");}Child(intvalue){super();//调用父类的构造器System.out.println("ChildConstructorwithvalue:"+value);}}6.super的使用场景super关键字在Java中是一个非常重要的概念,它提供了对父类成员的直接访问。正确使用super关键字可以帮助我们编写出更加清晰、可维护的代码。作为高级Java架构师,我们应该深入理解super的使用场景和最佳实践,以便在实际开发中更加有效地利用这一特性。

在Java中,super关键字在多态的上下文中通常用于调用父类的方法实现,即使子类重写了这些方法。这在多态的情况下特别有用,因为子类可以提供自己的方法实现,而super关键字允许子类在需要时调用父类的方法。

在Java中,多态是通过继承和方法重写实现的。当一个子类继承自一个父类时,它可以重写父类的方法,提供自己的实现。然而,在某些情况下,子类可能需要在自己的方法实现中调用父类的方法,以保留或增强父类的行为。

在子类的方法中,可以通过super关键字调用父类的方法。这通常在子类需要在自己的实现中使用父类方法的行为时使用。

classAnimal{publicvoidmakeSound(){System.out.println("Somesound");}}classDogextendsAnimal{@OverridepublicvoidmakeSound(){super.makeSound();//调用父类的makeSound方法System.out.println("Bark");}}publicclassMain{publicstaticvoidmain(String[]args){DogmyDog=newDog();myDog.makeSound();//输出:SomesoundBark}}在上面的例子中,Dog类重写了Animal类的makeSound方法。在Dog类的makeSound方法中,首先调用了super.makeSound()来执行父类的makeSound方法,然后添加了自己的行为。

在构造器中,super关键字用于调用父类的构造器。这是因为在创建子类对象时,必须先初始化父类的部分。如果子类的构造器没有显式地调用父类的构造器,Java编译器会自动插入对无参构造器的调用。如果父类没有无参构造器,子类必须在构造器中使用super来调用父类的构造器。

classAnimal{publicAnimal(){System.out.println("Animaliscreated");}}classDogextendsAnimal{publicDog(){super();//调用父类的构造器System.out.println("Dogiscreated");}}publicclassMain{publicstaticvoidmain(String[]args){DogmyDog=newDog();//输出:Animaliscreated//输出:Dogiscreated}}在这个例子中,Dog类的构造器使用super()调用了Animal类的构造器。

super关键字在多态中用于调用父类的方法和构造器。它允许子类在自己的方法实现中保留或增强父类的行为。正确使用super是实现多态和维护代码清晰性的重要部分。在设计类和方法时,应该考虑到何时使用super来调用父类的实现,以确保代码的灵活性和可维护性。

在Java的世界里,有两个非常相似却又截然不同的概念——重写(Override)和重载(Overload)。它们就像是双胞胎兄弟,名字相近,但性格迥异。今天,就让我们一起揭开它们的神秘面纱,看看它们是如何在Java的魔法世界中施展它们的魔法的。

重写,也被称为方法覆盖,是面向对象编程中一个非常重要的概念。它允许子类提供一个特定于自己的实现,来替换父类中的方法。这就像是一场魔法对决,子类通过重写父类的方法,展示出自己独特的魔法。

classAnimal{publicvoidmakeSound(){System.out.println("Somesound");}}classDogextendsAnimal{@OverridepublicvoidmakeSound(){System.out.println("Bark");}}publicclassMain{publicstaticvoidmain(String[]args){DogmyDog=newDog();myDog.makeSound();//输出:Bark}}在这个例子中,Dog类重写了Animal类的makeSound方法,当创建Dog对象并调用makeSound方法时,会执行Dog类中的实现,而不是Animal类中的实现。

重载,又称为方法重载,是指在同一个类中可以有多个同名方法,只要它们的参数列表不同即可。这就像是一场盛宴,同一个菜肴可以根据不同的食材和烹饪方法,呈现出不同的风味。

classCalculator{publicintadd(inta,intb){returna+b;}publicdoubleadd(doublea,doubleb){returna+b;}publicintadd(inta,intb,intc){returna+b+c;}}publicclassMain{publicstaticvoidmain(String[]args){Calculatorcalc=newCalculator();System.out.println(calc.add(1,2));//输出:3System.out.println(calc.add(1.5,2.5));//输出:4.0System.out.println(calc.add(1,2,3));//输出:6}}在这个例子中,Calculator类有三个add方法,它们的参数列表不同,因此可以共存。当调用add方法时,编译器会根据传入的参数类型和数量来决定调用哪个方法。

虽然重写和重载都涉及到方法的名称,但它们的本质是不同的:

当然可以。重写(Override)和重载(Overload)是Java中两个非常重要的概念,它们在不同的场景下有不同的应用。下面我将通过具体的例子来说明它们的使用场景。

重写通常用于实现多态性,即子类可以提供特定于自己的实现来替换父类中的方法。这在继承关系中非常常见,尤其是在设计框架和库时。

场景一:框架设计

假设我们正在设计一个图形用户界面(GUI)框架,其中有一个Button类,它有一个draw方法用于绘制按钮。现在我们想要创建一个ImageButton类,它继承自Button类,并重写draw方法来绘制一个带有图片的按钮。

classButton{publicvoiddraw(){System.out.println("Drawingasimplebutton.");}}classImageButtonextendsButton{@Overridepublicvoiddraw(){System.out.println("Drawinganimagebuttonwithanimage.");}}publicclassMain{publicstaticvoidmain(String[]args){Buttonbutton=newButton();ImageButtonimageButton=newImageButton();button.draw();//输出:Drawingasimplebutton.imageButton.draw();//输出:Drawinganimagebuttonwithanimage.}}在这个例子中,ImageButton类重写了Button类的draw方法,以提供特定的实现。

场景二:库扩展

在使用第三方库时,我们可能需要扩展库中的类的功能。重写允许我们这样做,而不会破坏库的现有功能。

classLibraryClass{publicvoidperformAction(){System.out.println("Performingadefaultaction.");}}classExtendedClassextendsLibraryClass{@OverridepublicvoidperformAction(){System.out.println("Performinganextendedaction.");}}publicclassMain{publicstaticvoidmain(String[]args){LibraryClasslibraryInstance=newLibraryClass();ExtendedClassextendedInstance=newExtendedClass();libraryInstance.performAction();//输出:Performingadefaultaction.extendedInstance.performAction();//输出:Performinganextendedaction.}}在这个例子中,ExtendedClass重写了LibraryClass的performAction方法,以提供额外的功能。

重载允许我们在同一个类中创建多个同名方法,只要它们的参数列表不同。这在提供灵活性和方便性方面非常有用。

场景一:方法的多种用途

假设我们有一个calculate方法,它可以根据不同的参数执行不同的计算。

classCalculator{publicintcalculate(inta,intb){returna+b;}publicdoublecalculate(doublea,doubleb){returna+b;}publicintcalculate(inta,intb,intc){returna+b+c;}}publicclassMain{publicstaticvoidmain(String[]args){Calculatorcalculator=newCalculator();System.out.println(calculator.calculate(1,2));//输出:3System.out.println(calculator.calculate(1.5,2.5));//输出:4.0System.out.println(calculator.calculate(1,2,3));//输出:6}}在这个例子中,calculate方法被重载了三次,以适应不同的参数类型和数量。

场景二:构造器重载

构造器重载允许我们根据不同的参数列表创建对象。

classPerson{privateStringname;privateintage;publicPerson(Stringname){this.name=name;this.age=0;}publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassMain{publicstaticvoidmain(String[]args){Personperson1=newPerson("Alice");Personperson2=newPerson("Bob",30);}}在这个例子中,Person类有两个构造器,一个接受一个参数,另一个接受两个参数。这允许我们根据需要创建Person对象。

在Java中,@HotSpotIntrinsicCandidate注解是JDK源码中使用的一个特殊注解,它与HotSpot虚拟机的内部优化机制有关。这个注解的作用是指示HotSpot虚拟机中的某些方法可能会被优化为特定于CPU的指令,从而提高性能。

具体来说,当一个方法被标记为@HotSpotIntrinsicCandidate时,它表明该方法可能会有一个高效的实现,这个实现是基于特定CPU指令集的。在运行时,HotSpot虚拟机会尝试使用这些高效的实现来替换标准的Java方法调用,以减少方法调用的开销并提高执行效率。

例如,String类中的indexOf方法就是一个被标记为@HotSpotIntrinsicCandidate的方法。当调用String.indexOf方法时,如果传入的字符串只包含Latin1字符,HotSpot虚拟机可能会使用一个特定于CPU的实现来执行这个方法,而不是使用Java字节码解释器来执行。

需要注意的是,虽然方法被标记为@HotSpotIntrinsicCandidate,但这并不意味着在所有情况下都会使用这种优化。实际上,这种优化是否发生取决于多种因素,包括JVM的版本、运行时的配置以及具体的硬件平台等。此外,即使方法被标记为@HotSpotIntrinsicCandidate,在解释器级别(Interpreter)也不会有这种优化。

在Java中,标记为@IntrinsicCandidate的方法通常是指那些在HotSpot虚拟机中可能被优化为特定于CPU的指令的方法。这些方法通常是一些非常基础且频繁被调用的操作,如基本类型的算术运算、数组操作等。通过将这些方法标记为@IntrinsicCandidate,HotSpot虚拟机可以在运行时根据具体的硬件平台和JVM配置,选择是否使用特定的优化实现来替换标准的Java方法调用。

以下是一些常见的被标记为@IntrinsicCandidate的方法:

需要注意的是,虽然方法被标记为@IntrinsicCandidate,但这并不意味着在所有情况下都会使用这种优化。实际上,这种优化是否发生取决于多种因素,包括JVM的版本、运行时的配置以及具体的硬件平台等。此外,即使方法被标记为@IntrinsicCandidate,在解释器级别(Interpreter)也不会有这种优化。

在Java中,查看哪些方法被优化通常需要使用特定的工具和方法。由于Java的即时编译器(JIT)在运行时对热点代码进行优化,因此在运行时查看哪些方法被优化是比较困难的。不过,有一些工具和方法可以帮助我们了解哪些方法可能被优化了:

由于这些工具和方法可能会随着JVM版本的更新而发生变化,建议查阅你所使用的JVM版本的官方文档,以获取最新的信息和使用指南。

在Java中,Object类位于类继承层次结构的顶端,所有的类默认继承java.lang.Object类。Object类提供了一些通用的方法,这些方法为所有对象提供了基本的操作。以下是Object类的一些主要方法:

这些方法被提供的原因如下:

publicclassExampleObject{publicstaticvoidmain(String[]args){Objectobj=newObject();System.out.println("Objecthashcode:"+obj.hashCode());System.out.println("Objectclass:"+obj.getClass().getName());System.out.println("Objectasstring:"+obj.toString());}}在这个示例中,我们创建了一个Object实例,并调用了hashCode()、getClass()和toString()方法。

理解Object类提供的这些方法对于Java开发者来说非常重要,因为它们是Java语言的基石,并且在编写和维护代码时经常会用到。通过这些方法,Java确保了不同类的对象能够进行基本的交互和操作。

在Java编程中,比较两个对象是否相等是一个常见的任务。开发者经常使用==运算符和equals()方法来进行比较,但它们在功能和用途上有着本质的区别。本文将深入探讨equals()与==的区别、联系以及在不同场景下的应用。

==运算符用于比较两个对象的引用是否相同,即它们是否指向内存中的同一个对象。

Strings1=newString("hello");Strings2=s1;System.out.println(s1==s2);//输出true,因为s1和s2指向同一个对象equals()方法:逻辑相等的比较equals()方法用于比较两个对象的逻辑相等性,即比较它们的属性值是否相等。默认情况下,Object类的equals()方法比较对象的引用,但通常需要被重写以实现具体的比较逻辑。

Strings3=newString("hello");Strings4=newString("hello");System.out.println(s3.equals(s4));//输出true,因为内容相等equals()与==的区别比较内容:equals()比较对象的逻辑相等性,==比较对象的引用是否相同。

以下是一个正确重写equals()和hashCode()的示例。

在Java编程中,对象的拷贝是一个常见的操作,尤其是当需要复制一个对象以保持状态的独立性时。拷贝分为深拷贝和浅拷贝,它们在对象的复制行为上有着本质的不同。本文将深入探讨深拷贝与浅拷贝的区别、联系以及如何在Java中实现它们。

浅拷贝只复制对象本身,而不复制对象引用的对象。如果对象的属性包含对其他对象的引用,那么浅拷贝会共享这些引用。

publicclassShallowCopyExample{staticclassPerson{privateStringname;privateAddressaddress;//引用类型publicPerson(Stringname,Addressaddress){this.name=name;this.address=address;}//Gettersandsetters}staticclassAddress{privateStringcity;publicAddress(Stringcity){this.city=city;}//Gettersandsetters}publicstaticvoidmain(String[]args){Addressaddress=newAddress("NewYork");Personp1=newPerson("John",address);Personp2=newPerson("Jane",p1.address);//浅拷贝,共享address引用p2.address.city="LosAngeles";System.out.println(p1.address.city);//输出"LosAngeles",p1和p2的address引用了同一个对象}}深拷贝:彻底的复制深拷贝会递归复制对象以及对象引用的所有对象,直到所有引用的对象都复制完毕。深拷贝创建了对象的一个完全独立副本。

publicclassDeepCopyExample{//Person和Address类定义与上文相同staticclassDeepCopyPersonextendsPerson{publicDeepCopyPerson(Personoriginal){super(original.name);//复制基本类型this.address=newAddress(original.address.city);//复制引用类型}}publicstaticvoidmain(String[]args){Addressaddress=newAddress("NewYork");Personp1=newPerson("John",address);Personp2=newDeepCopyPerson(p1);//深拷贝p2.address.city="LosAngeles";System.out.println(p1.address.city);//输出"NewYork",p1和p2的address是不同的对象}}深拷贝与浅拷贝的区别实现深拷贝的注意事项在Java中,深拷贝与浅拷贝各有其适用场景。选择使用哪种拷贝方式取决于对象的结构和程序的需求。理解它们的区别对于编写正确的、高效的Java程序至关重要。

THE END
1.互联网Java面试八股文汇总(2024最新整理,持续更新)最近也是一直有粉丝朋友私信我说,2025快到了,LZ 有没有一份内容全面,题目高频的面试题库,最近面试老挂,需要系统的梳理一下!我的内心:这我上哪儿整去啊!没办法好歹也是坐拥 5W 粉丝的小博主,粉丝就是我的上帝,于是各大渠道耗时114天为大家整理了一份 Java 全栈面试进阶宝典!希望对大家有所帮助! https://maimai.cn/article/detail?fid=1855247847&efid=VBsObuTWQYi3X1ciewGs9g
2.一周通过前端面试,2024最新前端八股文题库分享现在各行各业的大环境其实都一样,没有那么的好,但是计算机行业总体要比任何一行的环境要好一些,虽然总是加班,但工资也是非常可观的,前端算是计算机行业里入门比较简单的了,虽然往后走需要学的东西更杂更多,但是它也是零基础入门计算机比较快的一个板块了。 https://blog.csdn.net/qq_66118130/article/details/144142022
3.2024年面试必问的Web前端面试八股文及答案整理!纯干货超详细找朋友要了比较核心的一千多页前端八股文,3月背了一个月,面试了一些公司(包括三家还不错的公司)后面都没信,以为都挂了。 今天下午正在背八股,突然一通电话过来,说我面试通过了问我下周一能不能去报道。我二话不说就答应了,然后就给我发了offer过来,面试前不是在背八股文,就是在背八股文的路上啊 https://www.jianshu.com/p/ec135abe5dee
4.2024年11月24日随笔档案Ning0713摘要: 一、实验目的 知道什么是类模板,会正确定义和使用简单的类模板 会使用C++正确定义、使用派生类 加深对类的组合机制(has-a)、类的继承机制(is-a)的领悟和理解 练习标准库string, vector用法,能基于问题场景灵活使用 针对具体问题场景,练习运用面向对象思维进行设计,组合使用标准库和阅读全文 ?https://www.cnblogs.com/ning0713/p/archive/2024/11/24
5.C++相关八股14wx65950818d835e的技术博客C++相关八股-14 1.C++11中的auto是怎么实现自动识别类型的?模板是怎样实现转化成不同类型的? auto仅仅只是一个占位符,在编译期间它会被真正的类型替代,或者说C++中变量必须要有明确类型的,只是这个类型是由编译器自己推导出来的。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式具体类型函数的模具,所以https://blog.51cto.com/u_16492348/12670283
6.C#文档Microsoft Learn Challenge Nov 23, 2024 – Jan 10, 2025 立即注册 消除警报 Learn 发现 产品文档 开发语言 主题 登录 C# 文档 开始使用 基础 C# 中的新增功能 教程 语言集成查询 (LINQ) 异步编程 C# 概念 操作指南 C# 文章 高级主题 .NET Compiler Platform SDK (Roslyn API) https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/
7.C++知识点面试题目总结(八股文).pdf发布时间:2024-01-09发布于河南 浏览人气:233 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币(10金币=人民币1元) C++知识点面试题目总结(八股文).pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒。——《洪应明》 https://m.book118.com/html/2024/0107/8023120014006024.shtm
8.多益网络2024秋招游戏服务端开发面试楼主就对Java和Python熟悉一些,但是看的老哥春招面经以为会考C++相关的,就没怎么看Java的,结果踩了大坑.楼主是第一次面试,就纯当积累经验了(>﹏<)面试(45min)一.自我介绍 二.八股文1.Java多态的实现原理是怎么样的2.Java里面为什么不支持运算符的重载3.深拷贝和浅拷贝的区别4.什么情况下使用浅拷贝,什么情况下https://m.nowcoder.com/feed/main/detail/4b1fcdccf7654903a250eb0e78b4d747
9.MicrosoftVisualC++2015码农集市专业分享IT编程学习资源2024-11-19 14:34:52 积分:1 操作系统复习题.mp4 2024-11-19 13:53:56 积分:1 虚拟机械臂文件part1 2024-11-19 13:18:30 积分:1 嵌入式校招面试常用八股文 2024-11-19 12:06:20 积分:1 VMworkstation17+秘钥 2024-11-19 11:44:16 积分:1 日立https://www.coder100.com/index/index/content/id/1268403
10.暗黑百科全书CN[V1.0]上传者:Anrun123时间:2024-09-17 Dark Pixel UI v1.0 unity Dark Pixel UI v1.0 上传者:oBourne1时间:2023-09-30 暗黑风格-C++八股文-v1.0.pdf 暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格https://www.iteye.com/resource/shiju007-1731775
11.才华入组,分享码农求职资料javac++python测试教程面试八股来自: 柑橘甘菊 2024-06-06 10:34:49 已编辑 北京 求职路线: 大学上课是学不废的想找工作全靠自学,学会语言能自己写出点小项目以后就刷力扣,背八股,找实习,有实习经验再找工作就好找很多,码农现在卷了大厂还很看学历。。 java的,从入门到小型springboot项目 【超级会员V3】通过百度网盘分享的文件:java 链接:https://m.douban.com/group/topic/306948494/
12.SegmentFaultc++的问题 https://segmentfault.com/q/1010000045323111 2024-09-25T23:44:01+08:00 2024-09-25T23:44:01+08:00 年轻有为的小熊猫_ejItkh https://segmentfault.com/u/nianqingyouweidexiaoxiongmao_ejitkh 0 想入坑CPP游戏开发,有没有什么适合面试看的书,比如讲八股文讲的详细的,看完印象深刻,而且面试官那边https://segmentfault.com/feeds/tag/c%2B%2B
13.代码随想录知识星球精华├──代码随想录知识星球精华(最强八股文)第五版(C++篇).pdf 2.81M ├──代码随想录知识星球精华(最强八股文)第五版(Go篇).pdf 1.31M ├──代码随想录知识星球精华(最强八股文)第五版(Java篇).pdf 57.46M ├──代码随想录知识星球精华(最强八股文)第五版(概述).pdf 610.94kb https://985it.cn/15543/
14.包括但不限于C/C++GolangJavaScriptVue操作系统3、?校招八股文 3.1、编程语言 3.2、操作系统 3.3、计算机网络 3.4、数据库 3.5、智力题&情景题 4、数据结构与算法 4.1、算法基础 4.2、带你快速刷完67道剑指offer 4.3、精选力扣300+道算法题 4.4、面试高频算法真题 5、学习心得&总结 https://github.com/forthespada/InterviewGuide
15.代码随想录知识星球精华(第五版)最强八股文PDF下载C++篇:新增精选C++语试题 40+ 题,篇幅增加三分之?。 这份PDF总结了 代码随想录知识星球 的全部精华内容,覆盖了?乎程序员学习必备的内容,聚集了知识星球?录友们智慧的结晶。 ?家打开PDF的时候,看?录,就能感受到内容有多全了。 https://cmsblogs.cn/5039.html
16.重学C++引用一文看懂引用的本质与右值引用存在的意义总结一下C++中引用与指针的区别,常见面试八股文: 初始化和绑定: 引用:在声明时必须被初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到另一个对象。 指针:可以未初始化,并且可以指向任何类型的对象,也可以重新指向另一个对象。 间接访问: https://developer.aliyun.com/article/1490480