JavaSE知识点总结(个人整理) 联系客服

发布时间 : 星期五 文章JavaSE知识点总结(个人整理)更新完毕开始阅读a5207134534de518964bcf84b9d528ea80c72f81

第二部分 知识点

26. 说明Java中String str=null与String str=\的区别?

String str = null 表示声明了一个String对象的引用str,但是没有为其分配内存空间。 String str = \表示创建了一个长度等于0的空字符串,并在内存中为其分配了内存空间。

String str = new String(\在内存中有两个对象,1.堆内存有一个 new Sting 2.常量池中有一个字符串。

27. 使用运算符\和方法equals() 进行比较对象的区别?

使用\算符比较基本数据类型时,比较的是值相等;使用\算符比较对象时,比较的是内存地址值

使用equals()方法 比较对象时,比较的是对象的内容,与地址无关,如果没有重写equals()方法就直接调用的是Object的equals()方法。 28. 接口和抽象类有何区别? (1)成员特点:

构造方法:接口没有构造方法;抽象类有构造方法。

成员变量:接口中只有常量;抽象类中可以是常量,也可以是变量。 成员方法:接口中只有抽象方法;抽象类中既有抽象方法,也有非抽象方法。 (2)关系特点:

类与类:类与类之间只有单继承,可以有多层继承。

类与接口:类与接口之间是实现关系,可以单实现,也可以多实现。 接口与接口:接口与接口之间是继承关系,可以单继承,也可以多继承。 (3)设计理念:

接口对应的设计模式是简单工厂设计模式,抽象类对象的设计模式是模板设计模式。 (5)必须实现抽象类或接口的所有抽象方法才可以实例化。

黑马程序员入学面试题

32. 不借用第三方变量,互换两个变量。 n=n^m;

m=n^m;//(n^m)^m一个数异或另一个数两次,还是得原来那个数 n=n^m//n^(n^m)

33. 传统for和增强for有什么区别呢?

1. 增强for对集合进行遍历,集合不能为空。只能获取集合元素,但是不能对集合进行操作。增强for有一个局限性,必须要有被遍历的目标。 2. 迭代器除了遍历,还可以进行remove集合中元素的动作。 如果是用ListIterator,还可以在遍历过程中进行增删改查的动作。

建议在遍历数组的时候,还是希望是用传统for。因为传统for可以定义角标。 1.增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。

2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。 34. Collection和Colections的区别是什么?

Collection是一个单列集合的顶层接口,它是List、Set、Queue等接口的父接口。在这个接口中,定义了集合类中通用的方法。

Collections是针对集合操作的工具类,有对集合进行排序和二分查找等静态方法。

37. 线程的状态: 线程的五种状态:

1)新建(new) 用new语句创建的线程对处于新建状态,此时它和其它Java对象一样,仅仅在Heap中被分配了内存。当一个线程处于新建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。 Thread t = new Thread(new Runner());

2)就绪(Runnable) 程序通过线程对象调用启动方法start()后,系统会为这个线程分配它运行时所需的除处理器之外的所有系统资源。这时,它处在随时可以运行的状态,在随后的任意时刻,只要它获得处理器即会进入运行状态。 t.start()

3)运行(Running) 处于这个状态的线程占用CPU,执行程序代码。在并发环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。如果计算机中有多

个CPU,那么同一时刻可以让几个线程占用不同的CPU,使它们都处于运行状态,只有处于就绪状态的线程才有机会转到运行状态。

4)阻塞(Blocked) 阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。 阻塞状态可分为以下3种:

位于对象等待池中的阻塞状态(Blocked in object's wait pool):当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中。 位于对象锁池中的阻塞状态(Blocked in object's lock pool):当线程处于运行状态,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中。

其他阻塞状态(Otherwise Blocked):当前线程执行了sleep()方法,或者调用了其他线程的join()方法,或者发出了I/O请求时,就会进入这个状态。当一个线程执行

System.out.println()或者System.in.read()方法时是,就会发出一个I/O请求,该线程放弃CPU,进入阻塞状态,直到I/O处理完毕,该线程才会恢复执行。

5)死亡(Dead) 当线程退出run()方法时,就进入死亡状态,该线程结束生命周期。线程有可能是正常执行完run()方法而退出,也有可能是遇到异常而退出。不管线程是正常结束还是异常结束,都不会对其他线程造成影响。 40. 集合

集合名称阅读技巧:

JDK1.2出现的集合框架中常用的子类对象 前缀名是结构名,后缀名是体系名。

ArrayList:数组结构,看到Array就知道查询速度快,看到List就知道可以又重复元素,可以增删改查

LinkedList:链表结构,增删快

HashSet:哈希结构,查询速度更快,不保证有序,不可以重复,必须覆盖hashCode和equals方法

LinkedHashSet:链表加哈希结构,可以实现有序

TreeSet:二叉树结构,可以排序。有两种方法:1.自然排序compable,2.比较器 comparator Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相

等。只有当输入参数也是一个comparator并且和当前comparator的排序结果是相同的时候,这个方法才返回true.

ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素. 但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,

Vector由于使用了synchronized 方法(线程安全),通常性能上较ArrayList 差,Vector属于遗留容器,现在已经不推荐使用,

LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,其实对内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

由于ArrayList和LinkedListed都是非线程安全的,如果需要多个线程操作同一个容器,可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这其实是装潢模式最好的例子,将已有对象传入另一个类的构造器中创建新的对象来增加新功能)。 Map集合

Map(k,v) k:此映射所维护的键的类型 v:映射值的类型

Map集合:双例集合,一次存一对,称为键值对。要保证键的唯一性。

Map集合没有迭代器,必须先将map集合转成set集合,在使用迭代器,就可以取出结合中的元素;或者使用map集合特有的entrySet方法,也可以取出map集合中虽有元素。 Map集合常见子类:

1.HashTable:底层数据结构是哈希表结构,线程同步的,不允许null键,null值; 2.HashMap:哈希表结构,不同步,允许null键,null值

3.TreeMap:二叉树结构,不同步,可以对map集合众多键进行排序。

41. 为什么需要配置path,什么时候需要

答:path路径:是操作系统的环境变量,目的是希望在任意目录下都能执行该命令操作起来更加方便快捷;

classpath是给类提供路径:想在其他目录下执行java程序时需要配置classpath路径。 42. IO流

输入流:InputStream 输出流:OutputStream

字节输入流:FileInputStream 字节输出流:FileOutoutStream

字节输入流缓冲区:BufferedInputStream 字节输出流缓冲区:BufferedOutputStream 转换流:InputStreamReader 字符输出流:OutputStreamWriter