知名网站建设平台宝塔批量建站工具

张小明 2026/1/13 7:13:56
知名网站建设平台,宝塔批量建站工具,济宁网站建设怎么样,网页设计与制作报告模板为什么重写 equals() 时必须重写 hashCode() 方法#xff1f; 因为两个相等的对象的hashCode值一定相等#xff0c;也就是说如果equals()方法判断两个对象是相等的#xff0c;那这两个对象的hashCode值也要相等。如果重写equals()时没有重写hashCode()方法的话就可能会导致…为什么重写 equals() 时必须重写 hashCode() 方法因为两个相等的对象的hashCode值一定相等也就是说如果equals()方法判断两个对象是相等的那这两个对象的hashCode值也要相等。如果重写equals()时没有重写hashCode()方法的话就可能会导致equals()方法判断是相等的两个对象hashCode值却不相等。和equals()的区别1对于基本数据类型来说 比较的是值2对于引用数据类型来说 比较的是对象的内存地址即判断它们是否为同一个对象。equals()不能用于判断基本数据类型的变量只能用来判断两个对象是否相等。1类没有重写equals()方法通过equals()比较该类的两个对象时等价于通过“”比较这两个对象即比较两个对象的内存地址是否相同。2类重写了equals()方法比较两个对象中的内容是否相等如String。String、StringBuffer、StringBuilder的区别String由final修饰是不可变类不能被继承线程安全。StringBuffer可变的字符序列、线程安全。StringBuilder可变的字符序列、线程不安全、效率高和StringBuilder有共同的父类AbstractStringBuilder。String为什么要设计为不可变类1由于String被广泛使用会用来存储敏感信息如果字符串是可变的容易被篡改无法保证使用字符串进行操作时它是安全的。2字符串常量池的需要字符串常量池是Java堆内存中一个特殊的存储区域, 当创建一个String对象时假如此字符串值已经存在于常量池中则不会创建一个新的对象而是引用已经存在的对象若字符串可变字符串常量池失去意义。3字符串不变性保证了hash码的唯一性使得类似HashMapHashSet等容器才能实现相应的缓存功能。由于String的不可变避免重复计算hashcode只要使用缓存的hashcode即可大大提高了在散列集合中使用String对象的性能。String字符串修改实现的底层原理当用String类型来对字符串进行修改时其实现方法是首先创建一个 StringBuilder其次调用StringBuilder的append()方法最后调用StringBuilder的toString()方法把结果返回。String str abc和new String(abc)的区别String str abcJVM 会首先检查字符串常量池中是否已经存在该字符串对象如果已经存在那么就不会再创建了直接返回该字符串在字符串常量池中的内存地址将其引用赋值给变量如果字符串常量池中没有该字符串那么就会在字符串常量池中创建该字符串对象然后再返回。new String(abc)JVM会首先检查字符串常量池中是否已经存在该字符串如果已经存在则不会在字符串常量池中再创建了如果不存在则就会在字符串常量池中创建该字符串对象然后再到堆内存中再创建一份字符串对象把字符串常量池中的字符串内容拷贝到内存中的字符串对象中然后返回堆内存中该字符串的内存地址。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho如何处理异常在Java中处理异常的语句由try、catch、finally三部分组成。使用try将可能出现异常的代码包裹起来在执行过程中一旦出现异常就会生成一个对应异常类的对象根据此对象的类型去catch中进行匹配。一旦try中的异常对象匹配到某一个catch时就进入到catch中进行异常处理。处理完成后就跳出当前的try-catch结构继续执行后面的代码。像数据库连接、输入输出流、网络变成Socket等资源JVM不能自动回收我们需要手动进行资源释放此时的资源释放需要声明在finally中。finally中声明的是一定会被执行的代码即使catch中又出现了异常、try中有return语句或catch中有return语句等情况。Java也允许程序主动抛出异常。当业务代码中判断某项错误的条件成立时可以使用throw关键字向外抛出异常。如果当前方法不知道该如何处理这个异常指明执行此方法时可能会出现的异常类型一旦方法体执行时出现异常会在异常代码处生成一个异常类对象此对象满足throws后的异常类型时就会被抛出后面的代码不会继续执行则该异常将交给JVM处理。finally一定会被执行吗finally中声明的是一定会被执行的代码即使catch中又出现了异常、try中有return语句或catch中有return语句等情况。当在try块或catch块中遇到return语句时finally语句块将在方法返回之前被执行。finally可以有return吗在通常情况下不要在finally块中使用return、throw等导致方法终止的语句一旦在finally块中使用了return、throw语句将会导致try块、catch块中的return、throw语句失效。Exception和Error有什么区别Error类和Exception类的父类都是Throwable类。主要区别如下Exception程序本身可以处理的异常可以通过catch来进行捕获。Exception 又可以分为 Checked Exception受检查异常必须处理和 Unchecked Exception 不受检查异常可以不处理。ErrorError属于程序无法处理的错误例如Java虚拟机运行错误、虚拟机内存不够错误、类定义错误等。这些异常发生时JVM一般会选择线程终止。throw和throws的区别1throw在方法体内部表示抛出异常由方法体内部的语句处理throw 是具体向外抛出异常的动作所以它抛出的是一个异常实例2throws在方法声明后面表示如果抛出异常由该方法的调用者来进行异常的处理表示出现异常的可能性并不一定会发生这种异常。什么是泛型有什么作用Java的参数化类型被称为泛型允许程序在创建集合时指定集合元素的类型集合自动记住所有集合元素的数据类型从而无须对集合元素进行强制类型转换。泛型的类型必须是类不能是基本数据类型如果要用到基本数据类型使用包装类替换泛型擦除当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时与泛型相关的信息会被擦除掉。比如一个ListString 类型被转换为List则该List对集合元素的类型检查变成了泛型参数的上限即Object。List? super T和List? extends T有什么区别? 是类型通配符List? 可以表示各种泛型List的父类意思是元素类型未知的ListList? super T 用于设定类型通配符的下限此处? 代表一个未知的类型但它必须是T的父类型即可以接受任何T 的父类构成的 ListList? extends T 用于设定类型通配符的上限此处 ? 代表一个未知的类型但它必须是T的子类型即可以接受任何继承自T的类型的List。什么是反射每个类都有一个Class对象包含了与类有关的信息。当编译一个新类时会产生一个同名的 .class文件该文件内容保存着Class对象。类加载相当于 Class对象的加载类在第一次使用时才动态加载到 JVM 中。反射可以提供运行时的类信息并且这个类可以在运行时才加载进来甚至在编译时期该类的 .class不存在也可以加载进来。具体来说程序运行时通过反射机制我们可以通过反射获得任意一个类的Class对象并通过这个对象查看这个类的信息可以通过反射创建任意一个类的实例并访问该实例的成员可以通过反射机制生成一个类的动态代理类或动态代理对象。Java反射在实际项目中有哪些应用场景使用JDBC时如果要创建数据库的连接则需要先通过反射机制加载数据库的驱动程序多数框架都支持注解/XML配置从配置中解析出来的类是字符串需要利用反射机制实例化面向切面编程AOP的实现方案是在程序运行时创建目标对象的代理类这必须由反射机制来实现。continue、break和return的区别是什么continue指跳出当前的这一次循环继续下一次循环。break指跳出整个循环体继续执行循环下面的语句。return用于跳出所在方法结束该方法的运行。final、finally、finalize 的区别final用于声明属性、方法和类分别表示属性不可变、方法不可覆盖、被其修饰的类不可继承finally异常处理语句结构的一部分表示总是执行finallizeObject类的一个方法在垃圾回收时会调用被回收对象的finalize如何实现对象的克隆1实现Cloneable接口并重写Object类中的clone()方法2实现Serializable接口通过对象的序列化和反序列化实现克隆可以实现真正的深克隆。深克隆和浅克隆的区别1浅克隆拷贝对象和原始对象的引用类型引用同一个对象。浅克隆只是复制了对象的引用地址两个对象指向同一个内存地址所以修改其中任意的值另一个值都会随之变化。2深克隆拷贝对象和原始对象的引用类型引用不同对象。深拷贝是将对象和值都复制过来会完全复制整个对象两个对象修改其中任意的值另一个值不会改变。Java中有哪些容器集合Java容器主要包括Collection和MapCollection主要用于存放单一元素 Map主要用于存放键值对。Collection接口又有三个主要的子接口List、Set和Queue。1List是元素有序、可重复的集合主要的实现类有ArrayList、LinkedList、Vector2Set是元素无序、不可重复的集合主要的实现类有HashSetLinkedHashSetTreeSet3Queue是先进先出FIFO的队列存储的元素是有序、可重复的主要的实现类有ArrayQueue、LinkedList、PriorityQueue。Map用于存储key - value对是无序的其中key不能重复主要的实现类有HashMap、TreeMap、Hashtable、ConcurrentHashMap。Java容器集合的主要实现类有哪些ArrayList线程不安全效率高底层使用Object[ ]存储查找快增删较慢随机访问元素的复杂度是O(1)。LinkedList线程不安全底层使用双向链表存储查找慢、增删快随机查找元素的复杂度是O(n)LinkedList的节点除了存储数据还存储了两个指针比ArrayList更占内存。Vector线程安全效率低底层使用Object[ ]存储。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1hoHashSet线程不安全基于哈希表实现不支持有序性操作可以存储nullTreeSet线程不安全基于红黑树实现支持自然排序和定制排序不可以存储nullLinkedHashSet线程不安全是HashSet的子类基于链表和哈希表实现对于频繁的遍历操作其效率大于HashSetArrayDeque基于可变长度的数组和双指针实现不可以存储null。PriorityQueue线程不安全基于二叉堆结构实现底层使用可变长的数组来存储数据可以用它来实现优先队列。HashMap线程不安全、效率高JDK1.7中的HashMap是基于数组链表来实现的它的底层维护一个Entry数组JDK1.8中的HashMap是基于数组链表红黑树来实现的它的底层维护一个Node数组存储的key和value可以是nullTreeMap线程不安全基于红黑树实现按照key-value对中的key对数据进行排序实现排序遍历Hashtable线程安全、效率很低底层采用数组链表实现存储的key和value不能是null。ConcurrentHashMap线程安全JDK1.7的ConcurrentHashMap 底层采用分段的数组链表实现JDK1.8采用的数组链表红黑树。LinkedHashMap作为HashMap的子类底层使用双向链表存储ArrayList实现RandomAccess接口有何作用为何LinkedList没实现这个接口RandomAccess 接口只是一个标志接口标识实现这个接口的类具有随机访问功能。ArrayList底层是数组而LinkedList底层是链表。数组天然支持随机访问时间复杂度为O(1)。链表需要遍历到特定位置才能访问特定位置的元素时间复杂度为 O(n)所以不支持快速随机访问。ArrayList实现了RandomAccess接口就表明了他具有快速随机访问功能。HashSet的实现原理HashSet是基于HashMap实现的HashSet的构造方法中会初始化一个HashMap对象所有放入HashSet中的集合元素实际上由HashMap的key来保存而HashMap的value则存储了一个PRESENT它是一个静态的Object对象。Queue与Deque的区别Queue 是单端队列只能从一端插入元素另一端删除元素实现上一般遵循 先进先出FIFO 规则。Deque 是双端队列在队列的两端均可以插入或删除元素。HashMap的put方法的执行过程1先判断数组是否为空若数组为空则进行第一次扩容2通过hash算法计算键值对在数组中的索引3如果当前位置元素为空则直接插入数据如果当前位置元素非空且key已存在则直接覆盖其value如果当前位置元素非空且key不存在则将数据链到链表末端4若链表长度达到8则将链表转换成红黑树并将数据插入树中5如果数组中元素个数size超过threshold则再次进行扩容操作。HashMap的扩容机制1数组的初始容量为16而容量是以2的次方扩充的。2数组是否需要扩充是通过负载因子判断的如果当前元素个数为数组容量的0.75时就会扩充数组。这个0.75就是默认的负载因子可由构造器传入。3为了解决碰撞数组中的元素是单向链表类型。当链表长度到达一个阈值时7或8先检测当前数组是否到达一个阈值64如果没有到达这个容量先去扩充数组否则会将链表转换成红黑树提高性能。而当链表长度缩小到另一个阈值时6又会将红黑树转换回单向链表提高性能。HashMap为什么线程不安全HashMap在并发执行put操作时可能会导致形成循环链表从而引起死循环。HashMap中的循环链表是如何产生的在多线程的情况下当重新调整HashMap大小的时候就会存在条件竞争因为如果两个线程都发现HashMap需要重新调整大小了它们会同时试着调整大小。在调整大小的过程中存储在链表中的元素的次序会反过来因为移动到新的bucket位置的时候HashMap并不会将元素放在链表的尾部而是放在头部这是为了避免尾部遍历。如果条件竞争发生了那么就会产生死循环了。ConcurrentHashMap的实现原理在jdk 1.7中ConcurrentHashMap是由Segment数据结构和HashEntry数组结构构成采取分段锁来保证安全性。Segment继承了ReentrantLock所以它是一种重入锁HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment 数组一个Segment里包含一个HashEntry数组Segment的结构和HashMap类似是一个数组和链表结构。JDK1.8 的实现已经摒弃了Segment的概念而是直接用 Node数组链表红黑树的数据结构来实现并发控制使用Synchronized 和CAS来操作整个看起来就像是优化过且线程安全的HashMap。ConcurrentHashMap是怎么分段分组的Segment的get操作先经过一次再散列然后使用这个散列值通过散列运算定位到Segment再通过散列算法定位到元素。get操作的高效之处在于整个get过程都不需要加锁除非读到空的值才会加锁重读。当执行put操作时首先判断是否需要扩容然后定位到添加元素的位置将其放入HashEntry数组中。插入过程会进行第一次key的hash来定位Segment的位置如果该Segment还没有初始化即通过CAS操作进行赋值然后进行第二次hash 操作找到相应的HashEntry的位置这里会利用继承过来的锁的特性在将数据插入指定的HashEntry位置时尾插法会通过继承 ReentrantLock的tryLock()方法尝试去获取锁如果获取成功就直接插入相应的位置如果已经有线程获取该Segment的锁那当前线程会以自旋的方式去继续的调用tryLock()方法去获取锁超过指定次数就挂起等待唤醒。HashTable和ConcurrentHashMap的区别HashTable 和 ConcurrentHashMap 相比效率低。Hashtable之所以效率低主要是使用了synchronized关键字对put等操作进行加锁而synchronized关键字加锁是对整张Hash表加锁即每次锁住整张表让线程独占致使效率低下ConcurrentHashMap在对象中保存了一个Segment数组即将整个Hash表划分为多个分段而每个Segment元素即每个分段则类似于一个Hashtable这样在执行put操作时首先根据hash算法定位到元素属于哪个Segment然后对该Segment加锁即可因此ConcurrentHashMap在多线程并发编程中可是实现多线程put操作。HashMap的get方法的执行过程能否判断元素是否在map 中通过key的hash值找到在table数组中的索引处的Entry然后返回该key对应的value即可。不能判断一个key是否包含在map中因为get返回null有可能是不包含该 key也有可能该key对应的value为 null。因为HashMap中允许key为null也允许value为 null。JDK1.8之后为什么HashMap头插法改为尾插法头插法在并发下时可能形成数据环get数据时死循环而在1.8之前因为处理 hash 冲突的方式是用链表存放数据使用头插法可以提升一定效率。但是在 1.8 之后链表长度达到阈值就要考虑升级红黑树了所以哪怕进行尾插遍历次数也会很有限效率影响不大。Iterator迭代器可以遍历并选择序列中的对象并且只能单向移动而开发人员不需要了解该序列的底层结构。iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时它返回序列的第一个元素。之后使用next()获得序列中的下一个元素。Iterator和ListIterator的区别Iterator可用来遍历Set和List集合但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历ListIterator既可以前向也可以后向。ListIterator 实现了Iterator接口并包含其他的功能比如增加元素替换元素获取前一个和后一个元素的索引等等。Java中的IO流数据输入到计算机内存的过程即输入反之输出到外部存储比如数据库文件的过程即输出。按照数据流向可以将流分为输入流和输出流其中输入流只能读取数据、不能写入数据而输出流只能写入数据、不能读取数据。按照数据类型可以将流分为字节流和字符流其中字节流操作的数据单元是8位的字节而字符流操作的数据单元是16位的字符。字符流通常处理文本文件字节流用来处理图片、视频、音频等非文本文件。InputStream字节输入流Reader字符输入流OutputStream字节输出流Writer字符输出流怎么用流打开一个大文件1使用缓冲流。缓冲流内部维护了一个缓冲区通过与缓冲区的交互减少与设备的交互次数。使用缓冲输入流时它每次会读取一批数据将缓冲区填满每次调用读取方法并不是直接从设备取值而是从缓冲区取值当缓冲区为空时它会再一次读取数据将缓冲区填满。使用缓冲输出流时每次调用写入方法并不是直接写入到设备而是写入缓冲区当缓冲区填满时它会自动写入设备。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho2使用NIO。NIO采用内存映射文件的方式来处理输入/输出NIO将文件或文件的一段区域映射到内存中这样就可以像访问内存一样来访问文件了通过这种方式来进行输入/输出比传统的输入/输出要快得多。Java中3种常见IO模型1BIOBIO属于同步阻塞IO模型同步阻塞 IO 模型中应用程序发起 read 调用后会一直阻塞直到内核把数据拷贝到用户空间。2NIONIO主要由ChannelBufferSelector组成。它是支持面向缓冲的基于通道的I/O操作方法。所有的IO在NIO中都从一个Channel开始数据可以从Channel读到Buffer中也可以从Buffer写到Channel中。Buffer本质上是一块可以写入数据然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象并提供了一组方法用来方便的访问该块内存。Selector允许单线程处理多个Channel只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后才会为其服务。3AIO异步 IO 是基于事件和回调机制实现的也就是应用操作之后会直接返回不会堵塞在那里当后台处理完成操作系统会通知相应的线程进行后续的操作。Java的序列化与反序列化序列化机制可以将对象转换成字节序列这些字节序列可以保存在磁盘上也可以在网络中传输并允许程序将这些字节序列再次恢复成原来的对象。其中对象的序列化Serialize是指将一个Java对象写入IO流中对象的反序列化Deserialize则是指从IO流中恢复该Java对象。若对象要支持序列化机制则它的类需要实现Serializable接口该接口是一个标记接口它没有提供任何方法只是标明该类是可以序列化的。若要实现序列化则需要使用对象流ObjectInputStream和ObjectOutputStream。其中在序列化时需要调用ObjectOutputStream对象的writeObject()方法以输出对象序列。在反序列化时需要调用ObjectInputStream对象的readObject()方法将对象序列恢复为对象。Serializable接口为什么需要定义serialVersionUID变量serialVersionUID代表序列化的版本通过定义类的序列化版本在反序列化时只要对象中所存的版本和当前类的版本一致就允许做恢复数据的操作否则将会抛出序列化版本不一致的错误。如果不定义序列化版本在反序列化时可能出现冲突的情况。增加了序列化版本之后在这种情况下则可以抛出异常以提示这种矛盾的存在提高数据的安全性。除了Java自带的序列化之外你还了解哪些序列化工具Json简单直观可读性好有jacksongsonfastjson等解析工具Protobuf用来序列化结构化数据的技术可以用来持久化数据或者序列化成网络传输的数据。更加节省空间以二进制流存储、速度更快、更加灵活。Thrift不仅仅是序列化协议而是一个RPC框架能够满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。Avro提供两种序列化格式即JSON格式或者Binary格式。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

团购网站开发语言零基础电商怎么做

在生成式 AI 重塑搜索生态的背景下,Geo 优化(Geo Optimization)已成为企业构建数字权威、实现精准获客的关键战略。Geo 优化不再是单一的技术操作,而是一套涉及内容、技术、信任和用户体验的综合方法论。本文将对当前 Geo 优化领域…

张小明 2026/1/12 16:48:17 网站建设

塘厦仿做网站物流网站建设工作岗位

PaddleDetection GPU 算力优化:构建高效计算机视觉系统的实战路径 在智能制造工厂的质检线上,一台工业相机每秒捕捉数十帧高清图像,系统必须在毫秒级时间内判断产品是否存在划痕、缺件或装配偏差。传统基于CPU的目标检测方案常常因延迟过高而…

张小明 2026/1/8 18:27:12 网站建设

五大门户网站wordpress 登录失败

写给小公司前端的 UI 规范:简单实用,从零搭建一致性界面 小公司前端团队通常人少事多,没专职设计师,也没精力搞复杂的设计系统。但UI 不一致是最大痛点:按钮五花八门、颜色乱用、间距随意,看起来像拼凑的。…

张小明 2026/1/9 14:37:47 网站建设

网站后台管理系统有哪些asp网站怎么做

PyTorch-CUDA-v2.6镜像运行BERT模型的内存占用优化技巧 在深度学习的实际工程中,一个常见的尴尬场景是:你精心设计好BERT微调流程,信心满满地启动训练脚本,结果几秒后终端弹出 CUDA out of memory 错误——显存炸了。尤其是当你在…

张小明 2026/1/10 8:22:19 网站建设

红安建设局网站网站开发之后如何上传源码

探索 Expect:随机数、库、版本及时间处理 1. 随机数生成 在 Expect 中,有时需要生成随机数,例如在玩像 robohunt 这样的游戏脚本时。不过,Expect 没有内置的随机数生成命令。这背后有其哲学考量,一是已有众多随机数生成的解决方案,二是没有一种随机数生成器(RNG)能满…

张小明 2026/1/9 22:02:51 网站建设

积分交易所网站开发绍兴seo管理

Windows Server 2008 R2安装全攻略 在使用Windows Server 2008 R2中的Active Directory之前,需要在计算机上安装该服务器软件。下面将详细介绍安装过程。 硬件要求 要使Windows Server 2008 R2正常运行,硬件必须满足一定要求。该系统需要64位处理器,微软已停止发布32位的…

张小明 2026/1/9 18:13:20 网站建设