作用:遍历集合
方法:.hasNext() next() remove() ⑧集合排序 Collection.sort()
多线程问题:
①线程和进程的区别与联系: [久雅科技有限公司] 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。 不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间 每个线程都拥有单独的栈内存用来存储本地数据
②sleep() 、yield() 和 wait() 有什么区别?
1.wait()方法是Object的方法,sleep()是Thread的方法 2.wait()方法必须写在synchronized里面
3.wait()方法在等待的时候会释放对象锁,sleep()睡过去也抱着对象锁不放!(重要) 4.yield()让当前正在执行的线程暂停,该方法不会阻塞线程,而是将线程转入可运行状态
③java中如何编写一个线程类,并启动他?
继承Java.lang.Thread类,并重写run() 方法,调用该对象的start()方法启动线程
实现Java.lang.Runnable接口,并实现run() 方法,将该对象实例作为Thread构造的参数再调用start()方法,使用了代理模式。
④如何实现线程之间的通信?
Java提供了3个方法解决线程之间的通信问题
wait() : 表示线程一直等待,并释放对象锁,直到其它线程通知再找回对象锁 notify() : (唤醒一个同一个对象上处于等待状态的线程) 唤醒在此对象监视器上等待的单个线程。['n??t?fa?
notifyAll():唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行 唤醒在此对象监视器上等待的所有线程。[
⑤多线程的状态[电话面试]
新建状态(就绪)->可执行状态(运行)->阻塞(可能)->死亡状态
⑥什么是线程安全,如何实现线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。 编写线程安全的代码是低依靠线程同步
⑦☆启动一个线程是用run()还是用start()? ①什么时候使用Thread,什么时候使用Runable
②启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
⑧如何避免死锁 1、在程序中尽量使用开放调用(方法本身没有加锁,对方法操作的内容进行加锁)
2、注意锁的顺序:尽量减少潜在锁之间的交互数量,遵守并文档化该锁顺序协议 3、尝试定时的锁,来替代使用内部锁机制
26、同步和异步有何异同,在什么情况下分别使用他们?
同步就是当一个线程运行时其他线程不能访问该线程中锁定的对象,为保障数据完整而使用的方法,
而异步可以多个线程同时使用一个对象 如果数据将在线程间共享。例如正在写的数据可能被另一个
线程读到,或 者正在读的数据可能已经被另一个线程写过了,那么这些数据 就是共享数据,必须进行同步。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,
就应该使用异步编程,在采用异步往往更有效率。
☆27、java的网络编程有哪两种,他们之间有什么区别? **简述Socket
TCP协议:传输控制协议,提供可靠无差错的数据传输,资源消耗较大,性能和效率较低 UDP协议:用户数据报协议,不可靠的数据传输,资源消耗小,性能和效率较高
28、描述一下JVM加载class文件的原理机制?
JVM中类的加载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
29、描述下类实例化的详细过程(顺序)?
1. 父类静态成员和静态代码块,按在代码中出现的顺序依次执行 2. 子类静态成员和静态代码块,按在代码中出现的顺序依次执行 3.父类实例成员 4.父类构造方法 5.子类实例成员 6.子类构造方法
其中1.2是在类加载的时候执行
30、请描述Object中有哪些方法及其作用?
clone() 创建并返回此对象的一个副本。 equals(Object obj) 指示其他某个对象是否与此对象“相等” finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 getClass() 返回此 Object 的运行时类。 hashCode() 返回该对象的哈希码值。 notify() 唤醒在此对象监视器上等待的单个线程。['n??t?fa?] notifyAll() 唤醒在此对象监视器上等待的所有线程。 toString() 返回该对象的字符串表示。 wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
wait(long timeout) 在其他线程调用此对象的notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,
或者已超过指定实际时间量前,导致当前线程等待。 nanometer ['ne?n?mi:t?] n.[计量]毫微秒
☆String的方法?[德邦 中国电信理想]
a.equals():字符串是否相等(区分大小写) f.trim():去字符串左右两边的空格 g.concat():连接字符串
h.indexOf():查找字符串所在位置
i.lastIndexof():查找字符串最后一次出现的位置
j.subString(int startIndex,int endIndex):截取字符串,第一个参数从0数,第二个参数从1数 k.split(\根据什么拆\:拆分字符串
String是否可以继承?[笔试题] final类,不能修改 jvm
**32.JVM的内存结构?(高级)
方法区 堆 虚拟机栈 本地方法栈 程序计算器
jvm性能优化? 1.内存微调优化 2.锁争夺微调: 多线程 不变性 单写原则 Actor Disrupotor
3.CPU使用率微调 4.I/O 微调
Java 平台与内存管理
解释内存中的栈(stack)、堆(heap)和静态存储区的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。
String str = new String(“hello”);
上面的语句中 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。
33. 什么时候用assert? Assert有什么作用?
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,
那么系统会报告一个 Assertionerror。它用于调试目的