Java复习

一、COllections.sort内部原理

Collection.sort()排序通过泛化实现对所有类型的排序,对于基础类型如int,string,按照字符表,数字大小排序。对于自定义类型,通过实现Comparable接口,重写comparableTo()方法自定义比较大小的方式。也可以使用Comparator外比较器,Comparable接口的方式比实现Comparator接口的耦合性要强一些。

Collection.sort内部调用的是Arrays.sort方法,对于Arrays类,有两个sort方法,sort(Object)和sort(int),前者使用归并排序,后者使用快排。

import java.util.*;
class xd{
    int a;
    int b;
    xd(int a,int b){
        this.a=a;
        this.b=b;
    }
}
public class Main(){
    public static void main(String[] args){
        xd a=new xd(2,3);
        xd b=new xd(4,1);
        xd c=new xd(1,2);
        ArrayList<xd> list=new ArrayList<>();
        array.add(a);
        array.add(b);
        array.add(c);
        Collections.sort(array,new Comparator<xd>(){
            @Override
            public int compare(xd o1,xd o2){
                if(o1.a>o2.a)
                    return 1;
                else if(o1.a<o2.a)
                    return -1;
                return 0;
            }
        });
        for(int i=0;i<array.size();i++)
            System.out.println(array.get(i).a);
        for(int i=0;i<array.size();i++)
            System.out.println(array.get(i).b);
    }
}

二、TreeMap和TreeSet

TreeMap和TreeSet都是Java Collection Framework的两个重要成员,其中TreeMap实现了Map接口,TreeSet实现了set接口。TreeSet底层是通过TreeMap来实现的。二者的实现方式完全一样,而TreeMap的实现就是红黑树算法。

  • TreeMap和TreeSet都是有序的集合,它们存储的值都是排好序的
  • TreeMap和TreeSet都是非同步的集合,他们不能再多线程之间共享,不过可以使用Collections.synchronizedMap()来实现同步
  • 运行速度都比Hash集合慢,时间复杂度为O(logN)。而HashMap/HashSet则为O(1)。
  • TreeSet实现了Set接口而TreeMap实现了Map接口。
  • TreeSet只存储一个对象,而TreeMap存储两个对象key和Value。
  • TreeSet中不能有重复对象,而TreeMap可以有重复对象。

三、集合和有序集合有什么区别?

有序集合里的元素可以根据key或index访问,有序集合在属性的增加、删除、修改中拥有较好的性能。

无序集合里的元素只能遍历。

  • 无序集:set
  • 有序集:List

凡是实现set的AbstractSet、CopyOnWriteArraySet、EnumSet、HashSet、LinkedHashSet、TreeSet都是无序的

凡是实现List的AbstractList、ArrayList、LinkedList、Stack、Vector都是有序的

  • Map:Map可以根据key来访问,从这个角度将,Map也是有序的 

四、Set是无序的,怎么保证有序

Set是无序的,但是TreeSet可以保证有序。

五、Java集合框架

Java集合大致可以分为Set、List、Queue和Map四种体系。其中Set代表无序,不可重复的集合。List代表有序,可以重复的集合。Map代表映射关系的集合。Java5又增加了Queue体系,代表一种队列集合实现。

 Java集合和数组的区别:

数组元素在初始化时指定,意味着只能保存定长的数据。而集合可以保存数量不确定的数据。数组元素既可以保存基本类型的值,也可以是对象。集合里只能保存对象。基本数据类型要转换成对应的包装类才能放入集合类中。

Java集合类之间的继承关系:Java的集合类主要由两个接口派生而出:Collection和Map。

Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。

六、Iterator和ListIterator的区别是什么

Iterator可以用来遍历Set和List集合,但是ListIterator只能遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

七、快速失败和安全失败的区别是什么

Iterator的安全失败是基于对底层集合做拷贝,它不受源集合上修改的影响。Java.concurrent包下面的所有类都是安全失败的。而快速失败受到源集合修改的影响,Java.util包下面的所有集合类都是快速失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器不会抛出此异常。

八、Java哪些类是线程安全的

Vector:比ArrayList多了个同步机制(Synchronized)

HashTable:HashMap的线程安全版本

Stack:Stack也是线程安全的,继承与Vector

九、Volatile和synchronized区别

  • 加锁机制既可以保证可见性又可以保证原子性,而volatile只能确保可见性,不能保证原子性
  • volatile不会进行加锁操作。volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作。也就不会使线程阻塞,因此volatile是一种比Synchronized更轻量级的同步机制。
  • volatile不如synchronized安全。

十、Volatile

volatile关键字保证了内存可见性,防止指令重排序。volatile并不保证原子性。

  • volatile保证内存可见性的原理是每次访问变量时都会进行一次刷新,因此每次访问都是主内存中最新的版本。所以volatile关键字的作用之一就是保证变量修改的实时可见性。
  • 由于volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低。

十一、Java编写一个会导致死锁的程序

public static void main(String[] args){
    final Object a=new Object();
    final Object b=new Object();
    Thread threadA=new Thread(new Runnable(){
        @Override
        public void run(){
            synchronized(a){
                try{
                    Thread.sleep(5000);
                    synchronized(b){
                        Thread.sleep(1000);
                        System.out.println("锁住b");
                    }
                 }
                catch(Exception e){
                     e.printStackTrace();
                }
            }
        });


    Thread threadB=new Thread(new Runnable(){
        @Override
        public void run(){
            synchronized(b){
                try{
                   Thread.sleep(5000);
                   Synchroninzed(a){
                        Thread.sleep(1000);
                        System.out.println(“锁住A”);
                }catch(Exception e){
                  e.printStackTrace();
                    }
            });

     ThreadA.start();
     ThreadB.start();
}

十二、自旋锁、偏向锁、轻量级锁、重量级锁

阻塞操作会导致在用户态和内核态之间切换,严重影响性能。在很多场景下,同步资源的锁定时间很短,为了这一小段时间去切换线程可能会偿失,可以让线程“稍微等待一会”,这就是自旋锁。

无锁、偏向锁、轻量级锁、重量级锁都是针对synchronized的。synchronized是悲观锁,在操作同步资源之前需要给同步资源加锁,这把锁就存在Java对象头里面。

一个线程访问:在大多数情况下,锁总是由一个线程获得,不存在多线程竞争,所以出现了偏向锁。其目标就是在只有一个线程执行同步代码块的情况下能够提高性能

轻量级锁:两个线程交替访问,锁升级,升级为轻量级锁。

重量级锁:多个线程访问,竞争激烈,升级了重量级锁。

十三、

 

 

 

 

 

 

 

 

期末考试题型: 一、 填空题(本题共15空 ,每空1分,共15分。) 二、 单项选择题(本题共20小题,每题1分,共20分。) 三、 是非题(对划“√”,错划“×”,本题共10小题,每题1分,共10分。) 四、 简答题(本题共5小题,每小题5分,共25分。) 五、 程序填空题(本题共5空 ,每空2分,共10分。) 六、 编程题(本题共2小题,每小题10分,共20分。) 二、填空题 1、Java语言是一种完全的_面相对象___程序设计语言。 2、布尔型常量有两个值,它们分别是_true__、_false___。 3、在定义一个方法时,一般都要指明该方法的返回值类型,如果它不返回任何值,则必须将其声明成 void 。 4、在Java的语言环境中已经包含了一组相关的核心类库,它们属于Java.lang包。 5、写出完整的main方法的声明 public static void main(String args[]) 。 6、要设计一个Applet小程序,必须先引入包 java.applet 。 7、设x=2.5,a=7,y=4.7,算术表达式x+a%3*(int)(x+y)%2/4的值为:2.75___ 8、被关键字_final___修饰的方法是不能被当前类的子类重新定义的方法。 9、Java中类成员的限定词有以下几种:private, _protected__, public__, 默认友好。 10、基类的公有成员在派生类中的访问权限由_基类___决定。 11、用static修饰的方法,称为静态方法。它们不是对象的方法,而是整个类的方法。静态方法只能处理用关键字_static___修饰的数据。 12、在Java中有一种叫作__构造方法__的特殊方法,我们在程序中用它来对类的对象成员进行初始化。 13、面向对象技术具有_封装性___、_继承性___、_抽象性___、多态性等特性。 14、Java中所有类都是类 _Object___的子类。 15、顺序执行以下两个语句的输出结果是: 10 。 String s = “我喜欢学习Java!”; System.out.println(s.length( )); 16、据程序的构成和运行环境的不同,Java源程序分为两大类: Application 程序和 Applet 程序。 17、如果一个Java源程序文件中定义有4个类,则使用Sun公司的JDK编译器javac编译该源程序文件将产生 4 个文件名与类名相同而扩展名为 class 的字节码文件。 18、开发与运行Java程序需要经过的三个主要步骤为 编辑源文件 、 编译器编译生成字节码文件 和 解释器执行 。 19、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是 Applet 类的子类并且存储该源程序文件的文件名必须为 MyApplet.java 。 20、 一个Java Application源程序文件名为MyJavaApplication.java,如果使用Sun公司的Java开发工具JDK编译该源程序文件并使用其虚拟机运算这个程序的字节码文件,应该顺序执行如下两个命令: javac MyJavaApplication.javajava MyJavaApplication 。 21、在Java的基本数据类型中,char型采用Unicode编码方案,每个Unicode码字符占用 2 字节内存空间,这样,无论是中文字符还是英文字符,每个都是占用2 字节内存空间。 22、在Java程序中定义的类有两种成员: 静态成员 、 实例成员 。 23、Java源程序是由类定义组成的,每个程序中可以定义若干个类,但是只有一个类是主类。在Java Application中,这个主类是指包含 main 方法的类;在Java Applet里,这个主类是一个系统类 Applet 的子类。 24、创建一个名为 MyPackage 的包的语句是 package MyPackage ; , 该语句应该放在程序的位置为: 程序中非注释行的第一行 。 25、 抽象或abstract 方法是一种仅有方法头,没有具体方法体和操作实现的方法,该方法必须在抽象类之中定义。 最终后final 方法是不能被当前类的子类重新定义的方法。 26、多态是指 一种定义,多种实现 ,在Java中有两种多态,一种是使用方法的 重载 实现多态,另一种是使用方法的 覆盖 实现多态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值