- 博客(86)
- 资源 (14)
- 问答 (1)
- 收藏
- 关注
原创 华为od真题2023-C卷-三叉搜索树
每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。给你一系列数,请按以上规则,按顺序将数插入树中,构建出一棵三叉搜索树,最后输出树的高度。第二行为N个空格分隔的整数,每个数的范围为[1,10000]第一行为一个数N,表示有N个数,1
2024-03-24 23:07:07
748
原创 华为od真题--2023C卷-地图寻宝华为OD真题题解
小华按照地图去寻宝,地图上被划分成m行和n列的方格,横纵坐标范围分别是[0,n-1]和[0,m-1]。在横坐标和纵坐标的数位之和不大于k的方格中存在黄金(每个方格中仅存在一克黄金),但横坐标和纵坐标之和大于k的方格存在危险不可进入。小华从入口(0,0)进入,任何时候只能向左,右,上,下四个方向移动一格。请问小华最多能获得多少克黄金?输入中包含3个字数,分别是m,n,k。解题思路使用深度优先搜索算法。最多能获得多少克黄金。
2024-03-24 22:57:31
599
2
原创 ArrayList和LinkedList的区别,以及应用场景
ArrayList和LinkedList都是Java中的集合类,用于存储和操作一组对象。它们的主要区别在于内部实现方式和对操作的影响。在选择使用ArrayList还是LinkedList时,需要根据具体的需求和操作来权衡它们的优缺点。根据以上区别,可以根据不同的场景来选择使用ArrayList还是LinkedList。
2024-03-17 11:21:43
938
原创 HashSet与HashMap怎么判断集合元素重复?
如果两个元素的hashCode()值相等,并且equals()方法返回true,则认为两个元素相等,HashMap会将后一个元素覆盖前一个元素,并且使用新的值替换旧的值。所以,当我们自定义类作为HashSet或HashMap的元素时,需要重写hashCode()和equals()方法,以确保集合元素的唯一性判断。如果两个元素的hashCode()值相等,并且equals()方法返回true,则认为两个元素相等,HashSet会将后一个元素覆盖前一个元素。
2024-03-17 11:20:12
521
原创 HashMap与HashSet的区别
HashSet实现了Set接口,HashSet仅仅存储对象,使用add()方法将元素放入set中,HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false。综上所述,HashMap适用于需要通过key-value对来存储和访问元素的场景,而HashSet适用于只需要存储元素值并且需要保证元素的唯一性的场景。排序:HashMap中的元素是无序存储的,即添加元素的顺序不会影响遍历的顺序;
2024-03-17 11:17:23
948
原创 HashMap和HashTable的区别
这是因为Hashtable的各种操作都是同步的,即在操作期间会锁住整个Hashtable对象,而HashMap没有进行同步处理,因此在多线程环境下,使用HashMap可能会导致不可预期的结果。Null键和值的处理:Hashtable不允许null键或null值,如果尝试存储null键或null值,会抛出NullPointerException。而HashMap的初始容量默认是16,扩容因子也是0.75,每次扩容容量增加一倍。迭代顺序:HashMap的迭代顺序是不确定的,它是根据键的哈希值来决定的。
2024-03-17 11:12:59
391
原创 ArrayMap和HashMap的对比
内存占用:ArrayMap在存储少量数据时,相对于HashMap来说,占用的内存更少。查找效率:HashMap在查找和插入操作时,由于使用了哈希表,所以查找效率更高,时间复杂度为 O(1)。综上所述,ArrayMap适用于存储少量数据并且需要较低内存占用的场景,而HashMap适用于存储大量数据并且需要高效的查找操作的场景。数据顺序:HashMap不保证元素的顺序,而ArrayMap是按照插入顺序来存储元素的。实现方式:ArrayMap是基于数组实现的,HashMap基于哈希表实现的。
2024-03-17 11:08:13
877
原创 List,Set,Map的区别
Map是键值对的集合,每个元素都包含一个键和一个值。键在Map中是唯一的,但值可以重复。常见的Map实现类有HashMap和TreeMap。List是有序集合,可以包含重复元素。元素的存储顺序由插入顺序决定,并且可以根据索引访问元素。常见的List实现类有ArrayList和LinkedList。Set是无序集合,不可以包含重复元素。元素的存储顺序是不确定的,因此不能通过索引访问元素。常见的Set实现类有HashSet和TreeSet。List, Set, 和 Map 是Java中常用的三种集合类型。
2024-03-17 11:05:20
332
原创 String为什么要设计成不可变的
安全性:不可变的String对象可以在网络传输、文件读写等场景下提供更高的安全性。例如,如果String对象的内容被修改,那么在传输过程中可能会被篡改,而不可变的String对象可以确保它的内容在传输过程中不会被修改。这样,在后续的操作中,如果发现String的哈希值已经被缓存,就不需要重新计算了,可以直接使用缓存的值。不可变的String对象可以在字符串池中被共享使用,这样可以减少内存的使用,提高性能。线程安全:不可变的String对象可以被多个线程安全地共享,因为它们的值是在创建时确定的,不会改变。
2024-03-17 11:01:02
1213
原创 Java反射的理解
通过调用Class对象的newInstance()方法,可以创建一个类的对象,无需提前知道类的名称。通过Method类,可以获取方法的信息并调用方法,无需提前知道方法的名称和参数类型。这种能力在某些情况下非常有用,比如在运行时修改类的私有字段的值。Java反射是一种强大的机制,它允许程序在运行时检查和操作类、接口、方法、字段等的信息。通过反射,可以动态地获取类的信息,创建对象实例,调用方法,访问和修改字段的值等。总而言之,Java反射是一种强大而灵活的机制,可以让程序在运行时动态地操作类的信息。
2024-03-17 10:58:52
421
原创 Java中实现多态的机制
继承是Java中实现多态的基础。通过定义一个父类,然后在子类中继承父类,子类可以使用父类的方法和属性。这样,父类的对象可以引用子类的对象,实现了父类类型的引用可以指向子类的对象的多态。子类可以重写父类的方法,即子类可以提供自己的实现逻辑。当使用父类类型的引用指向子类对象时,调用的方法实际上是子类重写的方法。通过继承和方法重写,可以实现父类类型的引用指向不同子类的对象,调用相同的方法,实现了不同对象对同一方法的不同实现,从而实现了多态性。在Java中,实现多态的机制主要是通过继承和方法重写实现的。
2024-03-17 10:56:49
414
原创 静态代理和动态代理的区别
动态代理的优点是可以在运行时动态地添加、修改、删除被代理类的方法,对被代理类的功能进行扩展或修改,适用于一些动态的场景。静态代理是在编译时已经确定代理类和被代理类的关系,需要针对每个被代理类编写一个代理类。使用静态代理适合代理类数量不多且固定的情况,而使用动态代理适合代理类数量较多且无法提前确定的情况,例如对于某个接口的所有实现类都需要进行代理的情况。静态代理和动态代理都是设计模式中的一种代理模式,它们的区别在于代理类的生成方式和代理对象的绑定方式。
2024-03-17 10:54:47
526
原创 哪些情况下的对象会被垃圾回收机制处理掉
另外,对象被垃圾回收并不意味着立即回收该对象所占用的内存,而仅仅是标记该对象为可回收状态,在JVM认为适当的时候进行回收。对象变成不可达:当一个对象没有任何引用指向它时,即没有任何变量引用该对象,它就变成了不可达,垃圾回收机制会将其标记为可回收对象。对象引用超出作用域:当一个对象引用超出了其作用域,即该引用的变量超出了其有效范围,它就变成了不可达,可以被垃圾回收。对象引用被重新赋值:当一个对象引用被重新赋值为null时,原本引用的对象就变成了不可达,可以被垃圾回收。
2024-03-17 10:53:12
559
原创 Android的进程管理,内存管理,驱动管理
进程优先级:Android系统根据进程的优先级来管理进程的调度。系统会根据当前系统资源的使用情况来决定是否终止低优先级的进程,以保证高优先级进程的正常运行。总的来说,Android的进程管理、内存管理和驱动管理是系统中重要的组成部分,它们共同协作,保证了应用程序的正常运行和系统的稳定性。进程概念:Android系统中,每一个运行的应用程序都会被分配一个独立的进程,每个进程都有自己的虚拟机实例和运行环境。内存优化:Android系统还提供了一些内存优化技术,如内存缓存、对象池等,以提高内存的利用率和性能。
2024-03-17 10:50:08
732
原创 如何进行Android的SDK开发
在Android Studio中,可以通过选择“Create New Project”来创建一个新的Android项目。在创建项目的过程中,需指定应用的名称、包名、目标SDK版本等。在已有的Android项目中,可以创建一个新的模块来放置SDK相关的代码。在NDK开发过程中,可以使用NDK提供的调试工具和技术,如GDB、LLDB和Android Studio的调试器。在SDK模块中,可以定义需要暴露给开发者使用的接口和方法。在目标项目中,需要将SDK模块作为依赖添加到项目中。
2024-03-15 22:08:31
1967
1
原创 Android平台架构和Android Framework的区别
其中几个关键方法包括onCreate()(在Activity被创建时调用,用于初始化界面和数据)、onStart()(在Activity开始可见时调用)、onResume()(在Activity与用户交互之前调用)、onPause()(在Activity失去焦点但仍可见时调用,可用于保存数据或释放资源)、onStop()(在Activity不可见时调用,可以进行一些清理操作)和onDestroy()(在Activity被销毁时调用,用于释放资源和销毁对象)。应用层:包括用户界面、应用程序和系统应用等。
2024-03-15 22:03:18
1264
原创 android的Framework
Content Provider组件:Content Provider是一种数据共享的机制,它可以让不同的应用程序共享和访问特定的数据。Android Framework是一种基于Java的开发框架,它为Android应用程序提供了一系列的API和组件,以便开发者可以更轻松地构建功能丰富的应用程序。总之,Android Framework是Android应用开发的基础架构,它提供了一系列的API和组件,以便开发者可以更轻松地构建功能丰富的应用程序,并且提供了各种功能和服务来简化开发过程。
2024-03-15 21:57:25
672
原创 Java的string 转换成 integer的方式及原理
方法接受一个字符串参数,并尝试将其解析为整数。如果字符串可以成功解析为整数,则返回解析后的整数值。如果无法解析为整数,则会抛出。该方法的原理是遍历字符串中的每个字符,并将其转换为对应的数字。方法将字符串"123"解析为整数123,并将其赋值给变量。在Java中,可以使用。方法将字符串转换为整数。
2024-03-14 21:25:03
1532
原创 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
在项目中,成员内部类、静态内部类、局部内部类和匿名内部类都可以用于提高代码的封装性和可读性。成员内部类和静态内部类可以将相关的功能封装在一起,减少对外暴露的接口,提高代码的内聚性。静态内部类:静态内部类是定义在一个类的内部,但是与外部类没有关联的类。局部内部类:局部内部类是定义在一个方法体或代码块内部的类。匿名内部类:匿名内部类是没有名字的内部类,它一般是直接被创建和使用,不需要事先定义。匿名内部类主要用于简化代码,避免创建过多的类。成员内部类:成员内部类是定义在一个类的内部,并且与外部类有关联的类。
2024-03-14 21:22:38
417
原创 Java中的静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
静态方法是与类绑定的,而不是与实例绑定的。子类无法覆盖父类的静态方法,因为无法通过子类的实例来调用父类的静态方法,只能通过父类本身来调用。另外,子类可以通过自己的静态方法来隐藏父类的静态方法。当子类和父类有相同名称的静态方法时,子类的静态方法会隐藏父类的静态方法。隐藏后,通过子类的实例无法调用父类的静态方法,只能通过父类名来调用。当子类继承父类时,子类会继承父类的静态属性和静态方法。子类可以直接使用父类的静态属性和静态方法,无需重新定义。在Java中,静态属性和静态方法是可以被继承的,但不能被重写。
2024-03-14 21:21:09
1273
原创 Java中的Serializable 和Parcelable 的区别
2、Parcelable: Parcelable接口是Android提供的序列化接口,用于在Android组件之间传递对象。相对于Serializable,Parcelable的序列化和反序列化过程更加高效,因为它是直接在内存中进行对象的传输,避免了IO操作。但是,使用Parcelable需要手动实现序列化和反序列化的过程,并且代码相对复杂一些。而Parcelable适用于Android应用中需要高效传输对象的场景,需要手动实现序列化和反序列化的过程。它们的区别在于使用的方式和应用场景。
2024-03-14 21:19:56
549
原创 final,finally,finalize的区别
但是,不建议在代码中使用"finalize"方法,因为其调用时间是不确定的,并且可能会导致性能问题。1、Final (关键字):在Java中,"final"可以用来修饰类、方法和变量。2、Finally (关键字):在Java中,"finally"用于与"try"和"catch"结合使用,用来定义一段无论异常是否发生都会执行的代码块。"finally"块通常用于释放资源或执行清理操作。在Java中,"final","finally"和"finalize"是三个不同的关键字,它们有不同的含义和用途。
2024-03-14 21:17:55
378
原创 进程和线程的区别
该应用程序有一个进程用于管理整个应用的逻辑,同时有多个线程用于不同的功能,比如一个线程用于播放音乐,一个线程用于显示界面。这样做的好处是,多个线程可以并发执行,提高了系统的效率,同时又可以共享进程的资源,比如播放音乐的线程可以直接访问音乐文件,显示界面的线程可以直接访问界面控件。进程间切换需要保存当前进程的上下文并加载下一个进程的上下文,这个过程需要较大的开销。线程是进程的一个执行单位,多个线程可以在同一个进程中并发执行,共享进程的所有资源。典型的线程有浏览器的渲染线程、文本编辑器的光标闪烁线程等。
2024-03-14 21:15:28
383
原创 内部类的概念?内部类的作用是什么?
内部类是指在一个类的内部定义的另一个类。内部类可以直接访问外部类的成员,包括私有成员,而外部类不能直接访问内部类的成员。2、静态内部类(Static Inner Class):定义在外部类的成员位置,使用 static 修饰,不依赖于外部类的实例。4、匿名内部类(Anonymous Inner Class):没有显式的类名,直接定义在方法内部或作为接口的实现类。1、成员内部类(Member Inner Class):定义在外部类的成员位置,可以直接访问外部类的成员。
2024-03-14 21:13:57
460
原创 String、StringBuffer、StringBuilder区别
需要注意的是,当需要进行大量字符串拼接或修改操作时,推荐使用StringBuilder类,因为它的性能更高。这意味着每次对String对象进行修改时,都会创建一个新的String对象,原始的String对象不会改变。2、StringBuffer是一个可变的线程安全的类,用于存储和修改大量的字符串。StringBuffer的方法是同步的,可以在多线程环境下使用,但性能相对较低。3、StringBuilder是一个可变的非线程安全的类,与StringBuffer类似,可以用于存储和修改大量的字符串。
2024-03-14 21:10:44
350
原创 int与integer的区别
integer是Java中的封装类,它是对int类型的包装。integer类在需要使用对象的地方很有用,比如在集合中存储整数。由于integer是对象,所以它的存储空间较大,并且执行速度较慢。在上面的例子中,我们使用int类型的变量x存储整数值10,并使用integer类型的变量y存储整数值20。在使用int类型时,我们不需要使用new关键字来创建对象,而在使用integer类型时需要使用new关键字来创建对象。int和integer都是用来表示整数的数据类型,但有一些细微的区别。
2024-03-14 21:09:16
571
原创 java中==和equals和hashCode的区别
3、hashCode方法:用于获取对象的哈希码,即对象的散列值。默认情况下,hashCode方法返回的是对象的内存地址的整数表示。默认情况下,equals方法和==操作符的行为是相同的,即比较对象的引用。总结:==操作符比较的是对象的引用,equals方法比较的是对象的内容,hashCode方法获取的是对象的哈希码。在自定义类中,我们可以根据需要覆写equals和hashCode方法,以实现自定义的相等比较和哈希算法。1、==操作符:用于比较两个对象的引用是否相等,即比较对象的内存地址。
2024-03-14 21:06:53
381
原创 介绍kafka核心原理及底层刷盘机制,集群分片机制,消息丢失和重复消费有对应的线上解决方案
对于底层刷盘机制,Kafka采用了异步的方式进行数据持久化,即生产者在发送消息后不等待磁盘写入完成的确认,而是继续发送下一批消息。消息丢失:Kafka通过设置消息的持久性、副本因子和数据刷盘策略来提供高可靠性的消息存储。此外,可以使用消费者的消费组(Consumer Group)来实现负载均衡和故障容错,确保每个分区只被一个消费者组中的一个消费者消费。发布/订阅模型:Kafka采用发布/订阅模型,消息的生产者将消息发送到一个或多个主题(Topic),而消费者则订阅一个或多个主题并消费其中的消息。
2024-03-14 13:53:17
1190
原创 单机和集群redis的搭建
你可以使用Redis的客户端命令行工具或者通过编程语言的Redis客户端库来连接和操作Redis集群。下载Redis:首先,你需要从Redis官方网站(https://redis.io/download)上下载Redis的最新稳定版本。创建Redis集群:使用Redis的集群工具来创建和管理Redis集群。准备多个Redis实例:首先,你需要准备多个Redis实例,可以在同一台机器上或者不同的机器上运行。修改Redis配置文件:对于每个Redis实例,你需要修改其配置文件。是每个主节点的从节点数量。
2024-03-14 13:50:03
653
原创 介绍一下redis中底层磁盘及IO模型,数据持久化机制,哨兵机制
AOF:AOF是一种日志的方式,会将每个写操作追加到一个文件的末尾,以此来记录所有的写操作。当需要恢复数据时,只需重新执行文件中的写操作即可。AOF:AOF是一种日志的方式,会将每个写操作追加到一个文件的末尾,以此来记录所有的写操作。AOF文件存储的是所有的写操作,可以通过重放AOF文件中的写操作来恢复数据。底层磁盘及IO模型: Redis中的数据存储在内存中,但为了保证数据的持久化,Redis还提供了两种数据持久化方式:RDB(Redis DataBase)和AOF(Append-Only File)。
2024-03-14 13:47:38
997
1
原创 mysql的锁,事务,索引的理解以及如何进行线上项目调优
排它锁则是独占锁,一旦事务获得了排它锁,其他事务无法同时访问该数据,直到锁被释放。在选择索引时,需要考虑查询的频率和数据的更新频率。合理设计表结构:根据业务需求设计合理的表结构,避免冗余和无效数据,并正确选择适当的数据类型和主键。监控和性能测试:设置合适的监控系统,实时监控数据库的性能和负载,并定期进行性能测试和压力测试。优化查询语句:重写或优化查询语句,避免不必要的全表扫描和JOIN操作,确保索引被充分利用。适当使用缓存:通过使用缓存技术如Redis等,减少对数据库的访问次数,提高响应速度。
2024-03-14 13:39:22
508
原创 对服务划分,服务治理,服务分层的理解
其中,Eureka用于服务注册与发现,Ribbon用于服务路由与负载均衡,Hystrix用于服务容错与降级,Zipkin用于服务监控与追踪。综上所述,对于Spring Cloud、Spring Cloud Alibaba和Dubbo等微服务框架来说,服务划分、服务治理和服务分层是构建和管理微服务架构的重要方面。通过合理的服务划分和分层,结合强大的服务治理能力,可以实现高可用、高性能和高可靠的分布式系统。服务分层是指将一个服务按照业务逻辑和功能进行分层,形成不同层级的服务,每个层级负责不同的功能。
2024-03-14 13:32:15
845
原创 详细介绍Springcloud,Springcloud alibaba,dubbo等微服务框架,以及nacos和feign
Spring Cloud是一个基于Spring Boot的微服务框架,提供了一系列的组件和工具,用于构建可靠、弹性、高可用的分布式系统和微服务架构。Spring Cloud Alibaba是Spring Cloud的一个子项目,集成了阿里巴巴的开源组件和工具,提供了更多的选择和灵活性,帮助开发者构建基于阿里巴巴生态系统的微服务应用。我们可以使用Nacos进行服务注册与发现,每个实例在启动时将自己注册到Nacos服务器,并在需要调用其他服务时,可以通过Nacos的服务发现功能获取到其他服务的实例地址。
2024-03-13 21:47:35
697
原创 使用maven命令行。手动搭建maven项目
这个命令会使用Maven的快速启动原型(maven-archetype-quickstart)生成一个基本的Maven项目。打开项目:进入刚才创建的项目目录,可以看到生成的项目结构,使用任意文本编辑器打开项目中的pom.xml文件。要使用Maven命令行,首先需要确保已经安装了Maven。以上是手动搭建Maven项目的基本步骤。下面用代码举例说明如何使用Maven命令行。这个命令会清理项目目录中的构建文件,并编译、测试、打包项目。
2024-03-13 21:40:18
546
原创 Spring的bean的生命周期的核心代码实现的理解,及Spring使用的工厂模式
在Spring中,BeanFactory就是一个典型的工厂方法模式的实现,它是通过xml配置文件或注解来定义bean的创建和管理,并且可以根据需要创建不同的BeanFactory实现类。在Spring中,BeanFactory接口就是抽象工厂模式的实现,它定义了创建和管理bean的方法,并且可以通过不同的实现类提供不同的创建逻辑。1、实例化阶段:在这个阶段,Spring容器会根据配置文件中的信息,通过反射机制创建bean的实例。3、初始化阶段:在这个阶段,Spring容器会调用bean实例的初始化方法。
2024-03-13 21:38:00
403
原创 JVM,GC算法,垃圾回收器,类加载器,进行线上JVM性能调优。
初始时,所有的存活对象都在From区。在清除阶段,遍历整个堆内存,将没有被标记的对象视为垃圾对象,并进行清除操作,即释放这些对象所占用的内存。初始标记(Initial Mark):CMS收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。初始标记(Initial Mark):G1收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。
2024-03-13 21:28:39
1020
原创 Java的锁机制,线程池机制在项目中应用
根据项目的需求,选择适当的线程池类型,比如FixedThreadPool、CachedThreadPool等。处理线程池的异常:使用线程池的RejectedExecutionHandler来处理线程池中的异常。可以使用线程池的shutdown()或shutdownNow()方法来关闭线程池。提交任务到线程池:使用线程池的execute()方法或submit()方法将任务提交给线程池。控制线程池的并发度:可以通过设置线程池的核心线程数、最大线程数、任务队列等参数来控制线程池的并发度。
2024-03-13 20:52:50
429
原创 Java的线程池机制
2、CachedThreadPool(缓存线程池):该线程池的线程数量是根据需要动态调整的,适用于执行短期的、异步的、大量的任务的情况。1、FixedThreadPool(固定大小线程池):该线程池的线程数量是固定的,适用于执行长期的、固定数目的任务的情况。4、SingleThreadExecutor(单线程线程池):该线程池只有一个线程,适用于需要保证顺序执行各个任务的情况。3、ScheduledThreadPool(定时线程池):该线程池可用于按一定的时间间隔来执行任务或者定时执行某个任务。
2024-03-13 20:50:09
433
原创 Java的锁机制
4、Lock接口的其他实现类: 除了ReentrantLock之外,Java还提供了其他的Lock接口的实现类,如StampedLock和Condition等。在Java中,有几种锁机制可以用于实现并发控制,包括synchronized关键字、ReentrantLock类、ReadWriteLock接口以及Lock接口的其他实现类。下面分别介绍这些锁机制,并提供相应的代码示例。这些锁机制在Java中用于实现并发控制,可以根据具体的需求选择合适的锁机制来确保线程安全性和并发性能。
2024-03-13 20:47:09
373
原创 Java的设计模式基本概念及使用场景
设计模式是软件开发中常用的解决问题的可重用模式。它提供了一套经过验证的解决方案,可以帮助开发人员解决常见问题,并提高代码的可维护性和可扩展性。Java中有23种常见的设计模式,可以分为三个类别:创建型模式、结构型模式和行为型模式。
2024-03-13 19:54:27
700
富文本编辑+TinyMCE 5.4.1+汉化、地图、排版、图片上传+内容创建与展示
2024-12-09
java生成二维码源代码
2018-08-06
关系型数据库mysql的一对多关系表在HBase如何存储
2017-05-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人