设计师导航网站源码,wordpress 汉化不是很好,成都网站建设企业 排名,项目进度计划甘特图1、面向对象和面向过程的区别
2、标识符的命名规则
3、Java自动装箱与拆箱
4、 方法重载和方法重写的区别
5、 equals与 的区别
6、 Hashcode的作用
7、 String、StringBuffer 和 StringBuilder 的区别是什么?
8、ArrayList和linkedList的区别
9、 HashMap和HashTabl…
1、面向对象和面向过程的区别
2、标识符的命名规则
3、Java自动装箱与拆箱
4、 方法重载和方法重写的区别
5、 equals与 的区别
6、 Hashcode的作用
7、 String、StringBuffer 和 StringBuilder 的区别是什么?
8、ArrayList和linkedList的区别
9、 HashMap和HashTable的区别
10、 Collection包结构与Collections的区别
11、深拷贝和浅拷贝的区别是什么?
12、final有哪些用法?
13、 static都有哪些用法?
14、try catch finally try里有return finally还执行么
15.多态的作用
16.什么是反射
17.Java创建对象得五种方式?
18、 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
19、用过 ArrayList 吗说一下它有什么特点
20、有数组了为什么还要搞个 ArrayList 呢
21、说说Hashtable 与 HashMap 的区别
22、红黑树有哪几个特征
23、说说你平时是怎么处理 Java 异常的 1、面向对象和面向过程的区别
面向过程是分析解决问题的步骤然后用函数把这些步骤一步一步地实现然后在使用的时候一 一调用则可。性能较高所以单片机、嵌入式开发等一般采用面向过程开发.
面向对象是把构成问题的事务分解成各个对象而建立对象的目的也不是为了完成一个个步骤 而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特 性所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说比面向过程要低。 2、标识符的命名规则
标识符的含义 是指在程序中我们自己定义的内容譬如类的名字方法名称以及变量名称等 等都是标识符。
命名规则硬性要求 标识符可以包含英文字母0-9的数字$以及_ 标识符不能以数字开头 标 识符不是关键字
命名规范非硬性要求 类名规范首字符大写后面每个单词首字母大写大驼峰式。 变量
名规范首字母小写后面每个单词首字母大写小驼峰式。 方法名规范同变量名。 3、Java自动装箱与拆箱
装箱就是自动将基本数据类型转换为包装器类型int--Integer调用方法Integer的 valueOf(int) 方法
拆箱就是自动将包装器类型转换为基本数据类型Integer--int。调用方法Integer的 intValue方法 4、 方法重载和方法重写的区别
重写(Override) 从字面上看重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子 类继承了父类原有的方法但有时子类并不想原封不动的继承父类中的某个方法所以在方法名 参数列表返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下 对方法体进行修改或重写这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
重载Overload 在一个类中同名的方法如果有不同的参数列表参数类型不同、参数个数不同甚至是参数顺序不同则视为重载。同时重载对返回类型没有要求可以相同也可以不同但不能通过返回类型是否相同来判断重载。 5、 equals与 的区别 比较的是变量(栈)内存中存放的对象的(堆)内存地址用来判断两个对象的地址是否相同即是 否是指相同一个对象。比较的是真正意义上的指针操作。
equals用来比较的是两个对象的内容是否相等由于所有的类都是继承自java.lang.Object类的所 以适用于所有对象如果没有对该方法进行重写的话调用的仍然是Object类中的方法而Object 中的equals方法返回的却是的判断。 6、 Hashcode的作用 java的集合有两类一类是List还有一类是Set。前者有序可重复后者无序不重复。当我们在set 中插入的时候怎么判断是否已经存在该元素呢可以通过equals方法。但是如果元素太多用这样 的方法就会比较满。 于是有人发明了哈希算法来提高集合中查找元素的效率。这种方式将集合分成若干个存储区域每个对象可以计算出一个哈希码可以将哈希码分组每组分别对应某个存储区域根据一个对象的哈希码就可以确定该对象应该存储的那个区域。 hashCode方法可以这样理解它返回的就是根据对象的内存地址换算出的一个值。这样一来当集合要添加新的元素时先调用这个元素的hashCode方法就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素它就可以直接存储在这个位置上不用再进行任何比较了如果这个位置上已经有元素了就调用它的equals方法与新元素进行比较相同的话就不存了不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了几乎只需要一两次。 7、 String、StringBuffer 和 StringBuilder 的区别是什么? String是只读字符串它并不是基本数据类型而是一个对象。从底层源码来看是一个final类型的 字符数组所引用的字符串不能被改变一经定义无法再增删改。每次对String的操作都会生成 新的String对象。 StringBuilder 和 StringBuffer都是可变的mutable。它们可以被多次修改而不会创建新的对象.StringBuffer是线程安全的。它提供了同步方法确保在多线程环境下对字符串的修改是安全的。但是这种同步机制会带来性能开销。StringBuilder是线程不安全的。它没有提供同步方法因此在多线程环境下使用时需要手动同步。由于没有同步开销StringBuilder在单线程环境下的性能优于StringBuffer。 操作少量字符数据用 String单线程操作大量数据用 StringBuilder多线程操作大量数据用 StringBuffer。 8、ArrayList和linkedList的区别
ArrayList 基于动态数组实现。底层是一个数组当数组满了之后会自动扩容通常扩容为原数组的 1.5 倍具体扩容策略在不同版本的 JDK 中可能有所不同。
ArrayListInteger list new ArrayList();
list.add(1); // 底层会创建一个数组并将元素添加到数组中
list.add(2);
LinkedList 基于双向链表实现。每个元素是一个节点每个节点包含数据部分和指向前后节点的指针。
LinkedListInteger list new LinkedList();
list.add(1); // 底层会创建一个节点并将元素添加到节点中
list.add(2); 9、 HashMap和HashTable的区别
1、两者父类不同
HashMap是继承自AbstractMap类而Hashtable是继承自Dictionary类。不过它们都实现了同时 实现了map、Cloneable可复制、 Serializable可序列化这三个接口。
2、对外提供的接口不同
Hashtable比HashMap多提供了elments() 和contains() 两个方法。 elments() 方法继承自 Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实 上contansValue() 就只是调用了一下contains() 方法。
3、对null的支持不同
Hashtablekey和value都不能为null。
HashMap key可以为null但是这样的key只能有一个因为必须保证key的唯一性可以有多个 key值对应的value为null。
4、安全性不同
HashMap是线程不安全的在多线程并发的环境下可能会产生死锁等问题因此需要开发人员自 己处理多线程的安全问题。
Hashtable是线程安全的它的每个方法上都有synchronized 关键字因此可直接用于多线程中。
虽然HashMap是线程不安全的但是它的效率远远高于Hashtable这样设计是合理的因为大部 分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。
ConcurrentHashMap虽然也是线程安全的但是它的效率比Hashtable要高好多倍。因为 ConcurrentHashMap使用了分段锁并不对整个数据进行锁定。
5、初始容量大小和每次扩充容量大小不同
6、计算hash值的方法不同 10、 Collection包结构与Collections的区别 Collection是集合类的上级接口子接口有 Set、 List、 LinkedList、ArrayList、Vector、Stack、 Set 是集合类的一个帮助类 它包含有各种有关集合操作的静态多态方法用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化就像一个工具类服务于Java的 Collection框架。 11、深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指 向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象. 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍. 12、final有哪些用法?
final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了: 被final修饰的类不可以被继承 被final修饰的方法不可以被重写 被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变. 被final修饰的方法,JVM会尝试将其内联,以提高运行效率 被final修饰的常量,在编译阶段会存入常量池中. 除此之外,编译器对final域要遵守的两个重排序规则更好:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序. 13、 static都有哪些用法?
所有的人都知道static关键字这两个基本的用法静态变量和静态方法.也就是被static所修饰的变量/ 方法都属于类的静态资源,类实例所共享.
除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作: public calss PreCache{ static{ //执行相关操作 } }
此外static也多用于修饰内部类,此时称之为静态内部类.
最后一种用法就是静态导包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名。 14、try catch finally try里有return finally还执行么
执行并且finally的执行早于try里面的return
结论
1、不管有木有出现异常finally块中代码都会执行
2、当try和catch中有return时finally仍然会执行
3、finally是在return后面的表达式运算后执行的此时并没有返回运算后的值而是先把要返回的 值保存起来管finally中的代码怎么样返回的值都不会改变任然是之前保存的值所以函数 返回值是在finally执行前确定的
4、finally中最好不要包含return否则程序会提前退出返回值不是try或catch中保存的返回值。 15.多态的作用 多态的实现要有继承、重写父类引用指向子类对象。它的好处是可以消除类型之间的耦合关系增加类的可扩充性和灵活性。 多态允许你通过统一的接口来处理不同类型的对象这样在添加新的类型时不需要修改现有的代码只需要实现相同的接口或继承相同的父类即可。这使得代码的扩展性大大增强。 16.什么是反射 反射机制是在运行时对于任意一个类都能够知道这个类的所有属性和方法对于任意个对象 都能够调用它的任意一个方法。在java中只要给定类的名字就可以通过反射机制来获得类的所 有信息。
I 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 应用场景有要操作权限不够的类属性和方法时、实现自定义注解时、动态加载第三方jar包时、按需加载类节省编译和初始化时间 获取class对象的方法有class.forName(类路径)类.class()对象的getClass 17.Java创建对象得五种方式?
(1)new关键字 (2)Class.newInstance (3)Constructor.newInstance
(4)Clone方法 (5)反序列化 18、 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
线程与进程相似但线程是一个比进程更小的执行单位。 一个进程在其执行的过程中可以产生多个 线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源所以系统在产生一个线程或是在各个线程之间作切换工作时负担要比进程小得多也正因为如此线程也被称为轻量级进程。
程序是含有指令和数据的文件被存储在磁盘或其他的数据存储设备中也就是说程序是静态的代 码。
进程是程序的一次执行过程是系统运行程序的基本单位因此进程是动态的。系统运行一个程序 即是一个进程从创建运行到消亡的过程。简单来说一个进程就是一个执行中的程序它在计算 机中一个指令接着一个指令地执行着同时每个进程还占有某些系统资源如 CPU 时间内存空 间文件输入输出设备的使用权等等。换句话说当程序在执行时将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的而 各线程则不一定因为同一进程中的线程极有可能会相互影响。从另一角度来说进程属于操作系 统的范畴主要是同一段时间内可以同时执行一个以上的程序而线程则是在同一程序内几乎同 时执行一个以上的程序段。 19、用过 ArrayList 吗说一下它有什么特点 只要是搞 Java 的肯定都会回答“用过”。所以回答题目的后半部分——ArrayList 的特点。可以从这 几个方面去回答 Java 集合框架中的一种存放相同类型的元素数据是一种变长的集合类基于定长数组实现当加入数据达到一定程度后会实行自动扩容即扩大数组大小。底层是使用数组实现添加元素。
如果 add(o)添加到的是数组的尾部如果要增加的数据量很大应该使用ensureCapacity() 方法该方法的作用是预先设置 ArrayList 的大小这样可以大大提高初始化速度。
如果使用 add(int,o)添加到某个位置那么可能会挪动大量的数组元素并且可能会触发扩 容机制。 高并发的情况下线程不安全。多个线程同时操作 ArrayList 会引发不可预知的异常或错误。ArrayList 实现了 Cloneable 接口标识着它可以被复制。注意ArrayList 里面的 clone() 复制其实是浅复制。 20、有数组了为什么还要搞个 ArrayList 呢 通常我们在使用的时候如果在不明确要插入多少数据的情况下普通数组就很尴尬了因为你不知道需要初始化数组大小为多少而 ArrayList 可以使用默认的大小当元素个数到达一定程度后会自动扩容。
可以这么来理解我们常说的数组是定死的数组ArrayList 却是动态数组。 21、说说Hashtable 与 HashMap 的区别
本来不想这么写标题的但是无奈面试官都喜欢这么问 HashMap。
1. 出生的版本不一样Hashtable 出生于 Java 发布的第一版本 JDK 1.0 HashMap 出生于 JDK 1.2。
2. 都实现了 Map、Cloneable、Serializable当前 JDK 版本 1.8 。
3. HashMap 继承的是 AbstractMap并且 AbstractMap 也实现了 Map 接口。 Hashtable 继承
Dictionary。
4. Hashtable 中大部分 public 修饰普通方法都是 synchronized 字段修饰的是线程安全的 HashMap 是非线程安全的。
5. Hashtable 的 key 不能为 null value 也不能为 null这个可以从 Hashtable 源码中的 put 方 法看到判断如果 value 为 null 就直接抛出空指针异常在 put 方法中计算 key 的 hash 值之 前并没有判断 key 为 null 的情况那说明这时候如果 key 为空照样会抛出空指针异常。
6. HashMap 的 key 和 value 都可以为 null。在计算 hash 值的时候有判断如果 keynull 则其 hash0 至于 value 是否为 null 根本没有判断过。
7. Hashtable 直接使用对象的 hash 值。hash 值是 JDK 根据对象的地址或者字符串或者数字算出 来的 int 类型的数值。然后再使用除留余数法来获得最终的位置。然而除法运算是非常耗费时 间的效率很低。 HashMap 为了提高计算效率将哈希表的大小固定为了 2 的幂这样在取 模预算时不需要做除法只需要做位运算。位运算比除法的效率要高很多。
8. Hashtable、 HashMap 都使用了 Iterator。而由于历史原因Hashtable 还使用了 Enumeration 的方式。
9. 默认情况下初始容量不同Hashtable 的初始长度是 11之后每次扩充容量变为之前的 2n1 n 为上一次的长度而 HashMap 的初始长度为 16 之后每次扩充变为原来的两倍。 22、红黑树有哪几个特征
紧接上个问题面试官很有可能会问红黑树下面把红黑树的几个特征列出来 23、说说你平时是怎么处理 Java 异常的
try-catch-finally try 块负责监控可能出现异常的代码 catch 块负责捕获可能出现的异常并进行处理 finally 块负责清理各种资源不管是否出现异常都会执行 其中 try 块是必须的catch 和 finally 至少存在一个标准异常处理流程