Java基础知识总结(二)

11.sleep()和wait()有什么区别?

sleep是线程被调用时,占着cpu休眠,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu。

sleep()和wait()方法的区别可从两个角度阐述:
1.cpu的抢占权;2.锁旗标是否释放
两者都会释放cpu的抢占权;
wait()方法执行完即可释放锁旗标,进入线程的等待队列;
sleep()执行完,不会释放,进入等待队列;

12. 同步和异步的区别?同步的实现方法?

同步:发送一个请求,等待返回,然后再发送下一个请求。实现:1. Synchronized修饰;2.wait和notify。
异步:发送一个请求,不等待返回,随时可以再发送下一个请求。

同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

同步和异步最大的区别就在于,一个需要等待,一个不需要等待。

比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息。

电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息。

13. 请对比synchronized与java.util.concurrent.locks.Lock的异同?

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

14.String s =new String (“syz”);创建了几个String Object?

1.如果String常理池(常量缓冲区)中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”);

2.如果String常理池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”)。

15.作用域public、private、protected 以及不写时的区别?

private修饰的成员变量和函数只能在类本身和内部类中被访问。

protected 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。

public修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问。

默认情况(不写)下,属于一种包访问,即能被类本身以及同一个包中的类访问。

16.forward和redirect两种跳转方式的区别?

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

本质上说, 转发是服务器行为,重定向是客户端行为。其工作流程如下:

转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

17.编程单例模式:写一个singleton出来

Singleton分为:饱汉模式、饥汉模式、双重锁模式

//饱汉模式:类加载时完成初始化,创建出实例对象(不管用不用,先创建)。

public class SingleTon {

//实例化对象放到静态代码块中,可提高执行效率,但是可能更占用空间

private final static SingleTon instence=new SingleTon();

private SingleTon(){};//私有的构造函数

//获取方法

public static SingleTon getinstance(){

return instence;

};

}

//饥汉模式:延迟加载,在第一次用的时候才创建出对象,存在线程安全问题。

public class SingleTon {

private  static SingleTon instence=null;

private SingleTon(){};//私有的构造函数

//获取方法

public static synchronized SingleTon getinstance(){

if(instence==null){

//第一次使用的时候创建对象

instence=new SingleTon();

}

return instence;

};

}
18.编程冒泡排序:用java实现冒泡排序?快速排序的方法。

冒泡排序:

int temp = 0;

int[] sortNum = {12,33,28,86,15,62,9,38};

for (int i = 0; i < sortNum.length-1; i++) {  //第一个for循环控制排序要走多少趟,最多做n-1趟排序  

    for (int j = 0; j < sortNum.length-1-i; j++) { //第2个for循环控制每趟比较多少次  

                if(sortNum[j+1]<sortNum[j]){  //大的 往后面排  

                    temp = sortNum[j];  

                    sortNum[j] = sortNum[j+1];  

                    sortNum[j+1] = temp;  

                }  

    }

}

System.out.println(Arrays.toString(sortNum));

1.对基本数据类型数组的排序

1>数字排序:

int[] intArray = new int[]{1,56,-5,33};

Arrays.sort(intArray);

System.out.println(Arrays.toString(intArray));

2>字符串排序(先大写后小写):

String[] strArray = new String[]{"Z", "a", "D"};

Arrays.sort(strArray);

System.out.println(Arrays.toString(strArray));
19.HashMap和Hashtable的区别?

HashMap:实现了Map接口,允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率高于Hashtable。

Hashtable:不能将null作为key或者value。方法是同步的,线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值