java面试基础篇

JAVA描述
Jquery选择器
8种基本数据类型
String str="i"与 String str=new String(“i”)一样吗?
将string字符串顺序反转? 使用stringbuffer 的 reverse()方法
==和equals的区别
Get和Post的区别
Java的特性/核心
Java多态的具体体现
抽象类与接口的区别
Forword(请求转发)与Redirect(重定向)
JSP九大隐式对象 /JSP内置对象/JSP对象
List、set区别
如何实现数组和 List 之间的转换?
StringBuffer StringBuilder String 区别
Switch默认接受的几种数据类型
Hashtable与HashMap的区别
数据结构选择HashMap 还是 TreeMap,基于什么考虑
final, finally, finalize的区别。
Servlet的生命周期
Servlet的运行原理
Object类中的默认方法/创建对象后默认有的方法
Collection和 Collections的区别
Java反射机制
Cookie和Session的区别
equals()和hashCode()
线程安全和非线程安全
单例(Singleton)
java Exception体系结构

基础篇

JAVA描述

由sun公司推出的一门开源的、简单的、面向对象的、跨平台的编程语言。Java是跨平台的,它的可移植性比较强,因为Java虚拟机的存在(JVM)可以垃圾自动回收,自动分配内存,自动释放资源.

Jquery选择器

ID选择器
元素选择器
属性选择器
过滤选择器
表单元素选择器

8种基本数据类型

浮点型:float(4 byte), double(8 byte) 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte) 布尔型: boolean(没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")

String str="i"与 String str=new String(“i”)一样吗?

String str=“i” 会分配在常量池中,常量池中有的话str直接指向该变量的内存地址,如果常量池中没有,则新创建再赋值给变量

String str=new String(“i”) 在上分配,即使内存中一样还是会创建一个新的变量

在这里插入图片描述

在这里插入图片描述

==和equals的区别

使用基本数据类型比较时用的话,比较的是值;除了基本数据类型,用比较的是对象的内存地址
Equals比较的是值

Get和Post的区别

1.get是从服务器上获取数据,post是向服务器传送数据,2.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
3.get传送的数据量较小,限制2KB左右。post传送的数据量较大,不受大小限制。4.在进行文件上传时必须使用post。

Java的特性/核心

Java是面向对象的, 主要特性为:封装,继承,多态
封装:将属性私有化,提供公共的get\set方法
继承是:子类继承父类非private的属性,方法。
多态:多态就是同一个行为具有不同的表现形态。(接口的实现,类的继承,重写,重载)

抽象类与接口的区别

a.一个类只能继承单个类,但是可以实现多个接口
b.抽象类中可以有构造方法,静态方法,普通方法,
c. 接口要求所有的方法都必须是抽象的
e.抽象类中可以有普通成员变量,接口中不可以有,
接口里面所有的方法的默认修饰符为public abstract,
接口里的成员变量默认的修饰符为 pulbic static final。

Java多态的具体体现

多态有四种体现形式:

  1. 接口的实现。 2. 类的继承。 3. 重载。 4. 重写。 其中重载和重写为核心。
  2. 重载发生在同一个类中,方法名相同,其余都不一样(参数个数、类型、顺序不同),说明该方法被重载
    3、重写发生在继承关系中,方法体不同,其余都一样(方法名,返回值类型,参数),说明父类中的该方法被子类重写

Forword(请求转发)与Redirect(重定向)

1、从数据共享上 Forword是一个请求的延续, Redirect开启一个新的请求,
2、从地址栏 Forword转发地址栏不发生变化,Redirect转发地址栏发生变化
3、参数传递 Forword跳转时允许带参数,Redirect跳转时不允许带参数
JSP九大隐式对象 /JSP内置对象/JSP对象
输入/输出对象: request response out 作用域通信对象: session application pageContext
Servlet 对象: page config 错误对象: exception

java集合类,以及项目中使用

java集合包括 Collection(LIst和Set) 和map集合
我们常用的集合有ArrayList,LikeedList,hashset,treeset,hashmap等。
普通安全的线程类vector hashtable
多线程情况下可以用到的集合是juc并发包下的,concurrentHashMap CopyOnWriteArrayList

CopyOnWriteArrayList: CopyOnWriteArrayList的“线程安全”机制 – 是通过volatile和监视器锁Synchrnoized来实现的。

List、set区别

List和Set的顶层接口都是collection。
List是一个有序的集合,通过下标来访问List集合中的元素对象,可存放重复数据,可以插入多个null元素。无固定长度;(有序值可重复的集合)默认长度是10
set是无序的不可重复的集合(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的)。set只能用迭代,因为他无序,无法用下标来取得想要的值。
List接口实现类有ArrayList,LinkedList,Vector。当从ArrayList的中间位置插入或者删除时,需要对数组进行复制、移动、代价比较高。因此,他适合随机查找和遍历,不适合插入和删除,ArrayList和Vector是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢LinkedList(双向链表,可以从头插入也可以从末尾插入)是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为Vector是线程安全的,所以他和ArrayList相比而言,查询效率要低。
StringBuffer StringBuilder String 区别
String是一个常量,是不可变的,所以对于每一次+=赋值 都会创建一个新的对象
StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append 方法,在原来的基础上进行追加,所以性能比String要高,
因为StringBuffer是线程安全的而StringBuilder是非线程安全的,所以StringBuilder(非线程)的效率高于StringBuffer(线程).
对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.
Switch默认接受的几种数据类型
byte,Short, int, char, String(jdk版本1.7以上)

实现list和数组转换?

list ----> 数组 list.toArray()
数组--------》list Arrays.asList();

Hashtable与HashMap的区别

1、Map是一个使用哈希表来存储键值对的接口。Map下有两个具体的实现,分别是HashMap和HashTable, 在数据结构上是基本相同的,都创建了一个继承自Map.Entry的私有的内部类Entry,每一个Entry对象表示存储在哈希表中的一个键值对。
2、HashMap是非线程安全的,如果满足线程安全,可以用collections的synchronizedMap方法使HashMap具有线程安全的能力。HashTable是线程安全的(通过synchronized加锁保证),所以HashMap的效率高于HashTable。
3、HashMap允许键或值为空, Hashmap只允许一条记录的键为null(如果多个,都存储在了数组的第0个位置),允许多条记录的值为null,而hashtable不允许键值对为空。而HashTable不允许键或值为空。
final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理的一部分,配合try/catch运行,表示总是执行,一般情况下用来释放资源。
Finalize:在JVM垃圾回收的时候使用该方法
(是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用)

在选择使用 HashMap 还是 TreeMap 时,需要考虑访问数据的速度和数据的顺序性。

  1. 访问速度:HashMap 的访问速度比 TreeMap 更快,因为 HashMap 内部使用哈希表,能够快速定位到元素;而 TreeMap 则是基于红黑树实现的,需要进行树的查找操作,效率较低。

  2. 数据顺序性:如果需要按照键的顺序来访问映射表中的元素,则应该使用 TreeMap;因为 TreeMap 会自动按照键值进行排序,因此在需要有序访问数据的场合,比如需要将元素遍历输出或排序,或者需要查找最小值和最大值等操作,使用 TreeMap 会更加合适。而如果不需要有序访问数据,则应该使用 HashMap。

  3. 是否需要键值对的顺序保持一致:HashMap 和 TreeMap 的元素遍历顺序可能不同,因此,如果需要遍历顺序一致,则应该使用 LinkedHashMap,它是 HashMap 的子类,但它会保持元素插入顺序或者访问顺序不变。如果需要排序,可以使用 TreeMap。

总之,在选择 HashMap 还是 TreeMap 时,需要综合考虑访问数据的速度、数据的顺序性以及需要保持键值对顺序一致的功能。需要用到有序输出结果,查找最大值和最小值或者需要后续展开的可能,使用TreeMap更加合适。而如果需要高效率的存储,查找、更新数据操作,可以考虑使用 HashMap。

Servlet的生命周期

Servlet特指HttpServlet,用来接受浏览器的访问请求,浏览器最常用的请求为GET和POST方式

  1. 加载Servlet类 2. 实例化 3. 初始化init 4. 处理请求 service  进一步调用doGet/doPost方法 5. 销毁 destory
    2、实例化、初始化、提供服务、销毁、不可用
    Servlet的运行原理
    应用服务器启动时,首先加载web.xml里的信息。Web.xml里的信息读取完成时,会创建对servlet实例,并进行初始化servlet(init).当应用服务器接收到对应的请求时会根据web.xml里配置的servlet(url_pattern)找到对应的处理类servletclass,并根据请求的方式get\post,找到对应的doget\dopost提供服务的方法,,服务提供完毕时进入销毁状态,等待下一次请求,服务器停止时进入不可用状态。
    当接收到请求时,Servlet会根据请求的path在web.xml中配置的Servlet信息里的中进行匹配(主要是),匹配到对应的url后通过 标签中的找到对应的标签中一致的内容,通过找到对应servlet类,根据请求的方式调用doget或dopost方法进行处理,并进行相应。
    Object类中的默认方法/创建对象后默认有的方法
    equals(Object obj)指示某个其他对象是否与此对象“相等”。
    toString()返回该对象的字符串表示。
    hashCode() 返回该对象的哈希码值。
    wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
    notify()唤醒在此对象监视器上等待的单个线程。notifyAll()唤醒在此对象监视器上等待的所有线程。

finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

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

Java反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”
反射中常用方法:
属性相关的:
getFields() 获取类中全部public修饰的属性。 getDeclaredFields() 获取类中全部的属性,不限修饰符。
getField(“属性名”) 获取类中指定public修饰的属性。 getDeclaredField(“属性名”) 获取类中指定的属性,不限修饰符。
方法相关的
getMethods() 获取类中全部public修饰方法,包括超类。 getDeclaredMethods() 获取本类中的全部方法,不限修饰符。
getConstructors() 获取类中的非私有构造器。 .newInstance(); 调用类中的无参构/有参造获取实例。
getDeclaredConstructor() 获取类中全部构造器 invoke(); 让方法执行。

Cookie和Session的区别

cookie存放在用户的浏览器上,session放在服务器上,
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,用户也可以手动清空cookie,考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。我记得单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

equals()和hashCode()

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。每当对象需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
线程安全和非线程安全
非线程安全:多线程访问时,没有加锁机制,数据可以被多个线程同时使用,对象的参数可能被改变,数据不安全。
而线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问某个数据时,这个线程受到保护,其他线程不能进行访问,直到该线程被读取完,其他线程才能访问。所以避免了数据访问时的冲突。
如何实现线程安全? 就是在线程安全的方法上使用synchronized 关键字

单例(Singleton)

单例就是只能返回一个实例。
单例所具备的特点:
1.私有化的构造函数 2.私有的静态的全局变量 3.公有的静态的方法
单例有很多种常见的有懒汉式、饿汉式和双层锁式。
饿汉式:
public class Singleton1 {
private Singleton1() {};
private static Singleton1 single = new Singleton1();
public static Singleton1 getInstance() {
return single;
}
}
懒汉式:
public class Singleton2 {
private Singleton2() {}
private static Singleton2 single=null;
public static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
线程安全:
public class Singleton3 {
private Singleton3() {}
private static Singleton3 single ;
public static Singleton3 getInstance() {
if(null == single){
synchronized(Singleton3.class){
if(null == single){
single = new Singleton3();
}
}
}
return single;
}
}
特殊问题:反射是否可以打破单例?可以。例如:
Constructor con = c.getDeclaredConstructor(String.class);
// 通过私有带参构造方法对象创建对象
// 暴力访问
con.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
Object obj = con.newInstance();// 获取实例
如何防护?在构造器中加入防护手段例如:
private Singleton() {
synchronized (SingletonNotAttackByReflect.class) {
if(single != null) {
throw new RuntimeException(“单例模式正在被破坏”);
}
}
}

java Exception体系结构

java 异常是程序运行过程中出现的错误。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类(父类)。在Java API中定义了许多异常类,分为两大类,错误Error和异常Exception。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常(非runtimeException)。
1、Error与Exception
Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。
这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常
运行异常:
NullPointerException:空指针异常、IndexOutOfBoundsException 索引越界异常、ArithmeticException:数学计算异常、
ArrayOutOfBoundsException:数组索引越界异常ClassNotFoundException:类文件未找到异常、
ClassCastException:造型异常(类型转换异常)
这些异常是不检查异常(Unchecked Exception),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的。
非运行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如:
IOException、文件读写异常、FileNotFoundException:文件未找到异常、EOFException:读写文件尾异常
MalformedURLException:URL格式错常、SocketException:Socket异常、SQLException:SQL数据库异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值