Java基础(十)★集合★映射

集合

Collection<E>

顶级接口-Collection---容器,大小不定。---泛型

List---列表

有序,重复

ArrayList

基于数组的。内存空间是连续的,默认初始容量是10,每次扩容一半,是一个线程不安全的集合。增删元素比较慢,查询元素较快

LinkedList

基于链表实现的。内存空间是不连续的。增删元素相对较快,查询元素较慢。是一个线程不安全的集合

 

Vector

向量---Java中最早的集合---基于数组实现的。默认初始容量是10,每次扩容一倍;是一个线程安全的集合

内存空间连续。增删元素较慢,查询元素相对较快。是一个线程安全的集合。

Stack

栈。---遵循先进后出的原则。最先放入的元素---栈底元素,最后放入的元素---栈顶元素。将元素放入栈中---入栈/压栈;将元素从栈中取出---出栈/弹栈

练习:

1. Vector来实现Stack

2. 用数组实现Stack


Queue

队列---先进先出。先放入队列中的元素---队头元素,最后放入队列中的元素---队尾元素

线性集合:List,Queue

Set

散列集合---元素不可重复,不保证元素顺序---Set中的元素无序不可重复

HashSet---默认初始容量是16,加载因子是0.75f,每次扩容一倍。是一个线程不安全的集合

Iterator

迭代器---用于迭代遍历集合。通过指针的挪动来获取对应的元素,通过标记这个元素是佛可用来确定是否删除这个元素---不允许直接增删原集合

foreach---本质上也是在做迭代遍历。---如果一个对象能够使用增强for循环,那么这个对象对应的类必须实现Iterable---JDK1.5的特性之一

Collections

是一个操作集合的工具类

Array---Arrays

Comparator

比较器---重写compare方法,将比较规则写到compare方法中---根据返回值的正负来确定大小:如果返回值是正数,表示第一个参数排到第二个参数之后;反之表示第一个参数排到第二个参数之前

如果没有指定排序规则,这个时候要求集合中的元素对应的类必须实现Comparable,比较规则是写在compareTo方法中

泛型

参数化类型。---ParameterizedType---JDK1.5的特性之一

List list = new ArrayList();---元素类型存储为Object类型

List list = new ArrayList<String>();

用具体类型来替换泛型的操作---泛型的擦除---发生在编译期

泛型的继承

// ? 表示泛型的通配符

// 遍历元素类型是数值类型的集合---泛型不向下兼容

// ? extends /接口 表示传入这个类/接口本身或者其子类/子接口元素

// 泛型的上限

public static void it(List<? extends Number> list) {

 

// 能向这个集合添加元素么?--不行,除了null

// list.add(new Integer(4));

list.add(null);

 

for (Number number : list) {

System.out.println(number);

}

}

 

// String及其父类

// ? super /接口 表示传入这个类/接口及其父类/父接口元素

// 泛型的下限---同一个泛型不能既规定上限又规定下限

public static void it2(List<? super String> list) {

}

练习:疯狂值

5 15 20 35 50 70

20 50 5 70 15 35  ->  215

35 15 70 5 50 20 -> 215

映射---Map<K,V>

MapJava中映射的顶级接口。K-Key---键,V-Value------存储的时候是一个键对应了一个值---键值对---要求键必须唯一,值随意。---一个map中存储了很多的键值对。

Entry---每一个entry对象代表了一个键值对。

Map是集合吗?---不是

如何遍历一个map

1. 获取所有的键,根据键来获取对应的值

2. 获取到所有的键值对

HashMap---允许键或者值为null。默认的初始容量是16,加载因子是0.75f,每次扩容一倍。是一个异步式线程不安全的映射

Hashtable---不允许键或者值为null。默认的初始容量是11,加载因子是0.75f。是一个同步式线程安全的映射

ConcurrentHashMap---异步式线程安全的映射

练习:

输入一个数以及对应个数的键值对-> 键升序排序,如果出现了重复的键,对应的值求和

5

2 6

1 7

3 9

2 8

5 0

->

1 7

2 14

3 9

5 0

         list与Set、Map区别及适用场景

1、List,Set都是继承自Collection接口,Map则不是
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。) 

3.Set和List对比: 
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。 

4.Map适合储存键值对的数据

5.线程安全集合类与非线程安全集合类 

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。

下面是具体的使用介绍:

ArrayList与LinkedList的区别和适用场景

Arraylist:

优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。   

LinkedList:

优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作addremoveLinedList比较占优势LinkedList 适用于要头尾操作或插入指定位置的场景

缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

适用场景分析:

 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

 

ArrayList与Vector的区别和适用场景

 ArrayList有三个构造方法:

Java代码  

1. public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。    

2. public ArrayList()//构造一个初始容量为10的空列表。    

3. public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表   

 Vector有四个构造方法:

Java代码  

1. public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。    

2. public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。    

3. public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量    

4. public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量    

 

ArrayListVector都是用数组实现的,主要有这么三个区别:
1.Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2.两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。

3.Vector可以设置增长因子,而ArrayList不可以。

4.Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。

适用场景分析:

1.Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。
2.如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。

HashSet与Treeset的适用场景

1.TreeSet 是二差树(红黑树的树据结构)实现的,Treeset中的数据是自动排好序的,不允许放入null 
2.HashSe是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 

3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例

   适用场景分析:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet

                           HashMap与TreeMap、HashTable的区别及适用场景 

HashMap 非线程安全  

HashMap基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()equals()[可以重写hashCode()equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 

TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 

适用场景分析:

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。

HashMap适用于Map中插入、删除和定位元素。 

Treemap适用于按自然顺序或自定义顺序遍历键(key) 

 

 





File

代表文件或者目录(文件夹)的类。

E:\\a.txt

File(String pathname)---代表了一个file对象;如果文件不存在,不会创建。在创建file对象的时候,并不会去计算机中检查文件是否存在,只是把传入的路径标志为一个file对象

重要方法

创建

createNewFile()---当文件不存在的时候,会创建一个新文件。---要求文件存放的路径要真实存在。---只能用于创建文件而不能创建目录

mkdir()---创建目录---只能用于创建目录。---只能创建一层目录

mkdirs()---创建多级目录

删除

delete()---用于删除文件或者目录。---从计算机中真正移除,无法撤销。---如果删除的是目录且该目录下存在子目录或者子文件,此时无法删除

判断

isFile()---判断是否是一个文件

isDirectory()---判断是否是一个目录

canWrite()---判断文件是否可写

isHidden()---判断是否是一个隐藏文件

exists()---判断是否真实存在

获取

listFiles()---获取子文件和子目录组成的数组

getName()---获取文件名

lastModified()---获取文件最后一次修改时间的---获取的是一个毫秒值---long

设置

setLastModified(long time)---设置最后一次修改时间

练习:删除目录

写成了一个方法:获取这个目录下的子文件和子目录---遍历数组---如果是子文件的话,直接删除;如果是子目录的话,后续的功能和当前方法的功能一致的,直接调用当前方法--递归

练习:统计Java文件的个数和class文件的个数

写一个方法:获取工作空间下的所有的子文件和子目录---如果是子目录的话,递归;如果是子文件,需要判断是否是一个Java文件或者class文件

路径

绝对路径:以盘符或者/开头的路径。绝对路径的计算和当前文件的路径没有任何关系。

相对路径:不以盘符或者/开头的路径。 .. 表示上一层路径---在计算的时候需要以当前路径为基准进行计算

练习:提取所有的docx文件-> E:\\DOCX

 


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值