精华内容
下载资源
问答
  • HashMap不能使用基本数据类型作为key

    千次阅读 2019-02-21 13:07:30
    在HashMap中,为什么不能使用基本数据类型作为key? 其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序、无索引、不能存储重复元素。 存储元素采用的是hash表存储数据,每存储一个对象的时候,都会...

    在HashMap中,为什么不能使用基本数据类型作为key?

    其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序、无索引、不能存储重复元素。

    存储元素采用的是hash表存储数据,每存储一个对象的时候,都会调用其hashCode()方法,算出其hash值,如果相同,则认为是相同的数据,直接不存储,如果hash值不同,则再调用其equals方法进行比较,如果返回true,则认为是相同的对象,不存储,如果返回false,则认为是不同的对象,可以存储到HashMap集合中。

     之所以key不能为基本数据类型,则是因为基本数据类型不能调用其hashcode()方法和equals()方法,进行比较,所以HashMap集合的key只能为引用数据类型,不能为基本数据类型,可以使用基本数据类型的包装类,例如Integer Double等。

    当然,在HashMap存储自定义对象的时候,需要自己再自定义的对象中重写其hashCode()方法和equals方法,才能保证其存储不重复的元素,否则将存储多个重复的对象,因为每new一次,其就创建一个对象,内存地址是不同的。

    原文:https://blog.csdn.net/weixin_42054155/article/details/80715750 
    HashMap是以key-value形式存储数据,不允许存在相同的key。HashMap中的key可不可以使用对象,可以,但是不推荐。比较对象是否相等,比较的是引用地址。一般需要重写hashcode和equals方法来判断对象是否相等。

    展开全文
  • 箭头函数为什么不能作为构造函数?

    千次阅读 多人点赞 2020-04-04 22:47:03
    这是常见面试题,我就按照我的理解回答常见答案:写法更简洁,没有this指向,this来自上下文,不能作为构造函数,这时候面试官追问,为什么箭头函数不能作为构造函数? 我之前对于这个问题的理解是,构造函数需要...

    在电话面试中,被问到箭头函数和普通函数的区别。这是常见面试题,我就按照我的理解回答常见答案:写法更简洁,没有this指向,this来自上下文,不能作为构造函数,这时候面试官追问,为什么箭头函数不能作为构造函数?

    我之前对于这个问题的理解是,构造函数需要this这个对象,用于接收传来的参数,以及在构造函数最后将这个this return出去。箭头函数没有this,所以不能作为构造函数。

    由于紧张,我的回答逻辑比较混乱,当然答案也不完全对,所以答的很不好,面试官对我的回答不太满意。继续追问,**那箭头函数能被new么?**不能作为构造函数肯定不能new啊,但我当时有点懵,想了一下才回答,应该不能吧。。。面试官看我犹豫,继续追问,那箭头函数有原型函数么?

    其实整个过程面试官都是在引导我,但我由于当天面试状态特别差(也是第一次收到沟通电话同时就开始面试的),所以整个交流过程语无伦次,紧张异常,所以回答特别差,电话里就知道自己挂了。

    现在回来复盘,打算从这个问题开始引申,将相关概念进行细致理解,概念解释都来自MDN。

    整个问题大致包括以下几个概念:

    1. 箭头函数
    2. 构造函数
    3. new运算符
    4. 原型链

    箭头函数

    **箭头函数表达式**的语法比函数表达式更简洁,并且没有自己的thisargumentssupernew.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

    从mdn的文档中可以看到:

    • 没有单独的this
    • 不绑定arguments
    • 箭头函数不能用作构造器,和 new一起用会抛出错误
    • 箭头函数没有prototype属性
      。。。

    这都是和普通函数或者构造函数的区别,我们可以通过打印箭头函数和构造函数来查看区别。

    function Fun(a) {
        this.a = a;
    }
    
    let fun = (b) => {
        this.b = b;
    }
    
    console.dir(Fun);
    console.log(Fun.a);
    console.dir(fun);
    console.log(fun.b);
    

    构造函数运行结果
    箭头函数运行结果

    • 从上面的运行结果也可以看到箭头函数与构造函数相比,缺少了很多东西,比如:caller,arguments,prototype,但同时也可以看到,箭头函数是有__proto__属性的,所以箭头函数本身是存在原型链的,他也是有自己的构造函数的,但是原型链到箭头函数这一环就停止了,因为它自己没有prototype属性,没法让他的实例的__proto__属性指向,所以箭头函数也就无法作为构造函数。
    • 同时我们可以看到,由于箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数,不能绑定this,所以call()和apply()的第一个参数会被忽略。

    MDN的介绍中的有一句箭头函数表达式更适用于那些本来需要匿名函数的地方,那么

    匿名函数能作为构造函数么?

    这里可以做一个简单的测试代码

    // 定义构造函数
    function Fun(a){
        this.a = a
    }
    // 定义匿名函数并赋予变量
    let fun = function(b){
        this.b = b;
    }
    // 对构造函数实例化
    let f1 = new Fun(1);
    let f2 = new fun(2);
    
    // 打印结果
    console.dir(Fun);
    console.dir(f1);
    console.log(f1.a);
    console.dir(fun);
    console.dir(f2);
    console.log(f2.b);
    

    构造函数执行结果
    匿名函数执行结果

    从执行结果可以看出,两个函数结果,除了变量(name,a,b)不同外,函数结构没有任何区别,所以答案是可以

    构造函数和new运算符

    从以上可以看出,构造函数可以说是和new运算符搭配使用的,所以可以通过new运算符的运行过程来看看构造函数

    new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:

    1. 创建一个空的简单JavaScript对象(即{});
    2. 链接该对象(即设置该对象的构造函数)到另一个对象 ;
    3. 将步骤1新创建的对象作为this的上下文 ;
    4. 如果该函数没有返回对象,则返回this。
    function Fun(a){
        this.a = a;
    }
    
    let fun = new Fun(1);
    
    {// new的执行过程
    var this = {} //定义一个空的this变量
    this.__proto__ = Fun.prototype //将实例对象的_proto_属性指向构造函数的原型
    Fun(1).call(this) //将实参带入构造函数,并将构造函数this的指向改为创建的this对象。
    return this //返回这个刚创建的this对象,并赋值给fun变量。
    }
    // 一般情况下,构造函数内不写返回值,返回这个this对象,
    // 但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤
    

    由此可以再一次看出,如果箭头函数能作为构造函数,能够使用new运算符,那么整个过程中,无论是this对象,prototype属性还是call()函数进行this绑定都无法处理,所以对箭头函数使用new运算符会抛出Error

    箭头函数有原型函数么?


    这里的原型函数应该就是指构造函数的显示原型属性,或者更准确的说法是箭头函数有它的构造函数么?

    • 所有的引用类型都有__ proto __属性
    • 只有函数对象有prototype属性
    • 所有的引用类型的__ proto __属性值均指向它的构造函数的prototype的属性值
    • 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去他的__ proto __(即它的构造函数的prototype)中寻找

    所以显然箭头函数是有构造函数的,但特别的是,它作为一个函数,它是没有prototype属性的。

    展开全文
  • 理解Java自定义类作为数据类型——引用数据类型

    千次阅读 多人点赞 2020-01-11 20:01:48
    前言:Java的数据类型按照类型可分为基本数据类型(byte、short、int、long、double、float、char、boolean)和引用数据类型(类(class)、接口(interface)、数组(array)),8种基本数据类型相信只要接触过Java就...

    目录

    说在前面的话

    复现问题

    引用数据类型的理解

    总结


     

    • 说在前面的话

    前言:Java的数据类型按照类型可分为基本数据类型(byte、short、int、long、double、float、char、boolean)和引用数据类型(类(class)、接口(interface)、数组(array)),8种基本数据类型相信只要接触过Java就比较熟悉。而对于引用数据类型相对来说比较陌生,下边会对引用数据类型中的类(class)做一个比较浅显的介绍,这也是由于我自己在学习的过程中碰见了问题,难以理解之后查阅了相关资料稍微理解了一点儿,希望能学习过程中不理解这块的同道中人提供一些可借鉴的地方!!!

    • 复现问题

    下面是我写的两个类,描述问题:可以看到类B的第二个属性被定义为private A a;显然是用了第一个自定义的类 作为数据类型,当我看到这一步我有点儿懵了,经过网上阅读博客借鉴加上自身理解,故有此篇博文!

    public class A {
    	private int age;
    	private String name;
    	……
    }
    
    public class B {
    	private int score;
    	private A a;
    	……
    }
    • 引用数据类型的理解

    引用类型指向一个对象,不是原始值,指向对象的变量是引用变量,那么引用数据类型相较于基本数据类型,与基本数据类型有哪些区别或是特性?我们不妨可以通过一个客户存钱与取钱的例子进行解释:

    Accout类:定义了账号、余额私有属性,定义构造方法对属性进行赋值的同时提供了对应的get/set方法。此外提供取款withdraw()方法以及存款deposit()方法进行相关操作。

    public class Account {
    	
    	private int id;//账号
    	private double balance;//余额
    	public Account(int id, double balance) {//构造方法
    		this.id = id;
    		this.balance = balance;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public double getBalance() {
    		return balance;
    	}
    	public void setBalance(double balance) {
    		this.balance = balance;
    	}
    	public void withdraw(double amount) {//取款
    		if (balance >= amount) {
    			balance -= amount;
    			System.out.println("取款成功:" + amount + "元," + "账户余额为:" + this.getBalance() + "元");
    		} else {
    			System.out.println("取款失败");
    		}
    	}
    	public void deposit(double amount) {//存款
    		if(amount > 0) {
    			balance += amount;
    			System.out.println("存款成功:" + amount + "元," + "账户余额为:" + this.getBalance() + "元");
    		} else {
    			System.out.println("存款失败");
    		}
    	} 
    	
    }

     

    Customer类:定义了name私有属性,使用Java自定义类Account作为属性数据类型(重复上文提到的:引用类型指向一个对象,不是原始值,指向对象的变量是引用变量),是否可以理解为Customer类中属性是包含Account类的,private Account account是否可以说是定义了Account类的一个对象,正如灯管和灯泡,灯管中必定是包含着灯泡的。

    public class Customer {
    	
    	private String name;//姓名
    	private Account account;//账单,引用数据类型,与String类型进行比较,String[] string = new String[10];
    	public Customer(String name) {//构造方法
    		this.name = name;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Account getAccount() {
    		return account;
    	}
    	public void setAccount(Account account) {
    		this.account = account;
    	}
    }
    

     

    CustomerTest类:测试类,我们先定义了Customer类的一个对象并通过构造方法赋值,接着定义了Account类的一个对象并赋值,比较重要的一步是如何将账户信息与客户之间建立联系,我们在Customer类中提供了account属性的set方法,可以将我们定义的Account类的对象作为参数调用Customer类对象的setAccoount()方法,这样我们就使得客户有了自己的账户信息,这也就是类作为引用数据类型的一个作用。

    public class CustomerTest {
    	public static void main(String[] args) {
    		Customer customer = new Customer("haitao");//创建用户对象customer
    		
    		Account account = new Account(1000, 2020);//创建账单对象
    
    		customer.setAccount(account);//实现客户与账单的联系
    		System.out.println("当前客户ID:" + account.getId() + ",账户余额为:"+ account.getBalance() + "元");
    		System.out.println("**********************************");
    		customer.getAccount().deposit(100);//存款
    		customer.getAccount().withdraw(960);//取款
    	}
    }
    

     在eclipse中运行程序,我们将会看到以下的结果:

    • 总结

    我们可以看到Java自定义类作为数据类型的一个作用,可以使得两个类之间能够建立起联系,博文只是简单的从表面上进行了类作为引用数据类型的一些介绍,并没有进行更加深入细致的详解,毕竟我本人也就是一个初学者,自己的理解也没有大牛那么深刻,可能在一些细节的表述有出入不恰当,欢迎大家指正共同进步,希望对大家有所帮助!

    展开全文
  • typedef声明新类型名 前言 在学习 Linux 的 signal 函数时,man 手册查询时得到以下信息,因为以前使用typedef的用法都是类似typedef int s32;,所以看到下面的用法就看懂了。于是翻了翻书整理一下typedef的用法...

    前言

    在学习 Linux 的 signal 函数时,man 手册查询时得到以下信息,因为以前使用typedef的用法都是类似typedef int s32;,所以看到下面的用法就看不懂了。于是翻了翻书整理一下typedef的用法。

    #include <signal.h>
    
    typedef void (*sighandler_t)(int);
    
    sighandler_t signal(int signum, sighandler_t handler);
    

    用法

    1.用一个新类型名代替原有的类型名

    这样有个好处,可以提高可移植性。

    typedef int s32;   //指定用s32作为类型名,所用与int相同
    typedef char s8;   //指定用s8作为类型名,所用与char相同
    

    2.命名一个简单的类型名代替复杂的类型表示方法

    C程序中除了简单类型名(int、char等),还有许多看起来复杂的类型名(结构体类型、共用体类型、指针类型等),C允许程序设计者用一个简单的名字代替复杂的名字。

    1)命名一个新的类型名代表结构体类型

    typedef struct {
    	int month;
    	int day;
    }Date;
    
    Date today;  //定义变量
    

    声明了新的类型名Date,然后可以用新的类型名Date去定义变量。

    2)命名一个新的类型名代表数组类型

    typedef int Num[100];	//声明Num为整形数组类型名
    Num a;			//定义a为整形数组名,它有100个元素
    

    3)命名一个新的类型名代表指针类型

    typedef char* String;	//声明String为字符指针类型
    String p;		//定义p为字符指针变量
    

    4)命名一个新的类型名代表指向函数的指针类型

    typedef int (* Pointer)();	//声明Pointer为指向函数的指针类型,函数返回整型值
    Pointer p;			//p为Pointer类型的指针变量
    

    归纳起来,声明一个新的类型名的方法是:
    ①先按定义变量的方法写出定义体(如int i;)。
    ②将变量名换成新类型名(例如:将i换成Count)。
    ③在最前面加typedef(例如:typedef int Count)。
    ④然后可以用新类型名去定义变量。

    简单地说,就是 按定义变量的方式,把变量名换上新类型名,并且在最前面加“typedef”,就声明了新类型名代表原来的类型
    习惯上,常把用typedef声明的类型名的第一个字母用大写表示,以便于系统提供的标准类型标识符相区别。

    展开全文
  • 1、问题描述 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 ...形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能...
  • 以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参解析:返回值存在寄存器中,...
  • 使用聚集索引查询效率更高,但对表的更新效率影响较大,因此适用于更新读写比较大的表,例如商品详情(创建后很少改动,查看的频率却相对较高) 使用非聚集索引则查询效率较低,对表的更新效率影响较小,适用...
  • 以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有: 正确答案: C D 你的答案: 空 (错误) 如果变量bVar是布尔类型:if(false==bVar){doSomeThing();} ...
  • 【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识;【1】 Varargs 警告1.1)一个相关问题: 向参数个数可变的方法传递一个泛型...
  • Java 泛型什么情况下不能使用

    千次阅读 2020-05-08 02:22:32
    但是有些情况下泛型也是允许使用的,以下不能使用泛型的一些场景。 二、 什么情况下不能使用Java泛型 1 不能使用泛型的形参创建对象。 T o=new T(); // 允许 2 在泛型类中,不能给静态成员变量定义泛型 Java ...
  • 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是...
  • 第7章 函数--C++ primer学习笔记 7.1 概述7.2 函数原型7.2.1函数返回类型函数类型和内置数组类型不能用做返回类型。 // 非法:数组不能做返回类型 int[10] foo_bar();类类型和容器类型可以被直接返回7.2.2函数参数...
  • C++传入任意的函数类型作为参数

    千次阅读 2018-12-16 22:54:28
    C++编程中,有些时候需要传入函数作为参数,这在STL中作为谓词经常用到。传入的可以是函数、函数对象和lambda表达式。编程的时候,把它当成一个模板类型传入即可。以下给出一个简单的例子: #include &amp;lt;...
  • 在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的...一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量...
  • 可变类型包括dict,list都可以作为字典的key,而原子类型以及tuple则可以。
  • 将一个结构体中变量中的数据传递给另一个函数,有以下三种方法。...(1)结构体变量名作为参数。 复制代码代码如下: #include #include using namespace std; struct Student{ string name;
  • 本文简单的例子说明了C语言中数组做函数参数,数组a与&a区别,数组a的"数据类型",以及编译器的不同,相应指针所占字节的不同导致程序的细微差别。
  • Oracle中把Array类型作为参数传入存储过程并用Java对其进行调用的示例是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程……  Oracle中把Array类型作为参数传入存储过程并用Java对其进行调用...
  • 如果设置了支持的值,不会导致错误,并将使用最接近支持的 CursorType。adUseStatic 支持所有Recordset的属性与方法adUseStatic 值为3 静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他...
  • C语言中数组名作为参数进行函数传递在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在数组名作函数参数时...
  • 扩展“.mdb”可能正确。 请检查以下的 URL 并确保其拼写正确。 请求的 URL: /topskyweb/topskyadminadmin/file/temp/01sdf.mdb 如果你的程序需要下载mdb文件,只需启用mdb下载即可 启用锁定文件扩展的下载...
  • Java-使用反射获取类型信息

    千次阅读 2018-09-18 19:30:33
    Java中如何使用反射获取类型信息?Java中如何使用反射获取类型信息?一个简单类的例子分析如何获取不同属性的类型1、普通类型2、数组类型3、带泛型的类型4、复杂的嵌套类型5、多个泛型参数总结 Java中如何使用反射...
  • 当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种...
  • Go语言(三):变量的基本使用以及枚举类型使用(代码) 直接上代码吧: package main import ( "fmt" "math" "math/cmplx" ) /* go语言中,类型定义在后变义量定在前,...
  • 苹果也开始认真地吃自己的狗食了,我们看到这届大会上推出了几个 Swift 写的 iOS 框架,占篇幅最大的,无疑是 SwiftUI。为了这个框架写得6,苹果可以改语言,还不止一处。这次给大家介绍的是 Swift 5....
  • 本系列作为Effective JavaScript的读书笔记。   ECMAScript标准并没有规定对JavaScript的Object类型中的属性的存储顺序。   但是在使用for..in循环对Object中的属性进行遍历的时候,确实是需要依赖于某种顺序...
  • Oracle数据库中表的字段设置为:date类型(这里我需要时间,因此采用了date型,如果需要时间似乎应采用timestamp类型); 模型层表对应的pojo类及hibernate映射文件中属性的类型为java.util.Date; 表现层采用...
  • 关于静态方法为什么不能使用类的泛型 class demo{ public static T show (T tmp){ return tmp; } } 泛型类中的静态方法不能使用类的泛型而应该将该方法定义为泛型方法 泛型类中的静态方法不能使用类的泛型而应该将...
  • MySQL字段命名不能使用的MySQL关键字

    千次阅读 2019-04-11 15:03:40
    在MySQL数据库中,Table字段不能使用MySQL关键字或以关键字开头。 在设计mysql表里的字段的时候,避免使用以下关键字开头。否则则会查询出错 # mysql关键字有以下这些: ADD ALL ALTER...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,235,354
精华内容 494,141
关键字:

以下不能作为类型名使用的是