黑马面试题
1:定义map集合,并自定义对象,对map集合遍历,打出key和value值
2:定义一个类A,类中定义一个show方法,打印一句话,在定义一个TestA类,利用反射在
TestA中创建A的对象,并调用show方法
3:使用高效字符缓冲流复制文件
4:把C盘中的一个多层文件夹拷贝到D盘中。用高效的方法(要求写思路,注释,代码)
5:Integer泛型Map中存储字符串
6:开启两个线程每隔一段时间分别向一个共享数组中添加元素,每个线程添加3个即可。
7:如何用反射去创建一个对象,有2种方式,尽量用代码去体现
8:编写一个程序,把这个目录里边的所有的带.java文件都拷贝到另一个目录里边,拷贝成功以后,把后缀名是.java改成.txt
9:创建多线程的方式有几种?尽量用代码去体现
10:编写程序,生成5个1至10之间的随机整数,存入一个List集合,编写方法对List集合进行排序(自定义排序算法,禁用Collections.sort方法和TreeSet),然后遍历集合输出
11:23 9 -4 18 100 7" 要求对这串数字按照从小到大排序,生成一个数值有序的字符串。
12:编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象,并调用该对象中的方法。
13:编写一个类A,增加一个实力方法showString,用于打印一条字符串,在编写一个类TestA ,作为客户端,用键盘输入一个字符串,改字符串就是类A的全名,使用反射机制创建该类的对象,并调用该对象中的方法showString
14:写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法,用for循环创建5个线程对象。需求如下:
①利用线程类的构造函数输出:"创建线程4"。
(备注:当创建一个线程的时候,标记为1,再次创建一个线程的时候,标记为2,所以输出的"创建线程4"就是创建的第四个线程)
②在run方法中输出:“线程X :计数Y”,当执行次数达到6次的时候,退出。
(备注:其中“线程X”为第X个线程,“计数Y”为该线程的run方法执行了多少次)
15: 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
16:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),
如果能被整除,则表明此数不是素数,反之是素数。
17:递归删除多级文件
18:一道ArrayList集合创建添加元素并删除abc
24:取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
19:有类似这样的字符串:“1.2,3.4,5.6,7.8,5.56,44.55”,请按照要求,依次完成以下试题①以逗号作为分隔符,把已知的字符串分成一个String类型的数组,
数组中的每一个元素类似于“1.2","3.4"这样的字符串;
②把数组中的每一个元素以.作为分割,把.号左边的元素作为key,
把.号右边的元素作为value,封装到Map中,map中的key和value都是Object类型;
③把map中的key封装到Set中,并且把set中的元素输出;
④把map中的value封装到Collection中,把collection中的元素输出。
----------------------------------考察知识篇--------------------------------
2:集合框架的概述、arraylist的特点、map集合的特点、Collection集合下班有哪些类,
哪些类又有哪些特点、HashMap是Hashtable的区别?
Collection:
|--List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
|--ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
|--LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
|--Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。
|--Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。
|--HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
|--LinkedHashSet:有序,hashset的子类。
|--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。如果为true,那么视为相同元素,不存。如果为false,那么存储。
先hashCode,再equals,从而提高对象比较的速度。
对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。
对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals 方法。
TreeSet集合排序有两种方式,Comparable和Comparator区别:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare 方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
第二种方式较为灵活。
Map:
|--Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
|--HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
|--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
想要获取map中的所有元素:
原理:
map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,
可以使用迭代器了。之所以转成set,是因为map集合具备着键的唯一性,
其实set集合就来自于map,set集合底层其实用的就是map的方法。
把map集合转成set的方法:
Set keySet();
Set entrySet();//取的是键和值的映射关系。
Entry就是Map接口中的内部接口;
为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。
--------------------------------------------------------------
3:懒汉模式和饿汉模式的区别
1、线程安全:
饿汉式是线程安全的,可直接用于多线程,懒汉式是线程不安全的,
用于多线程可能会被实例化多次,失去单例的作用。
如果要把懒汉式用于多线程,一种是在getInstance方法上加同步,
另一种是在使用该单例方法前后加双锁。
2、资源加载:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,
会占据一定的内存,相应的在调用时速度也会更快,
而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,
第一次掉用时要初始化,如果要做的工作比较多,性能上会有些延迟。
--------------------------------------------------------------
4:进程和线程的关系,线程休眠的方法、Sleep和wait方法有什么区别。同步与异步的区别、为什么wait(),notify(),notifyAll()等方法都定义在Object类中、
因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁
而Object代码任意的对象,所以,定义在这里
线程的生命周期:
新建:创建线程对象
就绪:有执行资格,没有执行权。
运行:有执行资格,有执行权
阻塞:由于一些操作让线程处于该状态,没有执行资格,没有执行权
而另一些操作却可以把他激活,激活后处于就绪状态
死亡:线程对象变成垃圾,等待回收
进程:是正在运行的程序,是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存空间和系统资源
线程:一个时间段执行多个任务
是进程中的单个顺序控制流,是一条执行路径
一个进程如果执行一条执行路径,则称为单线程程序
如果执行多条执行路径,则称为多线程程序。
线程依赖进程存在
多线程不是提高程序执行速度,而是提高应用程序使用率
程序的执行其实就是在抢CPU资源,CPU的执行权
同步的原理:就是将部分操作功能数据的代码进行加锁。
wait和sleep区别:分析这两个方法:从执行权和锁上来分析:
wait:可以指定时间也可以不指定时间。不指定时间,
只能由对应的notify或notifyAll来唤醒。
sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
wait:线程会释放执行权,而且线程会释放锁。
Sleep:线程会释放执行权,但不是不释放锁。
说说对线程池的理解、run和start什么区别?
程序启动一个新线程成本比较高,因为涉及到要与操作系统进行交互,
而使用线程池就可以很好的提高性能,尤其是当程序要创建大量
生存期很短的线程是,更应使用
线程池里的每一个线程代码结束后,并不会死亡,而是再次
回到线程池中成为空闲状态,等待下一个对象来使用
--------------------------------------------------------------
5:匿名内部类理解
匿名内部类其实就是一个匿名子类对象。
想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。
匿名内部类的使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个。
可以通过匿名内部类来完成参数的传递。
其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。--------------------------------------------------------------
6:抽象类的理解
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,
该子类才可以实例化。否则,该子类还是一个抽象类。
5: 抽象类只能单继承。
--------------------------------------------------------------
7:面向对象和面向过程的区别,面向对象的三个特征: 封装,继承,多态
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
将变化隔离;便于使用;提高重用性;安全性。
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
继承:提高了代码的复用性,让类与类之间产生了关系,提供了另一个特征多态的前提。
多态:函数本身就具备多态性,某一种事物有不同的具体的体现。
父类引用或者接口的引用指向了自己的子类对象。//Animal a = new Cat();
多态的好处:提高了程序的扩展性。
多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,
但是只能访问父类中具备的方法,不可以访问子类中特有的方法。
(前期不能使用后期产生的功能,即访问的局限性)
多态的前提:
1:必须要有关系,比如继承、或者实现。
2:通常会有覆盖操作。
------------------------------------------------------------------------------------------------------------------------------------------------------
8:try...catch..finally
try后面+可能出现问题的代码(里面代码越少越好)可以一个try多个catch
一旦try中出现问题,会抛出问题
catch+捕获异常名+异常处理(简单提示),然后结束try继续执行后面的语句在J7新特性中可以单个catch代码块捕获多个异常
(1,处理方式单一,符合开发要求2,多个异常必须平级关系)
平级按先后顺序,父类的异常要放到下面
finally+设置代码一定会运行的代码
RuntimeException及其子类,是运行时异常。
---------------------------------------------
9:对反射暴力反射的理解、反射的理解和应用、获取字节码的三种方式,
以及主要用在什么什么地方、用反射创建对象的两种方法?
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。
简单说:反射技术可以对一个类进行解剖。反射的好处:大大的增强了程序的扩展性。
获取这个Class对象,有三种方式:
1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。
2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。
前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。
3:使用的Class类中的方法,静态的forName方法。
指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可。
创建对象的两种方式(其实就是对象在进行实例化时的初始化方式):
1,调用空参数的构造函数:使用了Class类中的newInstance()方法。
2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数) 进行对象的初始化。
// 私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。
method.setAccessible(true);//一般很少用,因为私有就是隐藏起来,所以尽量不要访问。} --------------------------------------------------------------
10:什么是数组、数组和集合的区别、Collection 和collections的区别、List和Set有什么区别、TreeSet怎样保证元素的唯一性、迭代器的特点。
Collection 和Collections的区别:
Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法, 实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)
等操作。
Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要
有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其
成员、遍历等。
--------------------------------------------------------------
11:面向对象编程思想
--------------------------------------------------------------
12:访问控制符
公开:public 同类同包子类不同包所以人都可访问
默认:defualt 只向同包同类放开同一个包中都能访问
私有:private 只有当前类可以访问
保护:protected 同包都能访问,不同包的子类可以访问
--------------------------------------------------------------
13:接口能继承类吗?接口和抽象类、说说接口和抽象类的特征和区别
成员区别:
抽象类可以有变量,常量,有抽象方法和非抽象方法
接口:只能是常量,和抽象方法
关系的区别:
类与类:单继承,可以多层继承
类与接口:单实现或者多实现
接口与接口:继承关系,可以多继承
设计理念的区别:
抽象类被继承体现的是"is a "的关系,是共性关系
接口被实现体现的是“like a”的关系,扩展功能
--------------------------------------------------------------
14:介绍一下io、IO流的体系和理解、如何使用字节流的?什么时候会用到转换流呢?
IO流的flush和close方法的作用和区别、请说明字符流和字节流的区别在哪儿?
readLine实现的机制是什么?
bufw.flush();//仅对缓冲区进行刷新,可以让数据到目的地中。刷新之后流对象还可以继续使用。
bufw.close();//关闭流对象,但是先刷新一次缓冲区,关闭之后流对象不能再使用
1.让流变成垃圾这样就可以被系统回收
2.通知系统去释放该文件相关的资源
flush()是刷新流,把流中数据存进目标,close()是关闭流资源
//readLine
底层原理还是read方法,先读取字符将字符存入一个字符数组,
读取到换行标志:换行“\n”,回车“\r”或者回车后直接换行,就将字符数组转成字符串返回
包含改行内容的字符串,不包含任何终止符,如果已达到末尾,返回null
字符流=字节流+编码表
--------------------------------------------------------------
17:线程通信的理解、线程的状态、为什么会有多线程的安全问题、
多线程安全问题的解决办法、创建线程有几种方式,那种方式比较好,
为什么、同步的前提、说说你对死锁的理解
同步的前提:必须是多线程。操作一个共享数据,该数据被多条语句操作
同步:效率低,如果出现嵌套同步,就容易产生死锁
死锁:指俩个或者以上的线程在执行过程中,因为
争夺资源产生的一种互相等待现象
run:仅仅是封装了被线程执行的代码,直接调用的普通方法,
start:首先启动了线程,然后由jvm去调用该线程的run()方法
线程状态:
新建:start()
运行:具备执行资格,同时具备执行权;
冻结:sleep(time),wait()—notify()唤醒;线程释放了执行权,同时释放执行资格;
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;
消亡:stop()
创建线程的第一种方式:继承Thread ,由子类复写run方法。
第二种方式:实现一个接口Runnable
步骤:
1,定义类实现Runnable接口。
2,覆盖接口中的run方法(用于封装线程要运行的代码)。
3,通过Thread类创建线程对象;
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。
为什么要传递呢?因为要让线程对象明确要运行的run方法所属的对象。
5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run 方法。
Ticket t = new Ticket();
实现接口的好处:避免了java单继承带来的局限性,适合多个相同的代码去处理同一个资源,
把线程和程序代码,数据有效分离,较好的体现了面向对象的设计思想。
安全问题产生原因:多个线程操作一个拥有多条语句的共享数据,产生数据混乱
解决:加上同步
--------------------------------------------------------------
18:StringBuffer和StringBuilder的区别
StringBuilder和String对象都可以很方便的处理字符串,他们具备各自的特点,如下:
String具有以下五个特点:
1.String是引用类型,在堆上分配内存。
2.String对象一旦生成,就不可改变(Immutable)。
3.String提供了大量便捷的字符串操作函数。
4.String运算时会产生一个新的实例。
5.在程序中定义相等运算符(==)和(!=),可以方便比较String对象的值(而不是引用)。
StringBuilder具有以下两个特点:
StringBuilder对象是动态对象,允许扩充它所封装的字符串中的字符数量。
StringBuilder可以用于修改StringBuilder中的内容。
由于String对象一旦声称,就不可改变,所以每次使用System.String类中的方法时,都需要在内存中创建一个新的字符串对象,这会分配新的空间给新的对象。
如果对字符串执行重复修改,创建一个新的String对象导致的系统开销可能会非常昂贵。
如果不创建新的对象,只是修改字符窜,则可以使用StringBuilder类。
StringBuilder类型可以很好的解决字符串操作的性能问题,在它声称String对象之前,
将不会产生任何String对象。
StringBuffer是同步的,线程安全的
StringBuilder是不同步的,线程非安全的,执行速度快
--------------------------------------------------------------
20:If 和switch有什么区别,以及在什么时候使用Switch
if:能判断具体的值,区间和boolean类型表达式,
switch:只能对具体的值进行判断,值的个数是确定的,byte,short,int,char。
if判断是遍历性的,代码执行效率是不高的。
而switch...case会生成一个跳转表来指示实际的case分支的地址,
而这个跳转表的索引号与switch变量的值是相等的。
在确切知道条件结果,并且结果有限下的条件下可以使用switch,如枚举
在不能确切表示结果的情况下,或者处理复杂的逻辑关系最好用if...else,
在使用switch时候一定要注意break的使用。
switch语句特点:
1、switch语句选择的类型只有四种:byte,short,int,char。
2、case与default没有顺序。先执行第一个case,没有匹配的case执行default。
3、结束switch语句的两种情况:①遇到break,②执行到switch语句结束。
4、如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
5、进入switch语句后,执行顺序是先执行case,然后从上到下,最后再执行default。即使default放在case上面,执行顺序也不变。
--------------------------------------------------------------
21:内省的作用
InstroSpector-->JavaBean-->特殊的Java类
内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。
例如类A 中有属性name, 那我们可以通过getName,setName 来得到其值或者设置新的值。
通过getName/setName 来访问name 属性,这就是默认的规则。
--------------------------------------------------------------
22:讲一讲异常体系以及异常的处理原则。异常和错误的不同?final、finally、finanlize()的区别、编程中遇到过异常吗,都遇到了哪些异常,请你简述一下你遇到的异常以及解决方案。throw和throws的区别
throwable类中主要有Exception和error两大子类,erro是不可处理的严重异常
Exception中RuntimeException是运行异常,如角标越界,空指针异常是代码出问题必须进行处理,否则运行出错
另一类是编译异常,编译时eclipse会提醒捕获或者抛出
final是修饰符,被final声明的变量是常量,不能修改只能读取,修饰方法不能被继承finally异常处理时提供finally 块来执行任何清除操作,如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入finally 块(一定会执行的语句)。
finalize是方法名,finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作
在Object中定义,子类覆盖他可以整理系统资源和其他清理工作。
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
throw和throws的区别:
throws针对那些没有权限处理的异常进行抛出,在方法和类上抛出的是异常类名,可抛多个
throw 是在方法内抛出的异常对象
--------------------------------------------------------------
23:readLine 是字节流的方法吗?
readLine方法是字符流BufferedReader类中的方法
read方法是字节流InputStream的方法。
--------------------------------------------------------------
24:说一下拷贝一个MP3从C盘到D盘的思路
--------------------------------------------------------------
25:什么情况下要用flush();
flush刷新就是把缓冲区字符全部写入到目的地中去,
write和bufferedwritewrite只是将数据输出到缓冲区,还没有输出到目的地。
对于循环多次字符输出流需要刷新。
因为close()就是关闭流之前刷新流。只有write和bufferedwrite需要,因为操作的文件大于1k,
需要循环几次才能写入完毕,所以需要每次循环最后刷新一下。当循环一次就足够时,只在最后需要close(),关闭留并且刷新。
--------------------------------------------------------------
26:成员变量局部变量以及静态变量的区别?
成员变量是作用于整个类的,成员变量有默认初始化值,只能被对象调用
对象的建立而建立,存在于对象所在的堆内存中,随着对象的消失而消失局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效,存在与栈内存中,作用的范围结束,变量空间会自动释放
局部变量没有默认初始化值,先定义,赋值后才能被使用
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找
静态变量静态变量随着类的加载而存在,随着类的消失而消失,
存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
可以被对象调用,还可以被类名调用。
成员变量也称为实例变量。
静态变量也称为类变量。
--------------------------------------------------------------
27:装饰设计模式和继承有什么区别?
什么是装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
//穷的时候吃饭简简单单的吃饭
class Person
{
public void chiFan(){
System.out.println("吃饭");
}
}
//富裕后吃饭吃饭前来杯酒吃饭后来根烟但是这中间的过程还是有吃饭
class SuperPerson
{
private Person p;
public SuperPerson(Person p){
this.p=p;
}
public void superChiFan(){
//吃饭前来杯开胃酒增加食量
System.out.println("开胃酒");
p.chiFan();
//吃完饭后来根烟
System.out.println("来根烟");
}
}
public class PersonDemo
{
public static void main(String args[]){
Person p=new Person();
SuperPerson sp= new SuperPerson(p);
sp.superChiFan();
}
}
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
--------------------------------------------------------------
28:代理是什么?动态代理的介绍。如何创建动态代理?你对动态代理和静态代理的理解??
动态代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
动态代理:在程序运行的过程中产生这个对象。
***:而程序运行过程中产生对象其实就是反射,所以动态代理其实就是通过反射生成一个代理
Proxy类中有一个方法可以创建动态代理对象,
newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
定义一个MyInvocationHandler实现InvocationHandler接口
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,
只有在运行时才知道。
动态代理是实现JDK里的InvocationHandler接口的invoke方法,
但注意的是代理的是接口,也就是你的业务类必须要实现接口,
通过Proxy里的newProxyInstance得到代理对象。
还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,
通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。
--------------------------------------------------------------
30:类加载器的使用、三大类加载器、委托机制的理解、动态代理反射有什么关系、
加载器和反射什么关系
类加载器:负责将.class文件加载到内存中,并为之生成对应的Class对象
类加载器的组成:
Bootstrap ClassLoader 根类加载器
也称为引导类加载器,负责Java核心类的加载,
比如System,String等,在JDK中JRE的lib目录下
rt.jar文件
Extension ClassLoader 扩展类加载器
负责JRE的扩展目录下中jar包的加载
在JDK中JRE的lib目录下ext目录
System ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件,
以及classpath环境变量所指定的jar包和类路径。
反射:Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所以属性和方法:对于一个对象都能调用他的任意属性和方法,这种动态获取信息
以及动态调用对象的方法的功能成为java语言的反射机智。
--------------------------------------------------------------
32:银行系统哪里用到了单例,问银行卡上有账号是不是单例
--------------------------------------------------------------
33:在枚举种,可以使用抽象方法么?枚举能继承类吗?说说枚举和单利设计模式的区别、枚举是否可以继承类
单例模式中是一个类只有一个实例,枚举是一个类有多个实例,但不是无限个,而是有限个实例
可以使用抽象方法,要定义为抽象类,在创建实例时加入匿名内部类,
不能,通过JDK5提供的枚举来做枚举lei,所有枚举类都是Enum的子类
可以实现接口,但不能继承类,因为所有枚举类都继承自https://www.wendangku.net/doc/7a15000692.html,ng.Enum
(由编译器添加),同时java不支持多继承。
枚举类的第一行上必须是枚举项,最后一行枚举项后面的分号可以省略的
,但是如果枚举类有其他东西,这个分号就不能胜率。建议不要省略。
枚举类可以有构造器,但必须是private的,它默认的也是private的。
枚举类也可以有构造方法,但是枚举项必须重写该方法.
--------------------------------------------------------------
34:你还知道其他的设计模式么?分别介绍一下
--------------------------------------------------------------
35:java的特点是什么?
Java语言特点:
1.可以跨平台上运行,只要这个平台有JA V A虚拟机。
2.面向对象编程面向对象编程的好处就是能够在语言级别模拟现实世界的场景,简化开发。
3.简单易用、安全可靠、使用率排第一
4.java语言在一定程度上能够称为动态语言,由于反射机制,
让java能够在运行时再获取相应类型信息,大大减少开发的代码量的同时。
--------------------------------------------------------------
37:staitc代码块、构造代码块、构造函数的作用与执行顺序(还问了static代码块的使用与作用)、
构造函数与一般函数的区别,静态代码块特点
--------------------------------------------------------------
38:为什么内部类在局部位置上只能访问局部中被final修饰的局部变量
局部变量必需被final修饰,即声明为最终类型。
因为内部类的生命周期要比局部变量的时间长,局部变量时在栈里面,随着方法调用完毕而消失,
内部类存储在堆内存中,只有当对该类的引用消失时,内部类才会被系统垃圾处理器回收,也就
是说内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
为了让数据能继续使用,就用final修饰,此时局部变量常驻在内存中直到JVM退出,便
能被内部类访问。
--------------------------------------------------------------
39:重载与重写区别
方法重写:在子类中,出现和父类一模一样的方法声明的现象
方法重载:同一个类中,出现方法名相同,参数列表不同的现象
方法重载能改变返回值类型,因为它和返回值类型无关
Override:方法重载
Overrload:方法重写
--------------------------------------------------------------
40:|、&与||、&&的区别
--------------------------------------------------------------
41:接口能继承类吗?
能
--------------------------------------------------------------
43:int和Integer的不同;
一个是基本数据类型一个是引用数据类型
Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);
而valueOf()函数会对-128到127之间的数进行缓存
int 是基本数据类型
Integer是其包装类
--------------------------------------------------------------
44:同步代码块和同步修饰符有什么不同
同步代码快是要被同步的代码
同步修饰符是放在函数名或者方法上的
synchronized 修饰的方法表示
同一时间只能有一个线程进入到这个方法的方法块里面
其他的线程需要等待直到占用的那个线程离开这个方法
--------------------------------------------------------------
45:函数特点
类名首字母大写,具有封装性,复用性,提高安全性,可以简化代码
--------------------------------------------------------------
46:数组排序有几种
--------------------------------------------------------------
48:存储了一个相同的键,大家都知道常用的map是不能存储相同的键,我是想继承hashMap 改写put的方法,无奈功底不够,最后是找到了map中的子类IdentityHashMap
--------------------------------------------------------------
49:名词提炼法
恰是就是提取对象的共性内容,描述就是对具体对象的抽象
--------------------------------------------------------------
52:什么时候定义静态变量呢
需要共享数据的时候
--------------------------------------------------------------
54:JDK1.5的新特性有哪些
增强for循环:
高级for循环和传统for循环的区别:
高级for循环在使用时,必须要明确被遍历的目标。这个目标,
可以是Collection集合或者数组,如果遍历Collection集合,
在遍历过程中还需要对元素进行操作,比如删除,需要使用迭代器。
如果遍历数组,还需要对数组元素进行操作,建议用传统for循环因为
可以定义角标通过角标操作元素。如果只为遍历获取,可以简化成高级for循环,
它的出现为了简化书写。
增强for循环注意问题:在使用增强for循环时,不能对元素进行赋值;
可变参数(...)
当要操作的同一个类型元素个数不确定的时候,可是用这个方式,
这个参数可以接受任意个数的同一类型的数据。
可变参数必须定义在参数列表结尾(也就是必须是最后一个参数,否则编译会失败。
静态导入:导入了类中的所有静态成员,简化静态成员的书写。
举:关键字enum
自动拆装箱:java中数据类型分为两种:基本数据类型引用数据类型(对象)
泛型:jdk1.5版本以后出现的一个安全机制。表现格式:<>
当类中的操作的引用数据类型不确定的时候
1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。
2:避免了强制转换的麻烦
//泛型类:将泛型定义在类上。
//当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上。
//静态方法上的泛型:静态方法无法访问类上定义的泛型。
如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
泛型中的通配符:可以解决当具体类型不确定的时候,这个通配符就是?
泛型限定:
上限:?extends E:可以接收E类型或者E的子类型对象。
下限:?super E:可以接收E类型或者E的父类型对象。
上限什么时候用:往集合中添加元素时,既可以添加E类型对象,
又可以添加E的子类型对象。为什么?因为取的时候,
E类型既可以接收E类对象,又可以接收E的子类型对象。
下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。
--------------------------------------------------------------
56:为什么配置path,什么时候配置classpath?
path环境变量是先在当前目录找执行程序,如果没有,再到path指定目录中去寻找。
而classpath是先在classpath环境变量中去找执行程序,找到了,即使当前目录中有同样的执行程序也执行不到;
且只要在classpath的值后面加了分号才会当当前目录中来寻找执行程序。
--------------------------------------------------------------
57:求三位数的质数,只能被本身和1整除!!!(歇菜这道题)
--------------------------------------------------------------
58:5大内存,堆和栈的区别,简单讲讲classpath,讲一下javabeam
堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,需要时分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,用于存放由new创建的对象和数组,如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,全局变量又分为初始化的和未初始化的、
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,在JVM退出是释放堆主要用来存放对象的,栈主要是用来执行程序的.
堆:是在编译时就确定的;
栈:是在运行时赋值的;
--------------------------------------------------------------
60:关于compartor和comparable借口的区别
--------------------------------------------------------------
61:抽象关键字为什么不能和private、static、final 共存
private 冲突
final 冲突
static 无意义
抽象方法就是给子类继承的,私有方法不能被重写,产生冲突
最终的修饰也不能被继承和重写
静态修饰的内容可以直接用类名调用,而抽象修饰的方法没有方法体,所以无意义
一个类如果没有抽象方法,可不可以定义为抽象类?
可以,不让创建对象
--------------------------------------------------------------
63:为什么接口中的常量必须使用public static final修饰
接口中的变量必须常量,public static final是默认修饰符
由此要将它明确出来,防止误认
--------------------------------------------------------------
64:如果基类为抽象类,子类还会访问抽象类的构造函数吗,如果会的话,抽象类不能创建对象,其构造函数有什么意义?
--------------------------------------------------------------
65:类与类,类与对象,类与接口的关系
类与类:只能单继承,可以多层继承
类与对象:
类与接口:实现关系,可以单实现或者多实现,且能在继承一个类的同时实现多个接口接口与接口:继承关系,可以多继承
--------------------------------------------------------------
66:循环中怎么结束
--------------------------------------------------------------
67:TCP和UDP的区别
UDP:
将源,数据和目的封装成数据包进行发送和接收,
传送速度快,数据包不能超过64K
不需要连接,是不可靠协议
TCP:
需要连接,要建立传输通道
可以进行大型数据传输
通过三次握手方式进行连接,是可靠协议
传输效率稍低
--------------------------------------------------------------
---------------生活问题篇---------------
(1)假如让你当黑马的班长,你会怎么管理这个班级?
------------------------------------------------------------------------------------------------------------------------------------------------------
(2)如果你网购的商品出现瑕疵,你怎么处理?
。
------------------------------------------------------------------------------------------------------------------------------------------------------
(3)你怎么和你的项目经理、老板处理好关系?
------------------------------------------------------------------------------------------------------------------------------------------------------
(4)你在选择工作的时候,你更看重哪一样:项目经理、工资、老板?
------------------------------------------------------------------------------------------------------------------------------------------------------
(5)好像是你怎么与和你性格不合的人相处?
------------------------------------------------------------------------------------------------------------------------------------------------------
(6)父母的态度,前一份工作如何?
------------------------------------------------------------------------------------------------------------------------------------------------------
(7)问我哪个学校的、什么专业、家人是否支持来黑马学习、学校里是否还有事情要做等等。对了,老师还让我说了一下学习的过程。
------------------------------------------------------------------------------------------------------------------------------------------------------
(8)论坛技术分数、工作情况、学校表现、对待失败的态度
------------------------------------------------------------------------------------------------------------------------------------------------------
(9)你的性格的优点缺点,如果让你竞选班长还有组长,你选哪个?
------------------------------------------------------------------------------------------------------------------------------------------------------
(10)你通过什么路径了解到的黑马?为啥要来黑马学习?
------------------------------------------------------------------------------------------------------------------------------------------------------
(11)你做过什么职位在学校?对待以后可能问到的学习问题,怎么处理?怎么对待加班、你的学习方法,在基础班的咋学习的、如果以后在工作中遇到问题怎么办??
副班长,
加班:还好能接受,至少我不会是第一个跳出去呼吁的人
看视频。跟着敲一遍,后面自己再敲一编
百度啊,实在不行再询问朋友
---------------------------------------------------------------------------------
黑马入学测试题,考试题
---------NO1------------
1、以下代码哪个是正确的?为什么?
a. byte b = 1 + 1;
b. byte b = 1; b = b + 1;
c. byte b = 1; b = b += 1;
d. byte b = 1; b = ++b;
2、创建ArrayList对象,添加5个元素,使用Iterator遍历输出
3、请列举您了解的一些排序算法,并用Java语言实现一个效率较高的。
4、Collection和Collections有什么关系?List和Set有什么异同点?Map有哪些常用类,各有什么特点?
5、定义一个包含私有成员变量和函数的类,再定义一个内部类,在内部类函数中访问外部成员变量,并调用外部函数。在外部类函数中创建内部类对象,调用内部类函数。
6、声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用时输出:我叫***,今年***岁了。声明类Chinese继承Person。
7、编写程序,打印1到100之内的整数,但数字中包含7的要跳过,例如:17、27、71、72
8、在打印语句中如何打印这3个x变量?
class A {
int x = 1;
class B {
int x = 2;
void func() {
int x = 3;
System.out.println( ? );
}
}
}
9、编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt
10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
---------NO2------------
1、创建ArrayList对象,添加5个元素,使用Iterator遍历输出
2、什么情况下适合用UDP协议,什么情况下适合用TCP协议?
3、编写程序计算12+22+32+....+1002的和.
4、为什么需要配置path,什么时候需要classpath?
5、在打印语句中如何打印这3个x变量?
class A {
int x = 1;
class B {
int x = 2;
void func() {
int x = 3;
System.out.println( ? );
}
}
}
6、编写一个延迟加载的单例设计模式。
7、编程打印所有的3位质数,质数特点:只能被1和其本身整除
8、声明类Student,包含3个成员变量:name、age、score,要求可以通过new Student("张三", 22, 95) 的方式创建对象,并可以通过set和get方法访问成员变量
9、写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。例如:186********、139******** 10、声明类Student,包含3个成员变量:name、age、score,创建5个对象装入TreeSet,按照成绩排序输出结果(考虑成绩相同的问题)。
---------NO3------------
1、什么情况下适合用UDP协议,什么情况下适合用TCP协议?
2、判断一个字符串是否是对称字符串,例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串
3、定义一个二维int数组,编写代码获取最小元素。
4、创建ArrayList对象,添加5个元素,使用Iterator遍历输出
5、用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
6、数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
7、分析运行结果,说明原理。(没有分析结果不得分)
class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
public class B extends A {
int fun2() {
return 456;
}
public static void main(String args[]) {
B b = new B();
b.fun1();
A a = b;
a.fun1();
}
}
8、声明类Student,包含3个成员变量:name、age、score,要求可以通过new Student("张三", 22, 95) 的方式创建对象,并可以通过set和get方法访问成员变量
9、编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。
10、小明的妈妈每天会给他20元零花钱。平日里,小明先花掉一半,再把一半存起来。每到周日,小明拿到钱后会把所有零花钱花掉一半。请编程计算,从周一开始,小明需要多少天才能存够100元?
---------NO4------------
1、请列举您了解的一些排序算法,并用Java语言实现一个效率较高的。
2、从键盘接受一个数字,列出该数字的中文表示格式,例如:键盘输入123,打印出一二三;键盘输入3103,打印出三一零三。
3、创建ArrayList对象,添加5个元素,使用Iterator遍历输出
4、以下代码哪个是正确的?为什么?
a. byte b = 1 + 1;
b. byte b = 1; b = b + 1;
c. byte b = 1; b = b += 1;
d. byte b = 1; b = ++b;
5、用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
6、编写程序,打印1到100之内的整数,但数字中包含7的要跳过,例如:1
7、27、71、72
7、声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用时输出:我叫***,今年***岁了。声明类Chinese继承Person。
8、编写一个可以获取文件扩展名的函数,形参接收一个文件名字符串,返回一个扩展名字符串。
9、编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt
10、小明的妈妈每天会给他20元零花钱。平日里,小明先花掉一半,再把一半存起来。每到周日,小明拿到钱后会把所有零花钱花掉一半。请编程计算,从周一开始,小明需要多少天才能存够100元?
---------NO5------------
1、写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.
public void setProperty(Object obj, String propertyName, Object value){
}
2、假如我们在开发一个系统时需要对员工进行建模,员工包含3 个属性:姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
3、一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素,请用代码实现。
4、有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
5、将字符串中进行反转。abcde --> edcba
6、编写程序,生成5个1至10之间的随机整数,存入一个List集合,编写方法对List集合进行排序(自定义排序算法,禁用Collections.sort方法和TreeSet),然后遍历集合输出。
7、编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。