java中的数组长度可变吗 java数组长度是固定的吗 您所在的位置:网站首页 java中list长度固定吗 java中的数组长度可变吗 java数组长度是固定的吗

java中的数组长度可变吗 java数组长度是固定的吗

2024-07-11 09:23| 来源: 网络整理| 查看: 265

面试中经常会问到集合的问题,接下来用最简洁的语句和案例来解释。在面试中更加稳如泰山。

先谈谈集合和数组之间的区别?

java中的数组长度可变吗 java数组长度是固定的吗_数据结构

我们先来看看它们长度有什么区别。

1.数组的长度是固定。

提出问题:为什么数组的长度是固定的。

解答:java中的数组的定义就是相同类型,固定长度的一组数据,一旦被初始化,长度不可更改。否则会出现数组下表越界。(一桶水的容量永远存不住两桶水)。

1.2集合的长度为什么是可以变化的。

解答:我们知道集合的底层是用数组实现的,数组是需要给出一个初始的定义值。

集合底层是通过两个数组相互copy实现的。

扩容的本质就是将新数组长度扩容成旧数组长度的2倍,其实上就是调度Array.Copy(oldArray,0,destArray,0,length)。

2.内容的区别 数组的内容为什么可以是基本类型也可以是引用类型。这边假如有小伙伴不知基本类型和引用类型的话附上链接 2.1集合为什么只能是引用类型 解答:java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器。

Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。

3、元素内容的区别。 数组只能存一种类型的元素。

.每种数据类型所占空间大小不同,比如char占一个字节,int占4个字节,如果数组里面存了多种数据类型,那就不方便根据索引去计算地址偏移量了,实现不了RandomAccess。如果你存放了多种该数据类型,那么你必须用其他的数据结构去记录哪个位置是什么类型,比如你数组的第一位放了一个byte,如果你不记录,当你取用的时候,你怎么知道他是byte类型呢,而不是char呢。所以说只存一种数据简单纯粹。另外扩容问题,假设你申明了int[10],那么JVM会分配40个字节的空间,然后一段时间后,这40个字节空间的后面被其他对象占了,如果你原地扩容,那不把其他的对象改写了么。

4.Collection

Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据。 此接口定义在 java.util 包中。

java中的数组长度可变吗 java数组长度是固定的吗_数据结构_02

本接口中一共定义了 15个方法,那么此接口的全部子类或子接口就将全部继承以上接口中的方法。 但是,在开发中不会直接使用 Collection 接口。而使用其操作的子接口:List、Set。4.1

List

List 是 Collection 的子接口,里面的所有内容都是允许重复的。List按照插入顺序排序。

其方法如下:

java中的数组长度可变吗 java数组长度是固定的吗_java中的数组长度可变吗_03

ArrayList

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高

Vector

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程安全,效率低

LinkedList

优点: 底层数据结构是链表,查询慢,增删快。

缺点: 线程不安全,效率高

4.2数据结构 数据结构 ArrayXxx:底层数据结构是数组,查询快,增删慢 LinkedXxx:底层数据结构是链表,查询慢,增删快 HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals() TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

5.Set Set 接口也是 Collection 的子接口,与 List 接口最大的不同在于,Set 接口里面的内容是不允许重复的(模拟数学中的集)。 Set 接口并没有对 Collection 接口进行扩充,基本上还是与 Collection 接口保持一致。因为此接口没有 List 接口中定义 的 get(intindex)方法,所以无法使用循环进行输出。 那么在此接口中有两个常用的子类:HashSet、TreeSet

5.1HashSet(散列存放) 既然 Set 接口并没有扩充任何的 Collection 接口中的内容,所以使用的方法全部都是 Collection 接口定义而来的。 HashSet 属于散列的存放类集,里面的内容是无序存放的 其存储是基于HashMap的方式存储的,其就是使用HashMap的key存储,而value是固定的常量。

5.2排序的子类:TreeSet 与 HashSet 不同的是,TreeSet 本身属于排序的子类 当我们存储的是自定义的类时,我们就需要自己声明排序方式。 声明方法自定义类需要实现Comparable接口进行排序。

6.Map

java中的数组长度可变吗 java数组长度是固定的吗_数据结构_04

Map集合的key和value都可以是任何引用类型的数据。Map集合的key不允许重复,value允许重复。key和value之间存在单向一对一关系,即通过指定的键可以找到唯一,确定的value。Map集合中获取数据时,只要给出指定的key,就可以取出对应的value。

Map接口中定义的常用方法:

(1)void clear():删除该Map对象中所有的键值对。

(2)boolean containsKey(Object key):查询Map中是否包含指定key。

(3)boolean containsValue(Object value):查询Map中是否包含一个或多个value。

(4)Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。

(5)Object get(Object obj):返回指定key所对应的value。如果没有,这返回null。

(6)boolean isEmpty():查询该Map是否为空,如果为空则返回true。

(7)Set keySet():返回该Map中所有key组成的Set集合。

(8)Object put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。

(9)void putAll(Map m):将指定Map中的键值对复制到m中。

(10)Object remove(Object key):删除指定key所对应的键值对,如果不存在,则返回null。

(11)int size():返回Map里的键值对个数。

(12)Collection values():返回该Map里所有的vlaue组成的Collection。

Map中包括一个内部类Entry。该类封装了一个键值对。

Entry包含的三个方法:

(1)Object getKey():返回该Entry里包含的key值。

(2)Object getValue():返回该Entry里包含的value值。

(3)Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。

HashMap和Hashtable实现类

HashMap和Hashtable都是Map接口的典型实现类,Hashtable是一个古老的集合,JDK1.0起就出现了。

HashMap和Hashtable的典型区别:

(1)Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现。所以HashMap比Hashtable的性能高一点。

(2)Hashtable不允许使用null作为key和value。

注意:HashMap和Hashtable判断两个key相等的标准是:两个key通过equals方法比较返回true,两个key的hashCode值也要相等。 HashMap和Hashtable包含一个containsValue方法用于判断是否包含指定vlaue,HashMap和Hashtable判断值相等的标准:只要两个对象通过equals方法比较返回true即可。

LinkedHashMap类:

LinkedHashMap和LinkedHashSet一样,也是使用双向链表来维持键值对的顺序,该链表定义了迭代顺序,该迭代顺序与键值对的插入顺序保持一致。

LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代方法Map集合的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

Properties类

Properties类是Hashtable的子类。该对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件中的属性名和属性值只能是字符串类型,所以Properties里的key和value都是字符串类型。Properties提供的常用方法:

(1)String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get方法。

(2)String getProperty(String key, String defaultValue):该方法与上面的方法基本类似,如果Properties中不存在指定的key值,该方法返回默认值。

(3)Object setProperty(String key,String value):设置属性值,类似Hashtable的put方法。

(4)void load(InputStream inStream):从属性文件(以输入流表示)中加载属性名=属性值,把加载到的属性名=属性值对追加到Properties里。

(5)void store(OutputStream out,String comments):将Properties中的键值对写入指定属性文件(以输出流表示)。

小结 关于 TreeSet 的排序实现,如果是集合中对象是自定义的或者说其他系统定义的类没有实现 Comparable 接口,则不能实现 TreeSet 的排序,会报类型转换(转向 Comparable 接口)错误。 换句话说要添加到 TreeSet 集合中的对象的类型必须实现了 Comparable 接口。 不过 TreeSet 的集合因为借用了 Comparable 接口,同时可以去除重复值,而 HashSet 虽然是 Set 接口子类,但是对于没有复写 Object 的 equals 和 hashCode 方法的对象,加入了 HashSet 集合中也是不能去掉重复值的。

问题1:线程何为安全何为不安全。 问题2:什么是链表?什么是二叉树?什么是哈希表? 问题3:集合算法?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有