大杂烩知识点总结(一)——偏java基础

  1. Colletion接口下有哪些子类 Map
    List Queue Set
    ArrayList Vector LinkedList HashSet TreeSet hashmap treemap
    stack
  • Vector: 方法上加锁,线程安全,效率较低。 synchronized
  • ArrayList: 异步处理,线程不安全,效率较高。通过public void ensureCapacity(int minCapacity) 在增加元素前确保容量。
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  • 如果最小容量大于已有的最小容量→ensureExplicitCapacity(minCapacity);

  • 最小容量大于保存的数组长度→grow(minCapacity);

  • 新容量更新为旧容量的1.5倍,如果还小于最小容量,则新容量等于最小容量

  • 再次检查新容量是否超过定义的最大数组长度→调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,

  • 超过了则为最大值Interger.MAX_VALUE,否则为MAX_ARRAY_SIZE。

  • Queue:offer(add) 和 poll (remove) 括号外的 不会报异常:前者添加元素,看容量是否已满;后者 删除元素,看队列是否为空;
    Queue

2.Java数据类型有哪些?
基本数据类型和引用数据类型
基本数据类型有8种:byte,short,int,long;float,double;char;boolean
引用数据类型分为:类,如字符串类,包装类;接口还有数组;

3.基本数据类型和包装类的区别?为什么需要包装类?
包装类是对象,要new,并且对象存储在堆中,初始值为null,调用是通过引用对象地址
基本类型一般则存储在虚拟机栈的变量表中

包装类方便用来获取对象值,比如存储在数据库中的一些值,我们获取这个对象再进行
拆箱获得其基本数据类型值的大小。

4.Java的异常分类
根类Thorwable
其次:1.Error 2.Exception
1.Error:比较严重的错误 比如:1.1 StackOverFlowError
1.2 OutOfMemoryError
2.Exception: 2.1 IOException(强制的)
2.2 RuntimeException:空指针异常NullPointerException
未找到类异常ClassNotFound

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉

非RuntimeException一般是外部错误(非Error),其必须被 try{}catch语句块所捕获

RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,不用捕捉

  • try - catch中的return

1.若try代码块内含有return,同时存在finally代码块(代码块内无return值)时,先执行finally函数的值。

2.若try代码块内含有return,同时存在finally代码块且代码块内含有return值时,此时finally代码块内的return值将直接返回(或覆盖掉try代码块中的return值)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChIxyHvh-1595034594173)(C:\Users\RAHS\AppData\Roaming\Typora\typora-user-images\image-20200708110112904.png)]

  • 常见的编译时异常
    1.FileNotFoundException
    2.ClassNotFoundException
    3.SQLException
    4.NoSuchFieldException
    5.NoSuchMethodException
    6.ParseException

  • 常见的运行时异常

    1.NullPointerException
    2.ArithmeticException
    3.ClassCastException
    4.ArrayIndexOutOfBoundsException
    5.StringIndexOutOfBoundsException

5.Hashmap、Hashtable、ConcurrentHashmap的原理和区别?
Hashmap ,ConcurrentHashmap继承AbstractMap类,
而HashTable是继承自Dictionary类

1.1 HashMap先插入再扩容(会导致浪费),在jdk1.7时头部插入并发扩容的时候容易出现链表成环的问题,在jdk1.8中采用尾部插入法
1.2 可以存储null键和null值

3.1 ConcurrentuHashMap 通过把整个Map分为N个Segment(一个数组),锁分段技术,JKD1.8中,相比HashTable的一把锁提高了效率(细粒度的锁减少了竞争,但增大了锁的开销),且线程安全(读操作不加锁,且由于Node的value是用volatile关键词修饰的,保证了内存可见性,所以每次获取时都是最新的值,但并不能保证并发的原子性,所以put还是进行了加锁处理)
3.2 put,这里比HashMap好的一点是先扩容检验再put

6.Java的锁机制分类?
6.1自旋锁:防止线程在等待锁资源时做内核态和用户态之间的切换进入阻塞挂起状态,只需要等一等(自旋)
6.2偏向锁:


HashMap初始值容量为16,负载因子0.75,即到12扩容2倍, 1 << 30
HashMap put()插入操作:

  1. 先看 哈希桶数组table[]是否为空,或null。如果是,进行resize()操作。

  2. 通过hash & n-1 获得索引 i , 如果 table[i] == null,直接newnode,插入节点。

  3. 如果不为空,判断key是否存在 :(如果hash值不相等,则key一定不相等equal objects must have equal hash codes.)

    (p.hash == hash &&
        ((k = p.key) == key || (key != null && key.equals(k))))
    
  4. 如果存在相同的key,则直接覆盖,返回oldValue;

    if (!onlyIfAbsent || oldValue == null)
        e.value = value;
    
  5. 如果不存在:看是否为树节点。如果是树节点,红黑树插入,如果不是:遍历链表,(找到尾部,newnode),同时判断长度是否为8,进行树化 treeifyBin(tab, hash)(如果table长度小于64,则resize,大于才真正的树化),同时,看是否存在key,存在则进行覆盖。

  6. 插完后,跟新modcount,size。如果size大于threshold,则扩容。

HashMap get()插入操作:

  1. public V get(Object key)→final Node<K,V> getNode(int hash, Object key)

  2. 如果table数组不为null,且不为空,且数组中对应索引所在的first节点不为null,则

  3. 如果first的hash(一定要先判断,因为hash值不同,key一定不同),key地址相等,或key不为null且值相等

    则,返回first,再返回其value

  4. 如果情况3不符合,如果first的next节点不为null,判断first是否为树节点,是则return ((TreeNode<K,V>)first).getTreeNode(hash, key);

  5. 如果不为树节点,在first.next != null 的情况下 不断找到下一个节点判断是否符合然后break,如果bitcount(用来遍历链表的) >= TREEIFY_THRESHOLD - 1 ,进行树化。尾插法。

  6. 如果e 不为 null ,即找到了一个符合的。如果if (!onlyIfAbsent || oldValue == null),改变e的值

HashMap的resize():

  1. 如果原来的table长度oldcap以及到了最大值MAXIMUM_CAPACITY(1 << 30),设置

    threshold = Integer.MAX_VALUE;

  2. 如果原来的table长度oldcap扩容2倍后小于最大值且大于默认大小,则

    newThr = oldThr << 1; // double threshold

    /**
     * The next size value at which to resize (capacity * load factor).
     *
     * @serial
     */
    // (The javadoc description is true upon serialization.
    // Additionally, if the table array has not been allocated, this
    // field holds the initial array capacity, or zero signifying
    // DEFAULT_INITIAL_CAPACITY.)
    int threshold;
    
  3. jdk1.7 扩容成环(头插法)https://blog.csdn.net/qq_21993785/article/details/80384250


正则表达式匹配:

\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。

  • 匿名内部类:

匿名内部类的创建格式为: new 父类构造器(参数列表)|实现接口(){

//匿名内部类的类体实现

}

  1. 使用匿名内部类时,必须继承一个类或实现一个接口
  2. 匿名内部类由于没有名字,因此不能定义构造函数
  3. 匿名内部类中不能含有静态成员变量和静态方法
  • 在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long、float、double类型不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
    注意:String类型是Java7开始支持的。

  • JVM根据两个方面判断两个类是否相同:一是类的全称;另一个是类加载器.

  • 选C、D。考察的是Map接口实现类的创建对象以及对象类型包含的方法

    A选项Map属于接口类型,不可以new的方式创建对象。所以A错误。

    B选项SortedMap属于接口类型,不可以new的方式创建对象。所以B错误。

    C选项HashMap基于哈希表实现Map接口的类,并允许null的值和null键

    D选项TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。

  • 线程同步:喂,SHE

    喂(Vector)

    S(Stack)

    H(hashtable)

    E(enumeration)

  • 凡是带有new String(),都会创建新的对象

String str1="hello";
String str2="he"+ new String("llo");
String str3="hello";
String str4=new String("Hello");
String str5="hel"+"lo";
         
System.out.println(str1==str2);			//false
System.out.println(str1==str3);			//true
System.out.println(str1==str4);			//false
System.out.println(str1==str5);			//true


  • 如果父类中只有有参构造函数,则子类构造函数必须调用。
  • this() 和 super() 不能出现 在同一构造器中,都要在构造器第一行
  • 重载返回值不同,编译时错误
  • 除0是运行时异常
  • 实时系统和分时系统的不同:https://blog.csdn.net/qq_43117978/article/details/105758301

实时操作系统和分时操作系统的区别
分时操作系统和实时操作系统的区别可以从多路性、独立性、及时性、交互性和可靠性5个方面进行比较。
(1) 多路性。实时系统与分时系统一样具有多路性,分时系统按分时原则为多个终端用户服务;而实时系统,其多路性则主要表现在经常对多路的现场信息进行采集及对多个对象或多个执行机构进行控制。
(2) 独立性。实时系统与分时系统一样具有独立性。每个终端用户在向实时系统提出服务请求时,是彼此独立的操作,互不干扰;而且在实时系统中信息的采集和对对象的控制也是彼此互不干扰的。
(3) 及时性。实时系统对实时性的要求与分时系统类似,都是以人能接受的等待时间来确定;但实时系统的及时性,则是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级、百毫秒直至毫秒级,甚至有的要低于100μs。
(4) 交互性。实时系统具有交互性,但这里人与系统的交换,仅限于访问系统中某些特定的专用服务程序。它不像分时系统那样能向终端用户提供数据处理服务、资源共享等服务。
(5) 可靠性。分时系统要求系统可靠,相比之下,实时系统则要求系统高度可靠。因为任何差错都可能带来巨大的经济损失,甚至无法预料的灾难后果。因此,在实时系统中,采取了多级容错措施来保证系统的安全及数据的安全。

  • handler分别处理request和respond:责任链模式:对请求的发送者和接收者进行解耦。
  • img
  • 深拷贝和浅拷贝
    • https://www.cnblogs.com/shakinghead/p/7651502.html 都可以通过重写clone()方法实现,但深拷贝需要再次拷贝 拷贝出来的对象的引用类型
    • ​ https://blog.csdn.net/meism5/article/details/90414050
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值