牛客 - Java专项练习题知识点整理(四)

目录

构造方法修饰符

泛型

Java线程之间的通信

for语句执行流程

异常类Throwable

String classFile = "com.jd.".replaceAll(".","/")+"MyClass.class";

子类调用父类构造函数

进制的表现形式

HashMap如何解决hash冲突

Java是从哪个语言改进而来的

Java回收算法

ArrayList构造函数

Spring AOP 增强

对象的加载方式

URL地址


构造方法修饰符

构造方法不能被 static、final、synchronized、abstract、native修饰,但可以被 public、private、protected修饰。

构造函数不能被继承,只能被显式或隐式的调用。

泛型

1. 创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。

2. JVM如何理解泛型概念 — 类型擦除。

        事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。

总结

1. 虚拟机中没有泛型,只有普通类和方法。

2. 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)

3. 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。

补充:桥方法

Java中的类型擦除与桥方法

Java线程之间的通信

        Java线程之间的通信由Java内存模型(简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

        volatile变量的读写可以实现线程之间的通信。

        从内存语义的角度来说,volatile与监视器锁有相同的效果:volatile写和监视器的释放有相同的内存语义;volatile读与监视器的获取有相同的内存语义。

for语句执行流程

for(条件1;条件2;条件3) {

    //语句

}

执行顺序是:条件1->条件2->语句->条件3->条件2->语句->条件3->条件2........

如果条件2为true,则一直执行。如果条件2为false,则for循环结束

异常类Throwable

1. Exception(异常)

        是程序本身可以处理的异常。

2. Error(错误)

        是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。

3. 检查异常(编译器要求必须处理的异常)

        除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

4. 非检查异常(编译器不要求处置的异常)

        包括运行时异常(RuntimeException与其子类)和错误(Error)。

String classFile = "com.jd.".replaceAll(".","/")+"MyClass.class";

        由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/"。如果想替换的只是".",那么就要写成\\.

///MyClass.class

String classFile1 = "com.jd.".replaceAll(".","/")+"MyClass.class";

com/jd/MyClass.class

String classFile2 = "com.jd.".replaceAll("\\.","/")+"MyClass.class";

子类调用父类构造函数

        子类构造方法在调用时必须先调用父类的,由于父类没有无参构造,必须在子类中显式调用父类有参构造函数,修改子类构造方法如下即可:

public Derived(String s){
    super("s");
    System.out.print("D");
}

进制的表现形式

二进制:1000

八进制:010 ,以0开头

十六进制:0x8 ,以0x开头

HashMap如何解决hash冲突

        在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。在最坏的情况下,这种方式会将HashMap的get方法的性能从O(1)降低到O(n)。

        为了解决在频繁冲突时hashmap性能降低的问题,Java 8中使用平衡树来替代链表存储冲突的元素。这意味着我们可以将最坏情况下的性能从O(n)提高到O(logn)。

Java是从哪个语言改进而来的

java是类C语言,从C++改进而来

去掉了指针和多继承,采用自动垃圾回收等

Java回收算法

两个最基本的java回收算法:复制算法标记-清除算法。

1. 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法

2. 标记-清理算法:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出

3. 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象

两个概念:新生代和年老代

1. 新生代:初始对象,生命周期短的

2. 年老代:长时间存在的对象

整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。

P.S:

1. Serial New收集器是针对新生代的收集器,采用的是复制算法

2. Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理

3. Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法

4. Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理

5. Parallel Old(并行)收集器,针对老年代,标记整理

6. CMS收集器,基于标记清理

7. G1收集器:整体上是基于标记整理 ,局部采用复制

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理

ArrayList构造函数

1. ArrayList(),构造一个初始容量为 10 的空列表。

2. ArrayList(Collection<? extends E> c),构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

3. ArrayList(int initialCapacity),构造一个具有指定初始容量的空列表。

Spring AOP 增强

Spring当中的专业术语-advice,翻译成中文就是增强的意思。

所谓增强,其实就是向各个程序内部注入一些逻辑代码从而增强原有程序的功能。

具有5大通知类型:前置通知后置通知返回后通知异常通知环绕通知

Spring事务基于Spring AOP,Spring AOP底层用的动态代理,动态代理有两种方式:

1. 基于接口代理(JDK代理)

        基于接口代理,凡是类的方法非public修饰,或者用了static关键字修饰,那这些方法都不能被Spring AOP增强

2. 基于CGLib代理(子类代理)

        基于子类代理,凡是类的方法使用了private、static、final修饰,那这些方法都不能被Spring AOP增强

对象的加载方式

1. new时初始化 ;

2. 静态工厂 newInstance;

3. 反射 Class.forName();

4. clone 方式;

5. 反序列化;

URL地址

URL(Uniform Resource Locator) ,统一资源定位符,能够对因特网的资源进行定位。

URL一般有四部分组成: <协议>://<主机>:<端口>/<路径> 如: http://localhost:8080/test

现在最常用的<协议>为http协议。

<主机>是指主机在因特网上的域名。

http协议的默认<端口>为80(可以省略)。

<路径>是指文件的路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值