[知了堂学习笔记]面试题整理_01

1.集合
1.1ArrayList与LinkedList的区别(从数据结构考虑)与性能对比(读写数据)

这里写图片描述

1.2HashMap与HashTables的区别与性能的对比

这里写图片描述

2.面向对象
2.1写出overload与overwrite的区别

overload 完全新的方法,参数和原方法不同。
override 覆盖继承到的那个方法,那个方法仍然没有放弃。
overwrite 重写继承到的那个方法的代码,原方法被放弃

2.2Static块、static成员、构造函数以及”普通成员”初始化的顺序

 (1) 在一个不存在继承的类中:初始化static变量,执行static初始化快–>初始化普通成员变量(如果有赋值语句),执行普通初始化块–>构造方法
(2)在一个存在继承的类中:初始化父类static成员变量,运行父类static初始化块–>初始化子类static成员变量,运行子类static初始化块–>初始化父类实例成员变量(如果有赋值语句),执行父类普通初始化块–>父类构造方法–>初始化子类实例成员变量(如果有赋值语句)及普通初始化块–>子类构造方法。

2.3final变量、final方法及final类(解释)

ffinal本身的含义是“最终的,不可改变的”,它可以修饰抽象类,非抽象方法和变量。
注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的。
final修饰的类:表示最终类,该类不能在有子类。
只要满足以下条件就可以把一个类设计成final类
1、某个类不是专门为继承而设计的
2、处于安全考虑,类的实现细节不许改动
3、确信该类不会再被扩展
java里final修饰的类有很多,比如八大基本数据类型保证类和String等。
final修饰的方法:最终的方法,该方法不能被子类覆盖
注意:子类可以调用,但是不能覆盖
1、final修饰的变量:表示常量,只能赋值一次,不能再次赋值。
2、final变量必须显示的指定初始值,系统不会为final字段初始化。
常量名规范:常量名符合标识符,单词全部大写,单词之间使用下划线隔开。
final修饰基本类型变量:表示该变量的值不能改变,即不能重新赋值。
final修饰引用类型:表示该变量的引用地址不能改变,而不是引用地址里的内容不能变。
final是唯一可以修饰局部变量的修饰符,局部内部类只能访问final修饰的局部变量。

3.多线程
3.1sleep与wait方法的比较

这里写图片描述

3.2同步方法有几种?

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争

3.3简单说说线程锁及如何解决线程同步问题

Java中每个对象都有一个内置锁 当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
释放锁是指持锁线程退出了synchronized同步方法或代码块。 关于锁和同步,有一下几个要点:
1)只能同步方法,而不能同步变量和类; 2)每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步?
3)不必同步类中所有的方法,类可以同时拥有同步和非同步方法。
4)如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。
5)如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制。 6)线程睡眠时,它所持的任何锁都不会释放。
7)线程可以获得多个锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁。
8)同步损害并发性,应该尽可能缩小同步范围。同步不但可以同步整个方法,还可以同步方法中一部分代码块。
9)在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。

当多线程同时访问同一资源的时候,并对同一资源数据做修改的,容易发生资源数据混乱,这个时候用到 线程同步。典型列子:生产者和消费者问题。
怎么做到线程同步:(三种方式) (1).同步代码块,使用synchronizd(object o){ 处理统一资源的代码 }
(2).同步方法。在方法前面加synchronizd (3).同步锁。

private fianl ReetrantLock lock=new ReetrantLock();
void 方法名{
  lock.lock();
   try{


  }finally{
   lock.unlock();
}
}

3.4线程的生命周期及各种状态(明确线程的状态转换)

这里写图片描述

4.IO
4.1字节流与字符流的相互转换

public class TypeToChar {
/*
* 字节流转换成字符流
* 
* 1、字节流转换成字节流的对象,(InputStreamReader(叫做转换流):作用:就是字节流通
* 向字符流之间转换的桥梁,字节流和字符流的转换存在着编码的方式。
* ) 
*/
public static void main(String[] args) throws Exception {
//字节流
InputStream in=System.in;//如果用字节流读取键盘中输入的一个中文字
//while循环两次,因为一个汉字是两个字节。
/*
* 将字节流转换成字符流的桥梁,
* 将字节流转换成字符流是为了,以后使用字符流中的方法,
* 使得程序更加的高效。
*/
//该桥梁流是字符流。
InputStreamReader isr=new InputStreamReader(in);//这个读取一个汉字
//InputStreamReader流通过字节流读取的两个字节的数据,然后通过与编码格式的转换
//成一个汉字,并输出。
//只读取一次。
//字符流
BufferedReader br=new BufferedReader(isr);
String line=null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
}

}
public class CharToType {
/*
* 字符流向字节流之间的转换。
* 桥梁是:InputStreamWriter(类)
* 该类是字符向字节流转换的桥梁。
* 
* 编码:把字符变成字节是编码。
* 
* 解码:把字节变成字符是解码
* 
*/
public static void main(String[] args) {
OutputStream out=System.out;
OutputStreamWriter osr=new OutputStreamWriter(out);
}
}


public class DemoTest01 {
public static void main(String[] args) throws Exception {
//读取键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=br.readLine())!=null){
  if("over".equals(line))
  break;
  bw.write(line);
  bw.flush();
  System.out.println();
}
}
}

5.网络编程
5.1简述通信原理(简单的一次会话)

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:(Cookie:JSESSIONID=客户端第一次拿到的session ID)。这个cookie是服务器自动生成的,他的max-age为-1,变松hi仅当前浏览器有效。关闭浏览器失效,浏览器子窗口共享,各浏览器窗口不共享。这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。

5.2基于TCP通信协议的网络编程(简述Socket通信原理)

在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

6从类似如下的文本文件(工程目录下的a.txt)中读取出所有的名字,并打印出重复的姓名和重复的次数,并按重复次数排序:

  • 张三,28
  • 李四,35
  • 张三,28
  • 王五,35
  • 张三,28
  • 李四,35
  • 赵六,28
  • 田七,35
    并写出伪代码:
public class ReadName {


/**
* 1、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序
* name.txt文件内容如下
* 1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35


*/
public static void main(String[] args) throws IOException {

//使用BufferedReader一次可以读取一行,判断是否为结尾用null判断
BufferedReader bf = new BufferedReader(new FileReader("names.txt"));

String str= bf.readLine();
List<String> names = new ArrayList<String>();
while(str!=null){  //1,张三,28
String []st=str.split(",");
names.add(st[1]);
//只把姓名添加进去就可以了 
str= bf.readLine();
}

   Set<String> name =
new HashSet<String>(names); //[赵六, 张三, 田七, 李四, 王五]  
   //由于set集合是不允许有重复的元素的,所以可以用set集合去重
for(String set :name){
String temp=set;
int num=0;
for(String s : names)  //list集合里有很多重复的。对每次迭代的元素,要是次数大于2就表示重复
{
if(temp.equals(s)){
num++;
}

} 
if(num>=2){
System.out.println(temp+"重复次数:"+num);

}

}



}


}

7.请使用一条SQL写出如下SQL题目:
统计每年每月的信息 表名称:sales 表结构如下:
这里写图片描述

答案:

SELECT `year`,
SUM(CASE WHEN mouth = 1 THEN sale ELSE 0 END) AS '一月',
SUM(CASE WHEN mouth = 2 THEN sale ELSE 0 END) AS '二月',
SUM(CASE WHEN mouth = 3 THEN sale ELSE 0 END) AS '三月',
SUM(CASE WHEN mouth = 4 THEN sale ELSE 0 END) AS '四月'
FROM sales
GROUP BY `year`

请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值