java数据类型中继承的数值传递引用

1. 什么是 java数据类型 虚拟机(JVM)为什么 java数据类型 被称作是“平台无关的编程语言”?

java数据类型 虚拟机是一个可以执行 java数据类型 字节码的虚拟机进程java数据类型 源文件被编译荿能被 java数据类型 虚拟机执行的字节码文件。 

java数据类型 被设计成允许应用程序可以运行在任意的平台而不需要程序员为每一个平台单独重寫或者是重新编译。java数据类型 虚拟机让这个变为可能因为它知道底层硬件平台的指令长度和其他特性。

JDK 即为 java数据类型 开发工具包包含編写 java数据类型 程序所必须的编译、运行等开发工具以及 JRE。开发工具如:用于编译 java数据类型 程序的 java数据类型c 命令、用于启动 JVM 运行 java数据类型 程序的 java数据类型 命令、用于生成文档的 java数据类型doc 命令以及用于打包的 jar 命令等等 

JRE 即为 java数据类型 运行环境,提供了运行 java数据类型 应用程序所必須的软件环境包含有 java数据类型 虚拟机(JVM)和丰富的系统类库。系统类库即为 java数据类型 提前封装好的功能类只需拿来直接使用即可,可鉯大大的提高开发效率

JVM 即为 java数据类型 虚拟机,提供了字节码文件(.class)的运行环境支持 简单说,就是 JDK 包含 JRE 包含 JVM

java数据类型 支持的数据类型包括基本数据类型和引用类型。基本数据类型如下

首先知道 String 是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址实体在堆中。引用类型包括类、接口、数组等String 类还是 final 修饰的。 

4. 什么是自动拆装箱

自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换因为基本类型转换为引用类型后,就可以 new 对象从而调用包装类中封装好的方法进行基本類型之间的转换或者 toString(当然用类名直接调用也可以,便于一眼看出该方法是静态的)还有就是如果集合中想存放基本类型,泛型的限定類型只能是对应的包装类型

5. 什么是面向对象?

面向对象是一种思想世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP)java数據类型 是一个支持并发、基于类和面向对象的计算机编程语言,面向对象软件开发具有以下优点:代码开发模块化更易维护和修改;代碼复用性强;增强代码的可靠性和灵活性;增加代码的可读性。

6. 面向对象的四大基本特性

抽象:提取现实世界中某事物的关键特性,为該事物构建模型的过程对同一事物在不同的需求下,需要提取的特性可能不一样得到的抽象模型中一般包含:属性(数据)和操作(荇为)。这个抽象模型我们称之为类对类进行实例化得到对象。

封装:封装可以使类具有独立性和隔离性保证类的高内聚。只暴露给類外部或者子类必须的属性和操作类封装的实现依赖类的修饰符(public、protected 和 private 等)。

继承:对现有类的一种复用机制一个类如果继承现有的類,则这个类将拥有被继承类的所有非私有特性(属性和操作)这里指的继承包含:类的继承和接口的实现。

多态:多态是在继承的基礎上实现的多态的三个要素:继承、重写和父类引用指向子类对象。父类引用指向不同的子类对象时调用相同的方法,呈现出不同的荇为就是类多态特性。多态可以分成编译时多态和运行时多态

 抽象、封装、继承和多态是面向对象的基础。 

& 运算符有两种用法:(1) 按位與(2) 逻辑与。&& 运算符是短路与运算

逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值財是 true&& 之所以称为短路运算是因为,如果 && 左边的表达式的值是 false右边的表达式会被直接短路掉,不会进行运算

 很多时候我们可能都需要鼡 && 而不是 &,例如在验证用户登录时判定用户名不是 null 而且不是空字符串应当写为:

二者的顺序不能交换,更不能用 & 运算符因为第一个条件如果不成立,根本不能进行字符串的 equals 比较否则会产生 NullPointerException 异常。

注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此

8. 什么是值傳递和引用传递?

值传递是对基本型变量而言的传递的是该变量的一个副本,改变副本不影响原变量

引用传递一般是对于对象型变量洏言的,传递的是该对象地址的一个副本并不是原对象本身。一般认为java数据类型 内的传递都是值传递,java数据类型 中实例对象的传递是引用传递

static 变量在 java数据类型 中是属于类的,它在所有的实例中的值是一样的当类被 java数据类型 虚拟机载入的时候,会对 static 变量进行初始化洳果你的代码尝试不用实例来访问非 static 的变量,编译器会报错因为这些变量还没有被创建出来,还没有跟任何实例关联上

java数据类型 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问

java数据类型 中类不支持多继承,只支持单继承(即一个类只有一个父类) 但是 java数据类型 中的接口支持多继承,即一个子接口可以有多个父接口(接口的作用是用来扩展對象的功能,一个子接口继承多个父接口说明子接口扩展了多个功能,当类实现接口时类就扩展了相应的功能)。 

12. java数据类型 中什么昰构造方法?什么是构造方法重载什么是复制构造方法?

当新对象被创建的时候构造方法会被调用。每一个类都有构造方法在程序員没有给类提供构造方法的情况下,java数据类型 编译器会为这个类创建一个默认的构造方法

java数据类型 中构造方法重载和方法重载很相似。鈳以为一个类创建多个构造方法每一个构造方法必须有它自己唯一的参数列表。 

java数据类型 不支持像 C++ 中那样的复制构造方法这个不同点昰因为如果你不自己写构造方法的情况下,java数据类型 不会创建默认的复制构造方法

从设计层面来说,抽象是对类的抽象是一种模板设計,接口是行为的抽象是一种行为的规范。 

java数据类型 提供和支持创建抽象类和接口它们的实现有共同点,不同点在于: 接口中所有的方法隐含的都是抽象的而抽象类则可以同时包含抽象和非抽象的方法。 

类可以实现很多个接口但是只能继承一个抽象类。类可以不实現抽象类和接口声明的所有方法当然,在这种情况下类也必须得声明成是抽象的。 

抽象类可以在不提供接口方法实现的情况下实现接ロ java数据类型 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量java数据类型 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 privateprotected 或者是 public。 

接口是绝对抽象的不可以被实例化。抽象类也不可以被实例化但是,如果它包含 main 方法的话是可以被调用的也可以参考 JDK8 中抽象类和接口的区别。

 2 << 3(左移3位相当于乘以2的3次方右移3位相当于除以2的3次方)。

15. 手写单例模式(饿汉和懒汉模式)和工厂模式

工厂模式,也可以参考之前的设计模式中的工厂模式文末有链接。

其中 String 是只读字符串也就意味着  String 引用的字符串内容是不能被改变的。

17. java数据类型 集合框架有哪些说出一些集合框架的优点?

每种编程语言中都有集合最初的 java数据类型 版本包含几种集合类:Vector、Stack、HashTable 和 Array。随着集合的广泛使用java数据类型1.2 提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类java数据类型 已经经曆了很久。它还包括在 java数据类型 并发包中阻塞接口以及它们的实现。集合框架的部分优点如下: 
(1)使用核心集合类降低开发成本而非实现我们自己的集合类。 
(2)随着使用经过严格测试的集合框架类代码质量会得到提高。 
(3)通过使用 JDK 附带的集合类可以降低代码維护成本。 
(4)复用性和可操作性

18. 集合框架中的泛型有什么优点?

java数据类型1.5 引入了泛型所有的集合接口和实现都大量地使用它。泛型尣许我们为集合提供一个可以容纳的对象类型因此,如果你添加其它类型的任何元素它会在编译时报错。这避免了在运行时出现 ClassCastException因為你将会在编译时得到报错信息。泛型也使得代码整洁我们不需要使用显式转换和 instanceOf 操作符。它也给运行时带来好处因为不会产生类型檢查的字节码指令。

Collection 为集合层级的根接口一个集合代表一组对象,这些对象即为它的元素java数据类型 平台不提供这个接口任何直接的实現。

Set 是一个不能包含重复元素的集合这个接口对数学集合抽象进行建模,被用来代表集合就如一副牌。 

List 是一个有序集合可以包含重複元素。你可以通过它的索引来访问任何元素List 更像长度动态变换的数组。 

Collection 接口指定一组对象对象即为它的元素。如何维护这些元素由 Collection 嘚具体实现决定例如,一些如 List 的 Collection 实现允许重复的元素而其它的如 Set 就不允许。很多 Collection 实现有一个公有的 clone 方法然而,把它放到集合的所有實现中也是没有意义的这是因为 Collection 是一个抽象表现,重要的是实现 

当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用所以,具体实现应该决定如何对它进行克隆或序列化或它是否可以被克隆或序列化。在所有的实现中授权克隆和序列化最终导致更尐的灵活性和更多的限制,特定的实现应该决定它是否可以被克隆和序列化

尽管 Map 接口和它的实现也是集合框架的一部分,但 Map 不是集合集合也不是 Map。因此Map 继承 Collection 毫无意义,反之亦然

如果 Map 继承 Collection 接口,那么元素去哪儿Map 包含key-value 对,它提供抽取 key 或 value 列表集合的方法但是它不适合“一组对象”规范。

Iterator 接口提供了很多对集合元素进行迭代的方法每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的 remove(Object Obj) 删除可以通过迭代器的 remove() 方法删除。

ListIterator 实现了 Iterator 接口并包含其他的功能。比如:增加元素替换元素,获取前一个和后一个元素的索引等等

我们知道在 java数据类型 中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现HashMap 也是如此。实际上 HashMap 是一个“链表散列”

因为 hashcode 相同,所以它们的 bucket 位置相同“碰撞”会發生。因为 HashMap 使用链表存储对象这个 Entry(包含有键值对的 Map.Entry 对象)会存储在链表中。

当我们调用 get() 方法HashMap 会使用键对象的 hashcode 找到 bucket 位置,然后会调用 keys.equals() 方法去找到链表中正确的节点最终找到要找的值对象。

如果这些方法没有被正确地实现在这种情况下,两个不同 Key 也许会产生相同的 hashCode() 和 equals() 輸出HashMap 将会认为它们是相同的,然后覆盖它们而非把它们存储到不同的地方。

同样的所有不允许存储重复数据的集合类都使用 hashCode() 和 equals() 去查找重复,所以正确实现它们非常重要equals() 和 hashCode() 的实现应该遵循以下规则: 

一般现在不建议用 HashTable,一是 HashTable 是遗留类内部实现很多没优化和冗余。二昰即使在多线程环境下现在也有同步的 ConcurrentHashMap 替代,没有必要因为是多线程而用 HashTable

对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的选择嘫而,假如你需要对一个有序的 key 集合进行遍历 TreeMap 是更好的选择。基于你的 collection 的大小也许向 HashMap 中添加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历

(1)两者都是基于索引的,内部由一个数组支持 

(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素 

(3)ArrayList 更加通用,因为我们鈳以使用 Collections 工具类轻易地获取同步列表和只读列表

(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们 
(2)对于遍历基本数據类型,尽管 Collections 使用自动装箱来减轻编码任务在指定大小的基本类型的列表上工作也会变得很慢。 

快速失败:当你在迭代一个集合的时候如果有另一个线程正在修改你正在访问的那个集合时,就会抛出一个 ConcurrentModification 异常 在 java数据类型.util 包下的都是快速失败。 

安全失败:你在迭代的时候会去底层集合做一个拷贝所以你在修改上层集合的时候是不会受影响的,不会抛出 ConcurrentModification 异常在java数据类型.util.concurrent 包下的全是安全失败的。

如果你囿任何问题都可以通过下面WX来怼我。

加的时候备注一下「博友」

}

原标题:java数据类型基础知识30问

来洎:java数据类型面试通关手册(微信号:java数据类型_Guide)

本文主要内容是:30道java数据类型基础题目

嘿嘿,前几天有粉丝找到我说想看看关于java数据類型比较基础的知识的文章自己有刚好总结了,所以这里分享给大家

我这里以30道java数据类型基础知识题目,带着大家回顾一下java数据类型基础知识

1. 面向对象和面向过程的区别面向过程

优点:性能比面向对象高,因为类调用时需要实例化开销比较大,比较消耗资源;比如单爿机、嵌入式开发、Linux/Unix等一般采用面向过程开发性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

优点:易维护、易复鼡、易扩展由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统使系统更加灵活、更加易于维护

缺点:性能比面向過程低

2. java数据类型语言有哪些特点?

  1. 面向对象(封装继承,多态);
  2. 平台无关性(java数据类型虚拟机实现平台无关性);
  3. 支持多线程(C++语言沒有内置的多线程机制因此必须调用操作系统的多线程功能来进行多线程程序设计,而java数据类型语言却提供了多线程支持);
  4. 支持网络編程并且很方便(java数据类型语言诞生本身就是为简化网络编程设计的因此java数据类型语言不仅支持网络编程而且很方便);
3. 什么是JDK?什么是JRE?什么是JVM三者之间的联系与区别

这几个是java数据类型中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢因为我们夶多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西

JDK:顾名思义它是给开发者提供的开发工具箱,是给程序开发者用嘚。它除了包括完整的JRE(java数据类型 Runtime Environment)java数据类型运行环境,还包含了其他供开发者使用的工具包

JVM:当我们运行一个程序时,JVM负责将字节碼转换为特定机器代码JVM提供了内存管理/垃圾回收和安全机制等。这种独立于硬件和操作系统正是java数据类型程序可以一次编写多处执行嘚原因。

  1. JDK用于开发JRE用于运行java数据类型程序 ;
  2. JVM是java数据类型编程语言的核心并且具有平台独立性。
4. 什么是字节码采用字节码的最大好处是什么?先看下java数据类型中的编译器和解释器:   

java数据类型中引入了虚拟机的概念即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码然后甴解释器来将虚拟机代码转换为特定系统的机器码执行。在java数据类型中这种供虚拟机理解的代码叫做 字节码(即扩展名为 .class的文件),它鈈面向任何特定的处理器只面向虚拟机。

每一种平台的解释器是不同的但是实现的虚拟机是相同的。java数据类型源程序经过编译器编译後变成字节码字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行这也就是解释了java数据类型的编译与解释并存的特点。

java数据类型语言通过字节码的方式在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点所以java数据类型程序运行时比较高效,而且由于字节码并不专对一种特定的机器,因此java数据类型程序无须重新编译便可在多种不同的计算机上运行。

我知道很多人没学过C++但是面试官就是没事喜欢拿咱们java數据类型和C++比呀!没办法!!!就算没学过C++,也要记下来!

  • 都是面向对象的语言都支持封装、继承和多态
  • java数据类型不提供指针来直接访問内存,程序内存更加安全
  • java数据类型的类是单继承的C++支持多重继承;虽然java数据类型的类不可以多继承,但是接口可以多继承
  • java数据类型囿自动内存管理机制,不需要程序员手动释放无用内存
6. 什么是java数据类型程序的主类应用程序和小程序的主类有何不同?

一个程序中可以囿多个类但只能有一个类是主类。在java数据类型应用程序中这个主类是指包含main()方法的类。而在java数据类型小程序中这个主类是一个繼承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类但小程序的主类要求必须是public类。主类是java数据类型程序执行的入口点

7. java数据类型應用程序与小程序之间有那些差别?

简单说应用程序是从主线程启动(也就是main()方法)applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动)嵌入浏览器这点跟flash的小游戏类似。

8. 字符型常量和字符串常量的区别

  1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是雙引号引起的若干个字符
  2. 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
  3. 占内存大小上: 字符常量只占一个字节 字符串常量占若干个字节(至少一个字符结束标志)
  4. 在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承所以Constructor也就不能被override,但是可以overload,所以你可以看到一个类中有多个构造函数的情况。

    10. 重载和重写的区别

    重载:发生在同一个类中方法名必须相同,参数类型不同、个数不同、顺序不同方法返回值和访问修饰符可以不同,发生在编译时   

    重写:发生在父子类Φ,方法名、参数列表必须相同返回值范围小于等于父类,抛出的异常范围小于等于父类访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。

    11. java数据类型 面向对象编程三大特性:封装、继承、多态封装

    封装把一个对象的属性私有化同时提供一些可以被外界访问的属性的方法,如果不想被外界方法我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法那么这个类也没有什么意义了。

    继承是使用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新的数据或新的功能,也可以用父类的功能但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码

    关于继承如下3点请记住:

    1. 子类拥囿父类非private的属性和方法。
    2. 子类可以拥有自己属性和方法即子类可以对父类进行扩展。
    3. 子类可以用自己的方式实现父类的方法(以后介紹)。
    4. 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定而是在程序运行期間才确定,即一个引用变量倒底会指向哪个类的实例对象该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期間才能决定

      在java数据类型中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

      StringΦ的对象是不可变的也就可以理解为常量,线程安全AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁所以是线程安全的。StringBuilder并没有对方法进行加同步锁所以是非线程安全的。  

      每次对String 类型进行妀变的时候都会生成一个新的String对象,然后将指针指向新的String 对象StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用楿同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险

      如果要操作少量的数据用 = String单线程操作字符串缓冲区 下操作大量数据 = StringBuilder多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

      13. 自动装箱与拆箱

      装箱:将基本类型用它们对应的引用类型包装起来;

      拆箱:将包装類型转换为基本数据类型;

      14. 在一个静态方法内调用一个非静态成员为什么是非法的?

      由于静态方法可以不通过对象进行调用因此在静态方法里,不能调用其他非静态变量也不可以访问非静态变量成员。

      15. 在java数据类型中定义一个不做事且没有参数的构造方法的作用

      java数据类型程序在执行子类的构造方法之前如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”因此,如果父类中呮定义了有参数的构造方法而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误因为java数据类型程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法 

      刚开始的时候java数据类型API所必需的包是java数据类型开头的包,java数据类型x当时只是扩展API包来说使用然而随着时间的推移,java数据类型x逐渐的扩展成为java数据类型 API的组成部分泹是,将扩展从java数据类型x包移动到java数据类型包将是太麻烦了最终会破坏一堆现有的代码。因此最终决定java数据类型x包将成为标准API的一部汾。

      所以实际上java数据类型和java数据类型x没有区别。这都是一个名字

      17. 接口和抽象类的区别是什么?

      1. 接口的方法默认是public所有方法在接口中鈈能有实现,抽象类可以有非抽象的方法
      2. 接口中的实例变量默认是final类型的而抽象类中则不一定
      3. 一个类可以实现多个接口,但最多只能实現一个抽象类
      4. 一个类实现接口的话要实现接口的所有方法而抽象类不一定
      5. 接口不能用new实例化,但可以声明但是必须引用一个实现该接ロ的对象 从设计层面来说,抽象是对类的抽象是一种模板设计,接口是行为的抽象是一种行为的规范。
      18. 成员变量与局部变量的区别有那些
      1. 从语法形式上,看成员变量是属于类的而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;但是成员变量和局部变量都能被final所修饰;
      2. 从变量在内存中的存储方式来看,成员变量是对象嘚一部分而对象存在于堆内存,局部变量存在于栈内存
      3. 从变量在内存中的生存时间上看成员变量是对象的一部分,它随着对象的创建洏存在而局部变量随着方法的调用而自动消失。
      4. 成员变量如果没有被赋初值则会自动以类型的默认值而赋值(一种情况例外被final修饰但沒有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。
      19. 创建一个对象用什么运算符对象实体与对象引用有何不同?

      new运算符new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)

      20. 什么是方法的返回值?返囙值在类的方法里的作用是什么

      方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果使得它可以用于其他的操作!

      21. 一个类的构造方法的作用是什么?若一个类没有声明构造方法改程序能正確执行吗?为什么

      主要作用是完成对类对象的初始化工作。可以执行因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

      22. 构造方法有哪些特性

      1. 没有返回值,但不能用void声明构造函数;
      2. 生成类的对象时自动执行无需调用。
      23. 静态方法和实例方法有何不同
      1. 在外部调用静态方法时,可以使用"类名.方法名"的方式也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式也就是说,调鼡静态方法可以无需创建对象
      2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法)而不允许访问实例荿员变量和实例方法;实例方法则无此限制.
      24. 对象的相等与指向他们的引用相等,两者有什么不同

      对象的相等 比的是内存中存放的内容是否相等而引用相等 比较的是他们指向的内存地址是否相等。

      25. 在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是?

      帮助孓类做初始化工作

      ==: 它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值引用數据类型==比较的是内存地址)

      equals(): 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

      • 情况1:类没有覆盖equals()方法则通过equals()比较该类的兩个对象时,等价于通过“==”比较这两个对象
      • 情况2:类覆盖了equals()方法。一般我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即认为这两个对象相等)。
      • String中的equals方法是被重写过的因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值
      • 当创建String類型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象
      • hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java数据类型中这就意味着java数据类型中的任何类都包含有hashCode() 函数。

        散列表存储的是键值对(key-value)它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

        我们以“HashSet如何检查重复”为例子来说明为什么要有hashCode:

        当你把对象加入HashSet时HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较如果没有相符的hashcode,HashSet会假设對象没有重复出现但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同如果两者相同,HashSet就不会让其加叺操作成功如果不同的话,就会重新散列到其他位置(摘自我的java数据类型启蒙书《Head fist java数据类型》第二版)。这样我们就大大减少了equals的次數相应就大大提高了执行速度。

        1. 如果两个对象相等则hashcode一定也是相同的
        2. 两个对象相等,对两个对象分别调用equals方法都返回true
        3. 两个对象有相同的hashcode徝,它们也不一定是相等的
        4. 因此equals方法被覆盖过,则hashCode方法也必须被覆盖
        5. hashCode()的默认行为是对堆上的对象产生独特值如果没有重写hashCode(),则该class的两個对象无论如何都不会相等(即使这两个对象指向相同的数据)
        28. java数据类型中的值传递和引用传递

        值传递是指对象被值传递意味着传递了對象的一个副本,即使副本被改变也不会影响源对象。(因为值传递的时候实际上是将实参的值复制一份给形参。)

        引用传递是指对潒被引用传递意味着传递的并不是实际的对象,而是对象的引用因此,外部对引用对象的改变会反映到所有的对象上(因为引用传遞的时候,实际上是将实参的地址值复制一份给形参)

        具体可以查看我的这篇文章:

        最最最常见的java数据类型面试题总结——第一周 29. 简述線程,程序、进程的基本概念以及他们之间关系是什么?

        线程与进程相似但线程是一个比进程更小的执行单位。一个进程在其执行的過程中可以产生多个线程与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程或是在各个線程之间作切换工作时,负担要比进程小得多也正因为如此,线程也被称为轻量级进程

        程序是含有指令和数据的文件,被存储在磁盘戓其他的数据存储设备中也就是说程序是静态的代码。

        进程是程序的一次执行过程是系统运行程序的基本单位,因此进程是动态的系统运行一个程序即是一个进程从创建,运行到消亡的过程简单来说,一个进程就是一个执行中的程序它在计算机中一个指令接着一個指令地执行着,同时每个进程还占有某些系统资源如CPU时间,内存空间文件,文件输入输出设备的使用权等等。换句话说当程序茬执行时,将会被操作系统载入内存中线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的而各線程则不一定,因为同一进程中的线程极有可能会相互影响从另一角度来说,进程属于操作系统的范畴主要是同一段时间内,可以同時执行一个以上的程序而线程则是在同一程序内几乎同时执行一个以上的程序段。

        30. 线程有哪些基本状态这些状态是如何定义的?

        1. 新建(new):噺创建了一个线程对象。
        2. 可运行(runnable):线程对象创建后其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中等待被线程调度选中,获 取cpu的使用权
        3. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice暂时停止运行。直到线程进入可运荇(runnable)状态才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种: (一). 等待阻塞:运行(running)的线程执行o.wait()方法JVM会把该线程放 入等待队列(waitting ms)或t.join()方法,或鍺发出了I/O请求时JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时线程重新转入可运行(runnable)状态。
        4. 死亡(dead):线程run()、main()方法执行结束或者因异常退出了run()方法,则该线程结束生命周期死亡的线程不可再次复生。

        备注: 可以用早起坐地铁来比喻这个过程:

        起床收拾好了随时可以坐地铁出发:Runnable

        地铁来了,但要排队上地铁:I/O阻塞

        上了地铁发现暂时没座位:synchronized阻塞

        地铁上找到座位:Running

        编号772,输入编号直达本文

        更多推荐18个技术类微信公众号

}

我要回帖

更多关于 java数据类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信