① 什么是数据结构和算法学算法还需要去了解数据结构吗
你这理解不完全正确。
因为数据结构不只是内存中数据的排列,它是对数据的一种组织方式,就像图书馆要排书一样,是为了便于操作,同时它本身也集成了对通用操作:比如查找、比较等的支持。数组不是一种数据结构,而是一种数据类型。一个完整的数据结构包括逻辑结构和存储结构。通常选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
因此在语言实现上,数据结构通常也会包含与之相对应的算法集合,这些算法是指基本算法:查找、索引、比较等。
数据结构的逻辑结构和硬件是没有关系的,而其存储结构受到计算机硬件系统工作方式的影响,通常这点影响在于数据时顺序存储还是离散存储。算法的基础是数据结构。只有指定明确的数据结构,算法才能设计完成,脱离数据结构,算法是无法,也不可能成立的。因为不需要数据的算法就不是一个有效的计算机算法,算法中任何对数据的组织形式都可以被称之为数据结构。
2.数据结构在编程中的地位是极其重要的,是一个程序实现的基础中的基础,在此基础上才能构建算法。通常而言,你不了解什么高深的算法,一样能完成工作,但是如果你不了解基本的数据结构,那么可以说,你根本就不能完成一个任何有实质性内容的程序。Donald Ervin Knuth教授在其《计算机程序设计艺术》的第一卷《基本算法》中花费的绝大部分的篇幅去论述数据结构。由此可见数据结构对算法的重要性。
② Java哪些容器是底层容器
1.ArrayList(非线程安全的)
底层的数据结构其实就是数组,但是它比数组优秀的地方在于他是动态的,即不必像数组那样固定大小,那么他是如何实现这种数据结构是数组,但是给我们看起来确实不固定大小的呢?
ArrayList 是通过将底层Object数组复制的方式(System.array方法)来处理数组的增长;
当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量。
所以由上面可以看出ArrayList用于查找的话就相当于数组十分快,但是如果是插入或者删除的话则十分慢。
2.LinkedList(非线程安全)
顾名思义底层的数据结构是链表,而且是双向链表,所以他也具有链表的特点,即插入或者删除的话很快,但是如果是查找的话则比较缓慢。
3.HashSet(非线程安全)
底层数据结构是散列表(关于散列表看下面),仅仅存储对象(而hashMap是存储键值对),突出特点是存的对象不可重复,保证这一点是通过先对比每个对象的hashCode,如果hashCode相同,再对比equal()来确定两个对象是否重复,所以放入hashset的对象一定要重写hashCode()和equal().
4.HsahMap(非线程安全)
底层也是散列表(见下面),通过键值对来存储数据,通过键来获取值,速度比hashset快,键和值可以null.
5.LinkedHashMap
继承自HashMap,只不过在HashMap哈希表的数据结构基础上,又在每个entry里面记录上一个和下一个的引用,所以他有记录每个item顺序的功能(与hashmap相比),所以他实际上是哈希表加双向链表的一种数据结构。LruCache里面就是用的就是linkedhashmap来实现的。
现在介绍一下散列表(哈希表)这种数据结构:
首先每个对象产生一个哈希值(因为哈希值太大,数组不可能开这么大,会造成巨大浪费),所以需要通过一个哈希函数对哈希值进行转化,如图1000就转化为0,,3013就放入3,这样访问对象就跟数组一样便捷,插入对象也十分便捷,如果是碰到哈希值转化后是同一值得,即产生冲突,则像上面这种解决冲突的方式就是 链表的方式,哈希值在数组里同一位置的都用链表链接起来。所以散列表实际上是查找快,插入删除也快,解决了数组和链表各自的一些缺点。
③ 在JAVA中常用的数据结构(容器)有哪些有什么特点
JAVA的容器---List,Map,Set
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
④ Java的数据结构你用过哪些Map与Set的本质区别是什么
个人认为:
Map的本质就是Set<Map.Entry>; Set内部维护的是数组结构;
Map.Entry是Map的内部接回口,是key-value格式;
Map.Entry覆盖答了hash()方法, hashCode就是key的hashCode, 因此key不能重复; 且按照key的hashCode决定了在HashMap中的位置;
Map.Entry覆盖了CompareTo()方法, 返回的是key之间的比较, 因此TreeMap是按照key来排序的;