java复习04

29.启动一个线程是用 run()还是 start()? .

30. 线程的基本概念、线程的基本状态以及状态之间的关系

31.简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

32.设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写
出程序。
33.ArrayList 和 LinkedList 的区别
34.HashMap 和 Hashtable 的区别
35.List, Set, Map 是否继承自 Collection 接口?
36.List、Map、Set 三个接口,存取元素时,各有什么特点?
37.去掉一个 List 集合中重复的元素
38.Collection 和 Collections 的区别。
39.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是
equals()? 它们有何区别?
40.两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对
不对?
41.java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出
他们分别是哪些类?
42.什么是 java 序列化,如何实现 java 序列化?

29.启动一个线程是用 run()还是 start()? .

启动一个线程是调用 start() 方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码, run() 方法 ,是该线程所关联的执行代码。

30. 线程的基本概念、线程的基本状态以及状态之间的关系
Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态
线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。 Java 线程

31.简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
主要相同点: Lock 能完成 synchronized 所实现的所有功能
主要不同点: Lock 有比 synchronized 更精确的线程语义和更好的性能。 synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,
并且必须在 finally 从句中释放。 Lock 还有更强大的功能,例如,它的 tryLock 方法可以非阻塞方式去拿锁。

32.设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写
出程序。
public static void main(String[] args) {
ThreadTest aa = new ThreadTest();
Inc inc = aa.new Inc();
Dec dec = aa.new Dec();

Thread a1 = new Thread(inc);
Thread a2 = new Thread(dec);
Thread a3 = new Thread(inc);
Thread a4 = new Thread(dec);
a1.start();
a2.start();
a3.start();
a4.start();
}

private synchronized void inc() {
j++;
System.out.println(Thread.currentThread().getName()+"inc:"+j);
}

private synchronized void dec() {
j--;
System.out.println(Thread.currentThread().getName()+"dec:"+j);
}

class Inc implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
inc();

}
}
}

class Dec extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
dec();

}
}
}

33.ArrayList 和 LinkedList 的区别
首先,从名字就可以看出,ArrayList和LinkedList的区别,ArrayList是基于数组的,LinkedList是基于链表的。 从这一点,我们可以推理出来,ArrayList适合查询,LinkedList适合插入,但是这只是一个广泛的结论,我们应该了解的更细致一点。
集合
集合与集合之间的区别:List,set,Map
集合之类之间的区别:数据结构
        ArrayList与Linkedlist区别
        hashSet与treeset的区别
       sashmap与hashtable的区别
某集合之类的特点
      如何对set集合/List集合去重
      set.add(new person("zs"));

      set.add(new person("zs"));


34.HashMap 和 Hashtable 的区别
HashMap Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key)
由于非线程安全,在只有一个线程访问的情况下,效率要高于 Hashtable
HashMap 允许将 null 作为一个 entry key 或者 value ,而 Hashtable 不允许。
HashMap Hashtable contains 方法去掉了,改成 containsvalue containsKey 。因为 contains 方法容易让人引起误解。
Hashtable 继承自 Dictionary 类,而 HashMap Java1.2 引进的 Map interface 的一个实现。
最大的不同是, Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,
HashMap 就必须为之提供外同步。
Hashtable HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。就 HashMap 与 HashTable 主要从三方面来说。
. 历史原因 :Hashtable 是基于陈旧的 Dictionary 类的, HashMap Java 1.2 引进的 Map 接口的一个实现
. 同步性 :Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的,不是同步的
. 值:只有 HashMap 可以让你将空值作为一个表的条目的 key value

35.List, Set, Map 是否继承自 Collection 接口?
List Set 是, Map 不是

36.List、Map、Set 三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。 Set 无法拥有重复元素 , 内部排序。 Map 保存 key-value 值, value 可多值。
HashSet 按照 hashcode 值的某种运算方式进行存储,而不是直接按 hashCode 值的大小进行存储。例如, "abc" ---> 78 "def" ---> 62 "xyz"
---> 65 hashSet 中的存储顺序不是 62,65,78 LinkedHashSet 按插入的顺序存储,那被存储对象的 hashcode 方法还有什么作用呢?学
员想想 !hashset 集合比较两个对象是否相等,首先看 hashcode 方法是否相等,然后看 equals 方法是否相等。 new 两个 Student 插入到
HashSet 中,看 HashSet size ,实现 hashcode equals 方法后再看 size
同一个对象可以在 Vector 中加入多次。往集合里面加元素,相当于集合里用一根绳子连接到了目标对象。往 HashSet 中却加不了多次
的。

37.去掉一个 List 集合中重复的元素

循环list中的所有元素然后删除重复 总结: 两层循环,外层循环从第一个元素向最后一个元素循环,内层循环是从最后一个元素向外层循环元素的当前元素循环。比较两个元素是否相等,如果相等,移除靠后的元素来进行去重。这种方法时间复杂度大于O(n),小于O(N²) 通过HashSet剔除重复元素 总结: 此种方式是利用了Set的特性:元素不可重复,其底层原理是先计算每个对象的hash值,再比较元素值是否相同,如果相同,则保留最新的。


38.Collection 和 Collections 的区别。
Collection 是集合类的上级接口,继承与他的接口主要有 Set List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

39.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是
equals()? 它们有何区别?
Set 里的元素是不能重复的,元素重复与否是使用 equals() 方法进行判断的。
equals() == 方法决定引用值是否指向同一对象 equals() 在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对
不对?
对。
如果对象要保存在 HashSet HashMap 中,它们的 equals 相等,那么,它们的 hashcode 值就必须相等。
如果不是要保存在 HashSet HashMap ,则与 hashcode 没有什么关系了,这时候 hashcode 不等是可以的,例如 arrayList 存储的对象就
不用实现 hashcode ,当然,我们没有理由不实现,通常都会去实现的

41.java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出
他们分别是哪些类?
字节流,字符流。字节流继承于 InputStream OutputStream ,字符流继承于 Reader Writer 。在 java.io 包中还有许多其他的流,主要 是为了提高性能和使用方便。
IO流
     输入流
            字节输入流:InputStream
            字符输出流: Reader
       输出流
              字节输入流:OutputStream
                字符输出流:Writer
                字节流是操作二进制的文件的
                字符流是操作字符的
                如何读写文件,比如从c盘读到d盘

42.什么是 java 序列化,如何实现 java 序列化?
我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java 对象,例如,要将 java 对象存储到硬盘或者
传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了
这种支持,我们可以调用 OutputStream writeObject 方法来做,如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,
这样, javac 编译时就会进行特殊处理,编译的类才可以被 writeObject 方法操作,这就是所谓的序列化。需要被序列化的类必须实现
Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法, implements Serializable 只是为了标注该对象是可被序列化的。
例如,在 web 开发中,如果对象被保存在了 Session 中,
tomcat 在重启时要把 Session 对象序列化到硬盘,这个对象就必须实现 Serializable
接口。如果对象要经过分布式系统进行网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现
Serializable 接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值