面试笔试-java基础

1.类实例化

  1. 类初始化过程
  2. 实例初始化过程
  3. 方法重写

类实例化过程:

  • 一个类要创建实例需要先加载并初始化该类(main方法所在的类需要先加载和初始化)
  • 一个子类要初始化需要先初始化父类
  • 一个类初始化就是执行()方法
    1) ()方法由静态类变量显示赋值代码和静态代码块组成
    2)类变量显示赋值代码和静态代码块从上到下顺序执行
    3)()方法只执行一次

实例初始化过程:

实例初始化就是执行()方法
1)()方法可能重载有多个,有几个构造器就有几个init方法
2)()方法由非静态实例变量显示赋值代码和非静态代码块,对应的构造器代码组成
3)非静态实例变量显示赋值代码和非静态代码块从上而下顺序执行,对应的构造器最后执行
4)每次创建实例对象,调用对应构造器,就是调用对应的()方法。
5)()方法的首行是super(),也就是父类的()方法。
即子类的实例化方法:
1)super()
2)i= test()
3) 子类的非静态代码块
4)子类的无参构造器

2.方法传参

在这里插入图片描述
修改完成之后:
在这里插入图片描述
总结:
1)形参是基本数据类型:传递数据值
2)形参是引用数据类型:传递地址值,特殊类型(string,包装类对象不可变,赋值后产生新的对象在这里插入代码片

3.成员变量和局部变量

在这里插入图片描述

运算结果:
2 1 5
1 1 5

== & equals

==: 对于基本数据类型,比较的是值,对于引用类型,比较的是其指向的首地址

equals:比较的是两个对象的某些特征是否一样,即重新equals方法去定义

string stringbuilder stringbuffer

string 被final修饰,内容不可变
stringbuilder 和stringbuffer 内容可变 的 字符数组。char[] value ;
append 方法去追加内容
stringbuilder 线程不安全,效率高
stringbuffer 线程安全,效率低

hashMap 和hashTable

都可以用来存储key-value的数据
区别:
1)hashMap 可以把null作为key或者value,而hashtable不可以
2)hashmap线程不安全,hashtable线程安全,效率低

想要线程安全且效率高 currenthashMap
通过把整个的map分成n个segment ,类似hashtable,可以提供相同的线程安全,但是效率提升n倍,默认提升16倍。

实现拷贝文件的工具类,使用字符流还是字节类?

字符流传递的是字符
字节流传递是二进制的字节
我们拷贝文件的话不确定是只包含字符流,有可能有字节流,比如图片,声音,文字等等,考虑到通用性,要使用字节流

讲一下线程的几种实现方式?怎么启动?怎么区分?线程池?并法库?

1)3中实现方式
实现runnable接口
继承thread:扩展性不强,只支持但继承,一旦继承了thread,就不能继承其他的
实现callable接口

2)如何启动
调用start方法启用
3)如何区分?
thread.setName(“name”),给线程设定一个名词,再创建线程完成后,都需要设置名称。

设计模式

设计模式就是经过前人无数次实践总结的,设计过程中可以反复使用的,解决特定问题的设计方法。

常用设计模式:
单例 (饿汉、饱汉) spring创建bean容器,默认的就是单例
工厂:spring ioc
代理: aop
包装:io流

单例:
构造方法私有化,即只有自己类中可以创建
自己类中创建一个单实例
提供一个方法供外部获取该实例

public class singlonton{
private static Singlonton instance = new Singlonton();
private singleton(){
}
public static singleton getInstance(){
return instance ;
}

}
饱汉:

public class singleton2{
private static Singleton2 instance;
private singleton(){
}
public static getInstance(){
if (null == instance ) {
instance = new Singleton2();
}

}

线程安全的

public class singleton3{
private static singleton3 instance ;

private singleton3(){
}
public static getInstance (){
if (null == instance){
synchronize (singleton3.class){
if(null == instance ){
instance = new singleton3();
}
}
}
}
}
}

http 的get和post请求

get和post都是http请求的一种方式,用户通过不同的http请求方式完成对资源的操作。
get,post,put,delete 就是 查 ,改,增 ,删。具体来讲,get一般用于查,post用于更新信息
区别在于
1.get请求提交的数据会在地址栏显示,post不会
2. 传输数据的大小,http get请求由于浏览器对地址畅读的限制而导致传输的数据有限制,而post请求不会因为地址长度受限制而导致传输数据受限制
3. 安全性,post安全性高,get由于数据会在地址中呈现,所以通过历史记录找到密码等关键信息。

说下对servlet的理解

java servlet是java编写的服务器端程序,这些servlet都要事先servlet这个接口,主要功能在于交互式的浏览和修改数据,动态的生成web的内容。httpServlet重写doget和dopost方法 来完成对get 和post请求的响应。

jdk动态代理和cglib有什么区别?

jdk动态代理只能代理实现了接口的类,而cglib可以代理未实现任何接口的类。另外,cglib是通过生成一个被代理类的子类来拦截被代理类的方法调用。因此不能代理声明为final类型的类和方法。就二者效率来说,jdk的动态代理更加优秀。

谈谈对java注解的理解,解决了什么问题?

java语言中的类,变量,方法,参数,包都可以注解标识,程序运行期间我们可以获取到相应的注解以及注解中定义的内容,这样可以帮助我们做一些事情。比如spring中的一个类如果被@Component 注解标记的话,spring容器启动的时候就会把这个类归为自己管理,这样你就可以通过autowired注解来注入这个对象了。

java反射?反射有什么缺点?你是怎么理解反射的?为什么框架需要反射?

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都可以调用他的方法和属性,这种动态获取信息以及动态调用对象方法的功能就是java的反射机制。
优点:运行期类型的判断,动态加载类,提高代码灵活度
缺点:

  • 性能瓶颈:反射相当于一系列解释操作,通知jvm要操作的事情,性能比直接的代码效率低。
  • 安全问题:我们动态的去操作改变类的属性的同时也增加了类的安全隐患
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值