
JAVA
刘小董
做一个高傲的黑夜里的舞者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
华为od真题2023-C卷-三叉搜索树
每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。给你一系列数,请按以上规则,按顺序将数插入树中,构建出一棵三叉搜索树,最后输出树的高度。第二行为N个空格分隔的整数,每个数的范围为[1,10000]第一行为一个数N,表示有N个数,1原创 2024-03-24 23:07:07 · 791 阅读 · 0 评论 -
华为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 · 677 阅读 · 2 评论 -
静态代理和动态代理的区别
动态代理的优点是可以在运行时动态地添加、修改、删除被代理类的方法,对被代理类的功能进行扩展或修改,适用于一些动态的场景。静态代理是在编译时已经确定代理类和被代理类的关系,需要针对每个被代理类编写一个代理类。使用静态代理适合代理类数量不多且固定的情况,而使用动态代理适合代理类数量较多且无法提前确定的情况,例如对于某个接口的所有实现类都需要进行代理的情况。静态代理和动态代理都是设计模式中的一种代理模式,它们的区别在于代理类的生成方式和代理对象的绑定方式。原创 2024-03-17 10:54:47 · 561 阅读 · 0 评论 -
Shell语法介绍笔记
判断文件是否存在存在打印文件内容。其中反引号执行引入命令 ··shell就是命令的集合。原创 2019-09-29 15:39:44 · 271 阅读 · 1 评论 -
哪些情况下的对象会被垃圾回收机制处理掉
另外,对象被垃圾回收并不意味着立即回收该对象所占用的内存,而仅仅是标记该对象为可回收状态,在JVM认为适当的时候进行回收。对象变成不可达:当一个对象没有任何引用指向它时,即没有任何变量引用该对象,它就变成了不可达,垃圾回收机制会将其标记为可回收对象。对象引用超出作用域:当一个对象引用超出了其作用域,即该引用的变量超出了其有效范围,它就变成了不可达,可以被垃圾回收。对象引用被重新赋值:当一个对象引用被重新赋值为null时,原本引用的对象就变成了不可达,可以被垃圾回收。原创 2024-03-17 10:53:12 · 589 阅读 · 0 评论 -
ArrayList和LinkedList的区别,以及应用场景
ArrayList和LinkedList都是Java中的集合类,用于存储和操作一组对象。它们的主要区别在于内部实现方式和对操作的影响。在选择使用ArrayList还是LinkedList时,需要根据具体的需求和操作来权衡它们的优缺点。根据以上区别,可以根据不同的场景来选择使用ArrayList还是LinkedList。原创 2024-03-17 11:21:43 · 962 阅读 · 0 评论 -
HashSet与HashMap怎么判断集合元素重复?
如果两个元素的hashCode()值相等,并且equals()方法返回true,则认为两个元素相等,HashMap会将后一个元素覆盖前一个元素,并且使用新的值替换旧的值。所以,当我们自定义类作为HashSet或HashMap的元素时,需要重写hashCode()和equals()方法,以确保集合元素的唯一性判断。如果两个元素的hashCode()值相等,并且equals()方法返回true,则认为两个元素相等,HashSet会将后一个元素覆盖前一个元素。原创 2024-03-17 11:20:12 · 574 阅读 · 0 评论 -
HashMap与HashSet的区别
HashSet实现了Set接口,HashSet仅仅存储对象,使用add()方法将元素放入set中,HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false。综上所述,HashMap适用于需要通过key-value对来存储和访问元素的场景,而HashSet适用于只需要存储元素值并且需要保证元素的唯一性的场景。排序:HashMap中的元素是无序存储的,即添加元素的顺序不会影响遍历的顺序;原创 2024-03-17 11:17:23 · 982 阅读 · 0 评论 -
HashMap和HashTable的区别
这是因为Hashtable的各种操作都是同步的,即在操作期间会锁住整个Hashtable对象,而HashMap没有进行同步处理,因此在多线程环境下,使用HashMap可能会导致不可预期的结果。Null键和值的处理:Hashtable不允许null键或null值,如果尝试存储null键或null值,会抛出NullPointerException。而HashMap的初始容量默认是16,扩容因子也是0.75,每次扩容容量增加一倍。迭代顺序:HashMap的迭代顺序是不确定的,它是根据键的哈希值来决定的。原创 2024-03-17 11:12:59 · 405 阅读 · 0 评论 -
ArrayMap和HashMap的对比
内存占用:ArrayMap在存储少量数据时,相对于HashMap来说,占用的内存更少。查找效率:HashMap在查找和插入操作时,由于使用了哈希表,所以查找效率更高,时间复杂度为 O(1)。综上所述,ArrayMap适用于存储少量数据并且需要较低内存占用的场景,而HashMap适用于存储大量数据并且需要高效的查找操作的场景。数据顺序:HashMap不保证元素的顺序,而ArrayMap是按照插入顺序来存储元素的。实现方式:ArrayMap是基于数组实现的,HashMap基于哈希表实现的。原创 2024-03-17 11:08:13 · 961 阅读 · 0 评论 -
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 · 348 阅读 · 0 评论 -
String为什么要设计成不可变的
安全性:不可变的String对象可以在网络传输、文件读写等场景下提供更高的安全性。例如,如果String对象的内容被修改,那么在传输过程中可能会被篡改,而不可变的String对象可以确保它的内容在传输过程中不会被修改。这样,在后续的操作中,如果发现String的哈希值已经被缓存,就不需要重新计算了,可以直接使用缓存的值。不可变的String对象可以在字符串池中被共享使用,这样可以减少内存的使用,提高性能。线程安全:不可变的String对象可以被多个线程安全地共享,因为它们的值是在创建时确定的,不会改变。原创 2024-03-17 11:01:02 · 1262 阅读 · 0 评论 -
Java反射的理解
通过调用Class对象的newInstance()方法,可以创建一个类的对象,无需提前知道类的名称。通过Method类,可以获取方法的信息并调用方法,无需提前知道方法的名称和参数类型。这种能力在某些情况下非常有用,比如在运行时修改类的私有字段的值。Java反射是一种强大的机制,它允许程序在运行时检查和操作类、接口、方法、字段等的信息。通过反射,可以动态地获取类的信息,创建对象实例,调用方法,访问和修改字段的值等。总而言之,Java反射是一种强大而灵活的机制,可以让程序在运行时动态地操作类的信息。原创 2024-03-17 10:58:52 · 433 阅读 · 0 评论 -
Java中实现多态的机制
继承是Java中实现多态的基础。通过定义一个父类,然后在子类中继承父类,子类可以使用父类的方法和属性。这样,父类的对象可以引用子类的对象,实现了父类类型的引用可以指向子类的对象的多态。子类可以重写父类的方法,即子类可以提供自己的实现逻辑。当使用父类类型的引用指向子类对象时,调用的方法实际上是子类重写的方法。通过继承和方法重写,可以实现父类类型的引用指向不同子类的对象,调用相同的方法,实现了不同对象对同一方法的不同实现,从而实现了多态性。在Java中,实现多态的机制主要是通过继承和方法重写实现的。原创 2024-03-17 10:56:49 · 434 阅读 · 0 评论 -
Java的string 转换成 integer的方式及原理
方法接受一个字符串参数,并尝试将其解析为整数。如果字符串可以成功解析为整数,则返回解析后的整数值。如果无法解析为整数,则会抛出。该方法的原理是遍历字符串中的每个字符,并将其转换为对应的数字。方法将字符串"123"解析为整数123,并将其赋值给变量。在Java中,可以使用。方法将字符串转换为整数。原创 2024-03-14 21:25:03 · 1966 阅读 · 0 评论 -
成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
在项目中,成员内部类、静态内部类、局部内部类和匿名内部类都可以用于提高代码的封装性和可读性。成员内部类和静态内部类可以将相关的功能封装在一起,减少对外暴露的接口,提高代码的内聚性。静态内部类:静态内部类是定义在一个类的内部,但是与外部类没有关联的类。局部内部类:局部内部类是定义在一个方法体或代码块内部的类。匿名内部类:匿名内部类是没有名字的内部类,它一般是直接被创建和使用,不需要事先定义。匿名内部类主要用于简化代码,避免创建过多的类。成员内部类:成员内部类是定义在一个类的内部,并且与外部类有关联的类。原创 2024-03-14 21:22:38 · 438 阅读 · 0 评论 -
Java中的静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
静态方法是与类绑定的,而不是与实例绑定的。子类无法覆盖父类的静态方法,因为无法通过子类的实例来调用父类的静态方法,只能通过父类本身来调用。另外,子类可以通过自己的静态方法来隐藏父类的静态方法。当子类和父类有相同名称的静态方法时,子类的静态方法会隐藏父类的静态方法。隐藏后,通过子类的实例无法调用父类的静态方法,只能通过父类名来调用。当子类继承父类时,子类会继承父类的静态属性和静态方法。子类可以直接使用父类的静态属性和静态方法,无需重新定义。在Java中,静态属性和静态方法是可以被继承的,但不能被重写。原创 2024-03-14 21:21:09 · 1388 阅读 · 0 评论 -
Java中的Serializable 和Parcelable 的区别
2、Parcelable: Parcelable接口是Android提供的序列化接口,用于在Android组件之间传递对象。相对于Serializable,Parcelable的序列化和反序列化过程更加高效,因为它是直接在内存中进行对象的传输,避免了IO操作。但是,使用Parcelable需要手动实现序列化和反序列化的过程,并且代码相对复杂一些。而Parcelable适用于Android应用中需要高效传输对象的场景,需要手动实现序列化和反序列化的过程。它们的区别在于使用的方式和应用场景。原创 2024-03-14 21:19:56 · 601 阅读 · 0 评论 -
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 · 395 阅读 · 0 评论 -
进程和线程的区别
该应用程序有一个进程用于管理整个应用的逻辑,同时有多个线程用于不同的功能,比如一个线程用于播放音乐,一个线程用于显示界面。这样做的好处是,多个线程可以并发执行,提高了系统的效率,同时又可以共享进程的资源,比如播放音乐的线程可以直接访问音乐文件,显示界面的线程可以直接访问界面控件。进程间切换需要保存当前进程的上下文并加载下一个进程的上下文,这个过程需要较大的开销。线程是进程的一个执行单位,多个线程可以在同一个进程中并发执行,共享进程的所有资源。典型的线程有浏览器的渲染线程、文本编辑器的光标闪烁线程等。原创 2024-03-14 21:15:28 · 396 阅读 · 0 评论 -
内部类的概念?内部类的作用是什么?
内部类是指在一个类的内部定义的另一个类。内部类可以直接访问外部类的成员,包括私有成员,而外部类不能直接访问内部类的成员。2、静态内部类(Static Inner Class):定义在外部类的成员位置,使用 static 修饰,不依赖于外部类的实例。4、匿名内部类(Anonymous Inner Class):没有显式的类名,直接定义在方法内部或作为接口的实现类。1、成员内部类(Member Inner Class):定义在外部类的成员位置,可以直接访问外部类的成员。原创 2024-03-14 21:13:57 · 494 阅读 · 0 评论 -
String、StringBuffer、StringBuilder区别
需要注意的是,当需要进行大量字符串拼接或修改操作时,推荐使用StringBuilder类,因为它的性能更高。这意味着每次对String对象进行修改时,都会创建一个新的String对象,原始的String对象不会改变。2、StringBuffer是一个可变的线程安全的类,用于存储和修改大量的字符串。StringBuffer的方法是同步的,可以在多线程环境下使用,但性能相对较低。3、StringBuilder是一个可变的非线程安全的类,与StringBuffer类似,可以用于存储和修改大量的字符串。原创 2024-03-14 21:10:44 · 359 阅读 · 0 评论 -
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 · 585 阅读 · 0 评论 -
java中==和equals和hashCode的区别
3、hashCode方法:用于获取对象的哈希码,即对象的散列值。默认情况下,hashCode方法返回的是对象的内存地址的整数表示。默认情况下,equals方法和==操作符的行为是相同的,即比较对象的引用。总结:==操作符比较的是对象的引用,equals方法比较的是对象的内容,hashCode方法获取的是对象的哈希码。在自定义类中,我们可以根据需要覆写equals和hashCode方法,以实现自定义的相等比较和哈希算法。1、==操作符:用于比较两个对象的引用是否相等,即比较对象的内存地址。原创 2024-03-14 21:06:53 · 406 阅读 · 0 评论 -
JVM,GC算法,垃圾回收器,类加载器,进行线上JVM性能调优。
初始时,所有的存活对象都在From区。在清除阶段,遍历整个堆内存,将没有被标记的对象视为垃圾对象,并进行清除操作,即释放这些对象所占用的内存。初始标记(Initial Mark):CMS收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。初始标记(Initial Mark):G1收集器会首先进行一次短暂的STW(Stop-The-World)停顿,标记所有的根对象,并标记在根对象可达的情况下,直接与其关联的存活对象。原创 2024-03-13 21:28:39 · 1042 阅读 · 0 评论 -
仿照Android开源框架OkHttp而写的一个基于HttpURLConnection网络请求的demo包含Basic认证和重试机制
我们在平时使用第三方框架的时候总觉得就那样使用就行了,然而如果第三方框架不存在了,就会感觉不知所措了。其实我们应该了解第三方访问框架的设计思路,进而学习其中的思想,不管到哪里,用什么语言都能应对。市面上常用的网络访问框架是okhttp。他的优点是接收多个请求,重试机制。他在请求的时候将请求放入请求队列。使用线程池来响应每一个请求。线程池如果有空闲的线程时去相应请求。否则就等待。线程池有默认的几个任务线程。原创 2019-07-24 19:24:38 · 687 阅读 · 1 评论 -
Android手撕EventBus
代码是上面的所有代码,可能没有解绑的操作,具体查看EventBus源码大致思路跟本demo一样。代码未完,后续会继续补充解绑删除。Android和java的发布订阅事件总线,事件总是对发布订阅模式的实现,它是一种集中式的事件处理机制,允许不同组建之间进行彼此的通讯,而又不需要相互依赖,达到解耦的目的性。关于为何要用线程模式,线程模式有两个一个是主线程,一个是子线程。在进行异步加载的时候需要在子线程中加载。EventBus对方法进行封装的时候有这么几个属性 方法本体,线程模式,方法中的参数。原创 2019-07-24 15:27:24 · 192 阅读 · 1 评论 -
一键打造自己的Gilde图片加载控件
整个思路很简单,首先请求类在队列排队,请求相应类在柜台等待执行请求,请求管理安排请求响应什么时候加载请求。通过队列的方式请求网络,使用 HttpURLConnection加载图片流。如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;只要垃圾回收器没有回收它,该对象就可以被程序使用。银行管理,管理顾客和图片加载调度员,也即请求管理管理请求类和请求响应类,为请求创建队列,管理请求相应执行顺序。联通营业厅管理着柜台和顾客,顾客相当于请求,柜台管理员相当于图片加载调度员。银行管理类也即请求管理类。原创 2019-07-17 15:12:35 · 276 阅读 · 0 评论 -
一周过去的总结,写在周日
废话开头生活总是有很琐事需要处理,当你去处理一件事情的时候往往会暂时放下另一件事,这就会导致一个阶段时间的遗忘,为了防止以为我特此在这里总结。过去我做了很多事情,首先第一就是完成公司安排的工作,调试代码,修改bug等。目前针对于智慧机安卓屏发现的bug是数据处理有问题。一、会出现数据丢失分析:不知道是把之前的处理方式推翻重新处理还是在原来的基础上多加判断,我觉得可扩展性的话我会选择...原创 2019-07-28 23:23:32 · 301 阅读 · 0 评论 -
Android使用AOP依赖倒置----------------注解开发
另外注解开发一贯是spring的使用风格,能不能直接用spring的思想来依赖注入安卓控件的值,答案是可以的。注解开发框架有很多,比如xUtils,但xUtils比较臃肿,它包含了数据库,网络请求,注解开发,图片加载。虽然现在本人做的这个demo比不上优秀的注解开发模块,但是其思路还是很棒的,减少很多代码开发。事件注入(有点复杂)运用AOP切面,使用java8的动态代理来拦截事件方法,然后将事件方法拦截替换自定义方法,随后将自定义方法代替事件方法来执行。布局注入方法,通过java的反射。原创 2019-07-18 16:56:33 · 362 阅读 · 1 评论