首页 > 编程语言 >Java基础

Java基础

时间:2023-08-23 20:24:05浏览次数:36  
标签:hash tab 基础 value key Java null public

题1:什么是自动装箱?什么是自动拆箱?
自动装箱是指将基本数据类型重新转化为对象。
public class Test {  
public static void main(String[] args) {  
Integer num = 9;
}  
}  
num = 9的值是属于基本数据类型,原则上不能直接赋值给对象Integer。但是在JDK1.5版本后就可以进行这样的声明自动将基本数据类型转化为对应的封装类型,成为对象后可以调用对象所声明的方法。
自动拆箱是指将对象重新转化为基本数据类型。
public class Test {  
public static void main(String[] args) {  
// 声明Integer对象
Integer num = 9;
// 隐含自动拆箱

System.out.print(num--);
}  
}
由于对象不能直接进行运算,而是需要转化为基本数据类型后才能进行加减乘除。
// 装箱
Integer num = 10;
// 拆箱
int num1 = num;


题2:JDK1.8 中 ConcurrentHashMap 不支持空键值吗?
首先明确一点HashMap是支持空键值对的,也就是null键和null值,而ConcurrentHashMap是不支持空键值对的。

查看一下JDK1.8源码,HashMap类部分源码,代码如下:

public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
}


static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}


HashMap在调用put()方法存储数据时会调用hash()方法来计算key的hashcode值,可以从hash()方法上得出当key==null时返回值是0,这意思就是key值是null时,hash()方法返回值是0,不会再调用key.hashcode()方法。

ConcurrentHashMap类部分源码,代码如下:

public V put(K key, V value) {
return putVal(key, value, false);
}


/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
if (key == null || value == null) throw new NullPointerException();
int hash = spread(key.hashCode());
int binCount = 0;
for (Node<K,V>[] tab = table;;) {
Node<K,V> f; int n, i, fh;
if (tab == null || (n = tab.length) == 0)
tab = initTable();
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
if (casTabAt(tab, i, null,
 new Node<K,V>(hash, key, value, null)))
break;                   // no lock when adding to empty bin
}
else if ((fh = f.hash) == MOVED)
tab = helpTransfer(tab, f);
else {
V oldVal = null;
synchronized (f) {
if (tabAt(tab, i) == f) {
if (fh >= 0) {
binCount = 1;
for (Node<K,V> e = f;; ++binCount) {
K ek;
if (e.hash == hash &&
((ek = e.key) == key ||
 (ek != null && key.equals(ek)))) {
oldVal = e.val;
if (!onlyIfAbsent)
e.val = value;
break;
}
Node<K,V> pred = e;
if ((e = e.next) == null) {
pred.next = new Node<K,V>(hash, key,
  value, null);
break;
}
}
}
else if (f instanceof TreeBin) {
Node<K,V> p;
binCount = 2;
if ((p = ((TreeBin<K,V>)f).putTreeVal(hash, key,
   value)) != null) {
oldVal = p.val;
if (!onlyIfAbsent)
p.val = value;
}
}
}
}
if (binCount != 0) {
if (binCount >= TREEIFY_THRESHOLD)
treeifyBin(tab, i);
if (oldVal != null)
return oldVal;
break;
}
}
}
addCount(1L, binCount);
return null;
}

ConcurrentHashmap在调用put()方法时调用了putVal()方法,而在该方法中判断key为null或value为null时抛出空指针异常NullPointerException。

ConcurrentHashmap是支持并发的,当通过get()方法获取对应的value值时,如果指定的键为null,则为NullPointerException,这主要是因为获取到的是null值,无法分辨是key没找到null还是有key值为null。

题3:父类中静态方法能否被子类重写?
父类中静态方法不能被子类重写。

重写只适用于实例方法,不能用于静态方法,而且子类当中含有和父类相同签名的静态方法,一般称之为隐藏。

public class A {

public static String a = "这是父类静态属性";

public static String getA() {
return "这是父类静态方法";
}
}

public class B extends A{
public static String a = "这是子类静态属性";
public static String getA() {
return "这是子类静态方法";
}

public static void main(String[] args) {
A a =  new B();
System.out.println(a.getA());
}
}

如上述代码所示,如果能够被重写,则输出的应该是“这是子类静态方法”。与此类似的是,静态变量也不能被重写。如果想要调用父类的静态方法,应该使用类来直接调用。

标签:hash,tab,基础,value,key,Java,null,public
From: https://www.cnblogs.com/aoshine/p/17652689.html

相关文章

  • org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(Lorg/apache/tomcat/
    原因<dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>3.1.3</version></dependency>解决<dependency>......
  • SQL注入基础学习5
    SQL注入基础学习5二、靶场实操(开始先学习手工,后面的话,可以采用sqlmap等自动化工具)靶场采用sqli-labs21、第21关第21关是也是属于cookie注入的登陆后查看页面或者报头信息(如图一),会发现,输入时uname=admin1,但是页面上显示的YWRtaW4x说明被编码了,试一下bsae64解码(如图二),图......
  • 1.基础,判断素数
    #include<iostream>#include<math.h>usingnamespacestd;/*判断素数*/intisprime(intnumber){if(number<2){return0;}else{for(inti=2;i<=sqrt(number);i++){if(number%i==0){retu......
  • Java反射介绍
    反射的概述什么是反射Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflecti......
  • 计算机基础知识
    一,计算机基础知识(了解)1,概述-计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。2,组成-由硬件系统和软件系统所组成,没有安装任何软件的计算机称......
  • 基础模型
    for语句的用法注意有些部分没有; 输出1-100内所有三的倍数#include<stdio.h>intmain(){ inti=0; for(i=1;i<=100;i++) { if(i%3==0) printf("%d",i); } return0;}(考虑用函数方法)while语句的用法 求出最大公因数#include<stdio.h>intmain(){ i......
  • 网络安全-修改基础接口配置(MSTP负载均衡)
    [s3-GigabitEthernet0/0/1]disthis#interfaceGigabitEthernet0/0/1portlink-typeaccessportdefaultvlan10#return[s3-GigabitEthernet0/0/1]portde [s3-GigabitEthernet0/0/1]portdefaultvlan1\^Error:Wrongparam......
  • UDS服务基础篇之85服务
    定义:诊断服务85服务主要用于开启或者停止DTC状态位的更新功能,这个功能在主机厂规定的诊断服务规范当中都会有实际的功能及作用。 应用场景一般而言,对于85诊断服务,主要应用场景为以下场合:用于在诊断刷写的过程中关闭DTC记录,因为在刷写的过程中往往是针对某个ECU节点单独进......
  • 深入探索Java中的并发编程:CAS机制的原理与应用
    在当今多核处理器的时代,有效地利用多线程并发成为了现代后端开发的关键。在Java中,CAS(CompareandSwap)机制作为一种乐观锁技术,被广泛用于实现高性能的并发操作。本文将深入分析CAS机制的原理,介绍其在Java中的应用,以及在多线程环境下如何优化并发性能。CAS机制的原理CAS是一种用于实......
  • Android开发行业零基础也可学,看似饱和但人才需求大!
    安卓开发难学吗?首先小编认为任何一门技术的学习,用心学就好学,不用心学再简单的技术你都觉得难学。这也是提醒大家:既然打算学习就要端正好心态。学安卓需要哪些基本知识?先学好Java基础:很多朋友一上手就开始学习Android,似乎太着急了一些。Android应用程序开发是以Java语言为基础的,所以......