您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

javaAPI解读

时间:2019-08-19 17:36:47  来源:  作者:

javaAPI解读

01、Object常用的方法


Object常用的方法有clone、equals、hashCode、notify、notifyAll、

toString、wait、finalize。

02、String与StringBuffer区别


String与StringBuffer在JAVA中都是用来进行字符串操作的。String是一个很特别的类,它被final修饰,意味着String类不能被继承使用,一旦声明是一个不可变的类。

StringBuffer是一个长度可变的,通过追加的方式扩充,并且是线程安全;尤其在迭代循环中对字符串的操作,性能一般优于String。但线程安全意味着开销加大,性能下降,所以在线程安全的情况下一般用StringBuilder来代替StringBuffer使用,StringBuilder的速度要优于StringBuffer。

 

03、Vector、ArrayList、LinkedList的区别


1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2、Vector线程同步,ArrayList、LinkedList线程不同步;后两者一般用在线程安全的地方,也可以通过Collections.synchronizedList(……);实现线程同步。

3、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。

4、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。

5、LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等,多与一些线程池一起使用.

 补充:以上都实现了序列化接口,这点在对象远程传输时很重要;而Vector,ArrayList实现了AccessRandom接口,这是一个标记接口,此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

 注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

04、HashTable、HashMap区别


1、HashTable线程同步,key,value值均不允许为空;HashMap非线程同步,key,value均可为空,HashTable因为线程安全的额外开销会造成性能下降,而HashMap由于线程不安全,在多线程的情况下,一般要加锁,或者使用Collections.synchronizedMap()来创建线程安全的对象。

2、HashTable继承的父类是Dictionary,而HashMap继承的父类是AbstractMap,而且又都实现了Map接口,所以Map接口中提供的方法,他们都可以使用;HashTable的遍历是通过Enumeration,而HashMap通常使用Iterator实现。

3、HashTable有一个contains(Object value)的方法,其功能和HashMap的containsValue(Object value)一样,而HashMap提供的更加细致还有一个取Key值的方法为containsKey(Object key)。

4、哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

 

javaAPI解读

 

 

 

05、Equals()和HashCode()作用


这两个方法都是Object类的方法,equals通过用来判断两个对象是否相等。HashCode就是一个散列码,用来在散列存储结构中确定对象的存储地址。HashMap,HashSet,他们在将对象存储时,需要确定它们的地址,而HashCode就是做这个用的。在默认情况下,由Object类定义的hashCode方法会针对不同的对象返回不同的整数,这一般是通过将该对象的内部地址转换成一个整数来实现的。

在java中equals和hashCode之间有一种契约关系:

1. 如果两个对象相等的话,它们的hashcode必须相等。

2. 但如果两个对象的hashcode相等的话,这两个对象不一定相等。

由于java.lang.Object的规范,如果两个对象根据equals()方法是相等的,那么这两个对象中的每一个对象调用hashCode方法都必须生成相同的整数结果。(下面作为解释内容可以不必回答,理解使用)

举例说,在HashSet中,通过被存入对象的hashCode()来确定对象在HashSet中的存储地址,通过equals()来确定存入的对象是否重复,hashCode()和equals()都需要重新定义,因为hashCode()默认是由对象在内存中的存储地址计算返回一个整数得到,而equals()默认是比较对象的引用,如果不同时重写他们的话,那么同一个类产生的两个完全相同的对象就都可以存入Set,因为他们是通过equals()来确定的,这就是HashSet失去了意义。面试时简单的说,HashSet的存储是先比较HashCode,如果HashCode相同再比较equals,这样做的目的是提交储存效率。所以换句方式问,如果用对象来做为Key值的话,要满足什么条件呢?答要重写equals和HashCode方法。

06、Sleep()和Wait()区别


1、wait()是Object类的方法,在每个类中都可以被调用;而sleep()是线程类Thread中的一个静态方法,无论New成多少对象,它都属于调用的类的。

2、sleep方法在同步对象中调用时,会持有对象锁,其它线程必须等待其执行结束,如果时间不到只能调用interrupt()强行打断;在sleep时间结束后重新参与cpu时间抢夺,不一定会立刻被执行。

3、wait()方法在同步中调用时,会让出对象锁。通常与notify,notifyAll一起使用。

 

07、IO与NIO的区别


IO是早期的输入输出流,而NIO全名是New IO在IO的基础上新增了许多新的特性。提供的新特性包括:非阻塞I/O,字符转换,缓冲以及通道。

1、IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。

2、Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。虽然是非阻塞的,但也会遇到一个问题就是服务器对最大连接的支持,但在线用户连接数大于系统支持数时,NIO的默认实现是并不管是否还有足够的可用连接数,而是直接打开连接。在netty框架中经常会看到一个open too many files异常就是由此引起的,所以要灵活使用,合适配置。

3、Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

08、Final、Finally、Finalize的区别


Final是Java中一个特别的关键字(修饰符),final修饰的类不能被继承,final修饰的变量不能被修改(是常量),final修饰的方法不能被重写,所以使用final要考虑清楚使用场景。

Finally是Java异常处理try{}catch(..){}finally{}中的一部分,finally语句块中的语句一定会被执行到(Down机除外),通常用于进行资源的关闭操作,如数据连接关闭等。

Finalize是Object类中的一个方法,finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的,设计的初终是可以进行一些资源的关闭,但这个方法很少被重写,因为垃圾回收器执行时并不一定会调用,比如抛异常时,而且垃圾回收本身就是随意的,不可控制的。

09、OverLoad与Override的区别


overload和override是多态的两种表现形式;overload重载规则是同名不同参,方法名相同,参数类型、个数、顺序至少有一个不相同(与返回值、参数名、抛出的异常都没有关系);

overload可以发生在父类、同类、子类中。override重写的规则是方法名、参数、返回值相同,发生在父子类之间,而且子类不能抛出比父类更多的异常,被重写的方法一定不能定义成final。

10、Collection与Collections的区别


Collection是一个集合的超级接口,它定义了一些集合常用的操作方法,如add,size,remove,clear等,我们经常用到的List(可重复集合),Set(不可重复集合)接口就是它的子接口。

Collections此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都将抛出NullPointerException。常用到的方法如copy,sort,reverse,replaceall等。

11、Synchronized和Lock区别和用法


首先他们都是用来实现线程的同步操作的,synchronized是jdk1.2以来一直存在,而且Lock是jdk1.5的新增;具体区别如下:

1、Lock是JDK1.5才出现的,而在jdk1.5及之前的synchronized存在很大的性能问题,尤其在资源竞争激烈的条件下,性能下降十多倍,而此时的Lock还基本能维持常态。(synchronized在jdk1.5后的版本,作了很大的性能优化)

2、使用synchronized时对象一定会被阻塞,其它线程必须等待锁释放后才能执行,在高并发的情况下,很容易降低性能,而且控制不当还容易造成死锁,所以要合适的利用Synchronized,并且尽可能的精确到最小的业务逻辑块。而Lock提供了更细致的操作,其常用的实现类有读写锁,这里以ReentrantLock 为例,它拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定时锁等候和中断锁等候等很多详细的方法操作。 ReentrantLock获取锁定与三种方式:a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;c)tryLock(long timeout,TimeUnit unit),如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断。

3、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中。

 



Tags:java API   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
soul网关发布2.1.0版本 (做Java界最好的API-Gateway) 这是soul网关开源以来的最大的一次更新,收集了很多社区反馈的问题,进行了更新. 之前的文档不是很完善,使用成本较高,这里先...【详细内容】
2019-12-27  Tags: java API  点击:(124)  评论:(0)  加入收藏
我们通过为自行车商店构建示例应用程序来学习如何使用 JPA。-- Stephon Brown(作者) 对应用开发者来说, Java 持久化 API(Java Persistence API)(JPA)是一项重要的 java 功能,需...【详细内容】
2019-12-27  Tags: java API  点击:(75)  评论:(0)  加入收藏
关闭HDFS的权限检查设置完成重启HDFS集群查看文件 编辑后的文件 启动HDFS集群 创建maven项目,配置pom文件(核心配置代码) 1、 创建一个目录创建运行类,编写测试方法我们在集群中...【详细内容】
2019-09-11  Tags: java API  点击:(191)  评论:(0)  加入收藏
时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。 UTC(Universal Time Coordinated):统...【详细内容】
2019-08-26  Tags: java API  点击:(222)  评论:(0)  加入收藏
01、Object常用的方法Object常用的方法有clone、equals、hashCode、notify、notifyAll、toString、wait、finalize。02、String与StringBuffer区别String与StringBuffer在...【详细内容】
2019-08-19  Tags: java API  点击:(214)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条