java小记 2023-05-05

public class Test {
    /**
     * 谓类的方法就是指类中用static 修饰的方法(非static 为实例方法),比如main 方法,那么可以以main
     * 方法为例,可直接调用其他类方法,必须通过实例调用实例方法,this 关键字不是这么用的
     *
     *
     * Java数据库连接库JDBC用到哪种设计模式?
     * 桥接模式
     *
     *下面关于静态方法说明正确的是 在静态方法中调用本类的静态方法时可直接调用
     *静态方法中没有this关键词,因为静态方法是和类同时被加载的,而this是随着对象的创建存在的,静态比对象优先存在
     *
     *下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader
     * Thread可以被继承,用于创建新的线程
     * B,Number类可以被继承,
     * Integer,Float,Double等都继承自Number类
     * C,Double类的声明为
     * public final class Doubleextends Numberimplements Comparable<Double>
     * final生明的类不能被继承
     * D,Math类的声明为 public final class Mathextends Object
     * 不能被继承
     * E,ClassLoader可以被继承,用户可以自定义类加载器
     *
     *
     *
     *
     *   java.lang包中不能被继承的类:
     *
     *   public final class Byte
     *
     *   public final class Character
     *
     *   public static final class Character.UnicodeBlock
     *
     *   public final class Class<T>
     *
     *   public final class Compile
     *
     *   public final class Double
     *
     *   public final class Float
     *
     *   public final class Integer
     *
     *   public final class Long
     *
     *   public final class Math
     *
     *   public final class ProcessBuilder
     *
     *   public final class RuntimePermission
     *
     *   public final class Short
     *
     *   public final class StackTraceElement
     *
     *   public final class StrictMath
     *
     *   public final class String
     *
     *   public final class StringBuffer
     *
     *   public final class StringBuilder
     *
     *   public final class System
     *
     *   public final class Void
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("A");
        String b = new String("B");
        System.out.println("a"+System.identityHashCode(a));//地址
        System.out.println("b"+System.identityHashCode(b));//地址
//        System.out.println(b+"");
        oper(a,b);//x,y是a,b的副本,x.append(y)使得AB在一起,
        // 而y=x后,y指向AB,方法结束后x,y消亡,故a-AB,b-B;
        System.out.println("a"+System.identityHashCode(a));//地址
        System.out.println("b"+System.identityHashCode(b));//地址
        System.out.println(a+","+b);
    }
    public static void oper(String x,String y){
        System.out.println("x"+System.identityHashCode(x));//地址
        System.out.println("y"+System.identityHashCode(y));//地址
//        x.append(y);
        x = x+y;
        y = x;
        System.out.println("x"+System.identityHashCode(x));//地址
        System.out.println("y"+System.identityHashCode(y));//地址
    }
}

在这里插入图片描述

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的
hash采用拉链法解决冲突,hashmap ,Hashtable采用拉链法解决冲突


在这里插入图片描述

public A foo(B b){return b;}
重写 要求两同两小一大原则, 方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限。[注意:这里的返回类型必须要在有继承关系的前提下比较]

重载 方法名必须相同,参数类型必须不同,包括但不限于一项,参数数目,参数类型,参数顺序
再来说说这道题 A B 都是方法名和参数相同,是重写,但是返回类型没与父类返回类型有继承关系,错误 D 返回一个类错误 c的参数类型与父类不同,所以不是重写,可以理解为广义上的重载访问权限小于父类,都会显示错误
虽然题目没点明一定要重载或者重写,但是当你的方法名与参数类型与父类相同时,已经是重写了,这时候如果返回类型或者异常类型比父类大,或者访问权限比父类小都会编译错误

在这里插入图片描述
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机
服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
在这里插入图片描述
1.new
2.对象克隆clone()方法
3.反射Constructor类的newInstance()方法
4.反射的Class类的newInstance()方法
5.反序列化的readObject()方法

在这里插入图片描述
ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N)。对于插入和删除操作,LinkedList要优于ArrayList因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。因此选项C错误。

  1. List 是一个有序集合,可以存放重复的数据 (有序:存进是什么顺序,取出时还是什么顺序)
    (1).ArrayList 底层是数组适合查询,不适合增删元素。
    (2).LiskedList 底层是双向链表适合增删元素,不适合查询操作。
    (3).Vector 底层和ArrayList相同,但是Vector是线程安全的,效率较低很少使用

  2. Set 是一个无序集合,不允许放重复的数据 (无序不可重复,存进和取出的顺序不一样)
    (1).HashSet 底层是哈希表/散列表
    (2).TreeSet 继承sartedSet接口(无需不可重复,但存进去的元素可以按照元素的大小自动排序)

  3. Map 是一个无序集合,以键值对的方式存放数据,键对象不允许重复,值对象可以重复。

             (1).HashMap实现不同步,线程不安全。  HashTable线程安全 
    
             (2).HashMap中的key-value都是存储在Entry中的。 
    
             (3).HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
    

现在的jdk版本底层是数组➕红黑树

在这里插入图片描述

1、Java中,赋值是有返回值的
,赋什么值,就返回什么值。比如这题,x=y,返回y的值,所以括号里的值是1。

2、Java跟C的区别,C中赋值后会与0进行比较,如果大于0,就认为是true;而Java不会与0比较,而是直接把赋值后的结果放入括号。

在这里插入图片描述

main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。

前台线程和后台线程的区别和联系:

1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。

2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。

3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。

4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。

说明:

      应用程序的主线程以及使用Thread构造的线程都默认为前台线程                      

使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值