java面试题下载,java面试笔试题及答案
如何解决写爬虫IP受阻的问题?立即使用。
如何用数组实现队列?
使用数组实现队列时要注意溢出现象。这时候我们可以通过循环数组,也就是结束数组来解决问题。使用前指针指向队列中的第一个位置,使用尾指针指向队列中的最后一个位置。(推荐学习:java常见问题)
内部类访问局部变量的时候,为什么变量必须加上final修饰?
因为生命周期不一样。方法结束后局部变量会被销毁,但内部类对象不一定,这会导致内部类引用一个不存在的变量。
所以编译器会在内部类中生成局部变量的副本,而这个副本的生命周期和内部类对象的生命周期是一样的,所以不会出现上述问题。
但这就导致了一个变量被修改,两个变量的值可能不一样的问题。为了解决这个问题,编译器要求局部变量需要被final修改,以确保两个变量的值相同。
JDK8以后,编译器不要求内部类访问的局部变量必须用final修饰,但是局部变量值不能修改(无论是在方法中还是内部类中),否则会报错编译。查看用javap编译的字节码,我们可以看到编译器添加了final。
long s = 499999999 * 499999999 在上面的代码中,s的值是多少?
根据代码的计算结果,s的值应该是-1371654655。这是因为Java中对右值的计算默认是int类型的。
非静态内部类能定义静态方法吗?
公共类OuterClass{
私有静态浮动f=1.0f
类内部类{
public static float func(){ return f;}
}
}上面的代码会有编译错误,因为只有静态内部类才能定义静态方法。
Lock 和 Synchronized 有什么区别?
1.使用方法的不同
-**同步* *:将此控件添加到需要同步的对象。“Synchronized”可以添加到方法或特定代码块中。括号表示需要锁定的对象。
-**锁定* *:需要显示指定的起始位置和结束位置。通常,“reentrantlock”类被用作锁,并且必须在多个线程中将一个“reentrantlock”类用作对象,以确保锁生效。并且锁定点和解锁点需要用lock()和unlock()来表示。因此,通常在finally 块中写入unlock()以防止死锁。
2.性能差异
Synchronized由JVM管理执行,而‘lock’是java编写的控制锁的代码。在Java1.5中,“同步”是低效的。因为这是一个重量级的操作,所以需要调用操作接口,这就有可能锁定比锁定以外的操作消耗更多的系统时间。与Java提供的锁对象相比,性能更高。但是有了Java1.6,事情就变了。` synchronize语义清晰,可以通过多种方式进行优化,包括自适应旋转、锁消除、锁粗化、轻量级锁、偏置锁等等。因此,synchronize’在Java1.6上的性能并不比Lock差。
-**Synchronized**:采用CPU悲观锁机制,即线程获得独占锁。独占锁意味着* *其他线程只能依靠阻塞来等待线程释放锁* *。但是,当CPU转换线程被阻塞时,会引起线程上下文切换。当有多个线程争夺锁时,会造成CPU频繁的上下文切换,导致效率低下。
-**锁定* *:这是乐观的锁定方式。所谓乐观锁,就是* *每次不加锁的时候,都假设没有冲突来完成一个操作,如果因为冲突而失败,就再尝试一次,直到成功* *。乐观锁定实现的机制是“CAS”操作。我们可以进一步研究ReentrantLock 的源代码,我们会发现获取锁的一个比较重要的方法是compareAndSetState 。其实这是调用CPU提供的特殊指令。
3.`重入锁`:具有更好的可扩展性:如时间锁等待、可中断锁等待、无块结构锁、多条件变量或锁表决。float 变量如何与 0 比较?
叶酸型和双型。这些小数类型在逼近0时不太可能直接等于0,一般都是无限接近0,所以不能用==来判断。应该用x-0err来判断,其中x-0代表绝对值,err代表有限误差。
//用程序来表示。
Fabs(x) 0.00001f如何创建新的非静态内
内部类必须是外部类。声明时的内部a,就像int a一样,至于静态内部类和非静态内部类new,有一点区别:
Outer.inner a=newouter()。newinner()(非静态,在创建新的内部类之前可以有一个外部对象)
外部。内部a=新的外部。Inner()(静态内部类)
Java标识符命名规则
可以包含:字母、数字、$、_(下划线),不能以数字开头,不能是Java关键字和保留字。
你知道哪些JDK中用到的设计模式?
装饰模式:java.io
单例模式:运行时类
工厂方法模式:Integer.valueOf方法
Metamode:字符串常量池,Integer.valueOf(int i),Character.valueOf(char c)
迭代器模式:迭代器
责任链模型:类装入器的父委托模型
解释器模式:正则表达式java.util.regex.Pattern
ConcurrentHashMap如何保证线程安全
JDK 1.7及之前版本:
ConcurrentHashMap允许多个修改操作并发进行,关键在于锁分离技术的使用。它使用多个锁来控制哈希表不同部分的修改。ConcurrentHashMap在内部使用段来表示这些不同的部分。每个段实际上是一个有自己锁的小散列表。只要多个修改操作发生在不同的段中,它们就可以并发执行。
JDK 1.8:
Segment是保留的,但是为了与旧版本兼容,对其属性进行了简化。
插入时使用CAS算法:unsafe.compareandswapint (this,valueoffset,expect,update)。CAS(Compare And Swap)是指如果valueOffset位置包含的值与expect值相同,则更新valueOffset位置的值以更新并返回true否则,它将不会被更新并返回false。插入时不允许空键或值。
和Java8的HashMap有相通之处,底层还是用“数组”红黑树链接;
基础结构存储TreeBin对象,而不是TreeNode对象;
作为CAS的知名无锁算法,ConcurrentHashMap是否不使用锁?当然,当哈希值与链表的头节点相同时,会被同步锁定,链表被链接。
Thread.sleep() Thread.yield()Thread.wait()的区别
sleep()和yield()都会释放CPU。
Sleep()可以给低优先级的线程一个执行的机会,当然也可以给同样优先级和高优先级的线程一个执行的机会;Yield()只能给具有相同优先级的线程一个执行的机会。
Thread.sleep和Thread.yield()不会导致锁行为改变。如果当前线程拥有锁,那么Thread.sleep不会让线程释放锁。如果能帮助记忆,可以简单的认为锁相关的方法都是在Object类中定义的,所以调用Thread.sleep不会影响锁的相关行为。
Thread.sleep和Object.wait都会挂起当前线程。对于CPU资源来说,无论线程以哪种方式挂起,都意味着暂时不再需要CPU的执行时间。操作系统会将执行时间分配给其他线程。区别在于调用wait后,其他线程需要执行notify/notifyAll来重新获得CPU执行时间。
arraylist 和 linkedlist 的区别?
ArrayList和LinkedList都实现了List接口,但是它们之间有一些区别。
(1)ArrayList是Array支持的基于索引的数据结构,所以提供了对元素的随机访问。
(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素的速度更快。
(3)LinkedList比ArrayList消耗更多内存,因为LinkedList中的每个节点都存储了前后节点的引号。以上是java常见面试问题(包括答案)的详细介绍。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。