黑马程序员技术交流社区

标题: 云7-面试完了,总结下 [打印本页]

作者: Joney__    时间: 2013-12-9 10:37
标题: 云7-面试完了,总结下
    首先在这里感谢下黑马中为我们服务的所有老师,您们辛苦了!不管多晚只要有问题咨询老师,老师都会在第一时间内给我们回答。
    我的面试老师是吴倩老师,我面试了两次,第一次由于连着看了一个多星期视频,没有敲代码,没有复习以前的知识。导致没有通过,第一次失败以后我又把知识从头到尾过了一遍,看完视频自己就练习,第一次面试很紧张,第二次好点,也不知道紧张什么,有点搞笑。明明看的知识能回答上来,一面试思路没有了(大脑瞬间短路),这还是不熟啊。下来还得多看多练。通过面试我发现我自己的表达力不是很好,这也是我要锻炼的地方,以后去了企业不能说光厉害,再厉害不能很好的表达出来也还不是等于零。下面是我这些日子面试的总结,跟大家分享下,巩固下知识





                                                         面试总结
1、面向对象的理解

           是解决问题的思考方式,基于面向过程演化来的         
                                   1:将复杂的事情简单化。
                           2:面向对象将以前的过程中的执行者,变成了指挥者。
                           3:面向对象这种思想是符合现在人们思考习惯的一种思想。
                           举例:买电脑,让懂的人帮着买,找到对象,具体怎么卖的不用管,买了就好
                                                饭馆点菜,报菜名给服务员,服务员给后厨师傅说做什么菜,做好上菜,不管菜具体怎么来,怎么买的
                           (1)面向过程 强调过程,执行者
                           (2)面向对象 强调对象,指挥者
                           (3)面向对象思想的特点

         (4)面向对象的特点
                   A:封装(Encapsulation)
                     封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
                   封装原则:  将不需要对外提供的内容都隐藏起来。
                好处:将变化隔离;便于使用;提高重用性;安全性。
                 B:继承 (extends)在定义一个新类的时候,可以在已有类的基础上,加上新的功能,这种技术成为继承     
                 继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构。
                 先学习顶层内容,因为它是共性内容。
                一般使用的时候使用的是底层的类。

         (2)继承的好处:A:继承的出现,提高了代码的复用性 B:继承的出现,让类与类之间产生了关系,extends来表示,
         这个关系的出现,为后面我们讲面向对象的第三个特点多态打下了基础。
         (3)特点
                   Ajava只支持单继承(其实确切的说是java对多继承进行了优化,避免了安全问题)
                   Bjava支持多重()继承。
(4)注意:
A:子类可以直接访问父类中的非私有的属性和行为。B:不要仅为了获取其他类中部分功能而去继承C:类与类之间要有所属(" is a " )关系,xx1xx2的一种。
1:提高了代码的复用性。
多态:提高类的可扩展性和维护性

           匿名内部类:减少对象的生命周期


         抽象类:
                   构造方法:用于给类实例化
             成员变量:既可以是变量,也可以是常量
             成员方法:既可以是抽象的,也可以是非抽象的
             接口:
                成员变量:只能是常量 public  static final
            成员方法:只能是抽象方法

                                               默认修饰 public  abstract





         





作者: Joney__    时间: 2013-12-9 10:43
API:应用程序编程接口。(Application Programming Interface)
参数的问题:
* 基本数据类型:形参的改变对实参没有影响。
* 引用数据类型:形参的改变直接影响实参。

StringBuffer和StringBuilder、string区别
   1:StringBuffer和StringBuilder都是可变的字符序列。

        而String一旦被赋值,内容就不可以再改变。

   2:StringBuffer是线程安全的,效率低。

      StringBuilder是线程不安全的,效率高。
StringBuffer添加元素使用的是同一个对象的区域,并且可以添加任意类型的元素。
append:添加元素
insert:在指定的位置添加元素
StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全。
StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
同步:★★★★★
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。
定义同步是有前提的
1,必须要有两个或者两个以上的线程,才需要同步。
2,多个线程必须保证使用的是同一个锁。
同步代码块和同步函数的区别?
同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象
在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。
解决线程安全问题使用同步的形式,(同步代码块,要么同步函数)其实最终使用的都是锁机制。
到了后期版本,直接将锁封装成了对象。线程进入同步就是具备了锁,执行完,离开同步,就是释放了锁。
在后期对锁的分析过程中,发现,获取锁,或者释放锁的动作应该是锁这个事物更清楚。所以将这些动作定义在了锁当中,并把锁定义成对象。
所以同步是隐示的锁操作,而Lock对象是显示的锁操作,它的出现就替代了同步
匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。
Collection接口有两个子接口:List(列表) Set(集)
List:可存放重复元素,元素存取是有序的。
Set:不可以存放重复元素,元素存取是无序的
Collection
|--List:元素有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
|--Set:元素无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。
泛型中的通配符:可以解决当具体类型不确定的时候,这个通配符就是 ?  ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型。
泛型限定:
上限:?extends E:可以接收E类型或者E的子类型对象。
下限:?super E:可以接收E类型或者E的父类型对象。
上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。
下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。
数组中的数据是固定的
为什么出现集合:
面向对象的语言对事物都是以对象的形式,所以为了方便对象操作,就对对象进行储存,集合就是储存对象最常用的一种方式
由于数据在存储的时候,数据结构不一样,所以就会出现多种类型的集合方便我们操作
集合体系的由来



作者: Joney__    时间: 2013-12-9 10:43
集合类中的多种集合的操作大部分都是相同的,但是由于数据结构不一样,所以我们可以不断向上抽取,最终就形成了集合体系
数组跟集合有什么不同
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的,数组可以存储基本数据类型,集合只能存储对象
数组储存多个元素是同一种数据类型,集合可以存储多种对象(引用)数据类型的元素
每一个集合都有自己的数据结构,都有特定的取出自己内部元素的方式。为了便于操作所有的容器,取出元素。将容器内部的取出方式按照一个统一的规则向外提供,这个规则就是Iterator接口。也就说,只要通过该接口就可以取出Collection集合中的元素,至于每一个具体的容器依据自己的数据结构,如何实现的具体取出细节,这个不用关心,这样就降低了取出元素和具体集合的耦合性。
List有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
|--ArrayList底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
|--LinkedList底层的数据结构是链表,线程不同步,增删元素的速度非常快。
--Vector底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。

HashSet是如何保证元素的唯一性的呢?
*    底层数据结构是哈希表。
*    哈希表依赖的是哈希值存储数据的。
*    这个集合首先会根据hashCode方法去判断哈希值是否相同,
*    如果不同,则认为是不同的元素,就添加到集合中。
*    如果相同,就会走equals方法,这样就可以实现根据自己的需求进行比较。
*    如果返回值是true,说明该元素在集合中存在,就不添加。
*    如果返回值是false,直接添加元素。

TreeSet保证元素唯一性的原理?
*    根据比较方法返回的值是否是0来确定该元素是否是重复元素。
* 在用TreeSet保证元素唯一的时候,我们还得考虑元素的排序。
* 而排序的时候,一定要注意排序的主次要条件
增强for循环:
* 格式:
for(Collection集合或者数组对象中元素的数据类型 变量名 : Collection集合或者数组对象)
{
   在这个里面直接使用这个变量,其实就是依次获取到的集合或者数组中的元素。
}
增强for就是为了方便对Collection集合或者数组的遍历。
也是可以用于替代迭代器的。
(1)Set集合的特点:元素无序,唯一(掌握)
(2)Set的体系结构(掌握)
|--HashSet
底层数据结构是哈希表。
如何保证元素的唯一性呢?
它依赖两个方法:hashCode()equals()
首先判断哈希值是否相同:
不同:就把元素添加到集合中。
相同:继续进入equals方法比较
返回true,说明元素重复,不存。
返回false,就把元素添加到集合中。
|--TreeSet
底层数据结构是二叉树。
可以让集合中的元素排序。
如何保证元素的唯一性的呢?
它是根据比较返回的值是0,说明元素是重复的,就不添加。
有两种实现方案:
A:让自定义对象具备比较性
实现Comparable接口
B:让集合具备比较性
实现Comparator接口
如果两种情况都存在,以B为主。
HashSet子类
LinkedHashSet底层数据结构是由哈希表和链表组成。
特点:有序,无重复

*           存储的元素是成对出现的
Map接口下的常用类
l  HashMap:底层也是哈希表数据结构。线程不安全。允许null作为键和值,替代了Hashtable
l  Hashtable:底层是哈希表数据结构。线程安全。不允许null作为键和值。
l  TreeMap:底层是二叉树。线程不安全。可以用来对Map集合中的键进行排序。




作者: Joney__    时间: 2013-12-9 10:45
12.类加载器 所谓类加载器: 就是加载类的工具. java用到一个类,首先要把这个类的字节码加载到内存中,系统默认的有哪三个类加载器,每个类负责加载特定位置的类 ?①.BootStrap 类不是java类,是在java虚拟机内核中加载 是用C++编写的2进制代码,我们在Java中看不到它,是null.他是加载java类的工具.②.Extension ClassLoader 用来加载扩展类.③.AppClassLoader 是加载Classpath路径的.
类加载器也是java类,类加载器的委托机制: java中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或者默认采用系统类加载器为其父级类加载.每个类类加载器加载时,又先委托给其上级加载器,叫做类加载器的委托机制.
15. 代理和动态代理 代理及其应用,举例说明: (自己理解: 就是给具有相同接口的目标类里的各个方法增加系统功能.
代理:要为以存在的多个具有相同接口的目标的各个方法增加一些新的功能
动态代理的概念: JVM可以在运行期动态生成类的字节码,这种动态生成往往被用作代理类,即为动态代理.
JvM生成的动态类必须实现一个或者多个接口,所以,jvm生成的动态类,只能用作具有相同接口的目标类的代理
动态代理机制: 其实动态代理机制最核心的就是InvocationHandler(调用处理器)这个接口InvocationHandler 是代理实例的调用处理程序 实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
工作原理
客户端调用代理,代理的构造方法接收一个Handler对象,接收进去以后,客户端调用代理的各个方法,代理的各个方法,会把这个调用请求转发给刚才通过构造方法传递的Handler对象,Handler对象又把各个请求分发给目标的相应方法
首先把Handler对象对象传给这个代理的构造方法然后这个代理的其他方法去找刚才传过来的Handler对象,找这个Handle的invoke方法,在iHandle的invoke方法内部可以加入日志功能同时还可以去调用目标,去找目标对应的方法

作者: 小痞痞    时间: 2013-12-9 14:21
恭喜    云七见
作者: Joney__    时间: 2013-12-9 14:41
小痞痞 发表于 2013-12-9 14:21
恭喜    云七见

好的。。。
作者: 等27岁那一天    时间: 2013-12-9 19:23
抓紧时间达到这种水平{:soso_e130:}{:soso_e130:}
作者: 胡永城    时间: 2013-12-9 20:30
恭喜恭喜!
作者: 秦大忠    时间: 2013-12-9 21:25
非常不错,明天,明天面试了,嘎嘎
作者: Joney__    时间: 2013-12-10 13:26
秦大忠 发表于 2013-12-9 21:25
非常不错,明天,明天面试了,嘎嘎

好好看我这个总结应该就能过,呵呵
作者: Joney__    时间: 2013-12-10 13:26
等27岁那一天 发表于 2013-12-9 19:23
抓紧时间达到这种水平

加油!!
作者: 秦大忠    时间: 2013-12-10 14:18
Joney__ 发表于 2013-12-10 13:26
好好看我这个总结应该就能过,呵呵

感觉内容少了些
作者: time_out    时间: 2013-12-10 16:06
膜拜楼主!楼主加油!
作者: Joney__    时间: 2013-12-13 22:06
秦大忠 发表于 2013-12-10 14:18
感觉内容少了些

我不是全都总结了,发出来这些都是面试几乎都要问到的
作者: 蒋淑静    时间: 2013-12-13 22:14
谢谢楼主分享,我在积累,能用上
作者: 今生2013    时间: 2014-5-6 15:46
恭喜恭喜!
作者: zimi626    时间: 2014-5-7 22:38
值得我这个后来者学习。所以先收藏了
作者: 郝林杰    时间: 2014-5-10 12:49
恭喜恭喜呀
作者: yuZhe_toString    时间: 2014-5-18 14:11
学习了。。           
作者: wuhyoung    时间: 2014-5-21 21:07
恭喜,看你总结的很好,受益匪浅,我复制下来,学习学习。赞
作者: 谜燕    时间: 2014-5-21 22:05
学习学习
作者: Baymax    时间: 2015-5-30 09:28
学习学习
作者: wenweishan2015    时间: 2015-6-21 15:07
受用了,赞!
作者: cemabenteng    时间: 2015-6-27 22:46
我刚学到面向对象这,感谢分享
作者: 朙兲    时间: 2015-6-28 21:27
楼主辛苦了,总结的非常好
作者: 星辰shine    时间: 2016-3-10 22:46
谢谢分享了....好有用啊
作者: zhangwenlihao    时间: 2016-3-18 22:06
谢谢分享
作者: 2011014170    时间: 2016-5-6 19:21
学习了。。。
作者: Wanibal    时间: 2016-5-11 22:16
谢谢分享,学习一下
作者: quqixiaozhu    时间: 2016-5-12 11:41
楼主对于面向对象的思想 还是搞不太明白。比如对于框架的应用嘞
作者: wendaogds    时间: 2016-5-17 20:27
收藏了,真心不错,有许多知识点自己看自己的就总结不出来,看你的,一目了然
作者: 赫兹    时间: 2016-6-13 21:45
不错,总结的挺好的
作者: zhangyu009    时间: 2016-6-14 21:22
恭喜恭喜呀
作者: qwe53170    时间: 2016-10-2 14:44
vvvvvvvvvvvvvvvvvvvvvvvv
作者: newu    时间: 2016-10-2 16:57
我只是路过打酱油的,嘿嘿





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2