百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java的Set、Vector等集合对象详细总结

toyiye 2024-06-06 22:12 14 浏览 0 评论

《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言,希望大家以后关注本头条号更多的内容。


一、Collection集合

1、常见的数据结构简介

数组:查询快;删除和插入速度慢

链表:空间不一定连续,删除和插入速度快;查询慢

2、线程安全的概念初步

(1)、在某一时刻,100个人同时抢洗手间

在某一时刻,100线程在抢共享资源,叫做线程不安全

(2)、在某一时刻,100个人中只能有一个人在用洗手间

在某一时刻,100个线程中只能有一个线程在用共享资源,叫做线程安全

3、集合

List

(1)ArrayList

使用数组设计的;查询快,效率高;新增删除慢;线程不安全

(2)LinkedList

使用链表设计的;查询慢;删除和插入速度快,效率高;线程不安全

例如:

public static void main(String[] args)

{

List<String> list=new LinkedList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

for(String s:list)

{

System.out.println(s);

}

}

(3)Vector

使用数组设计的;查询快;线程安全,效率低

示例:

public static void main(String[] args)

{

List<String> v=new Vector<String>();

v.add("aaa");

v.add("bbb");

v.add("ccc");

for(String s:v)

{

System.out.println(s);

}

}

二、Set集合

Set集合特点:元素无序;元素唯一


1、HashSet:

(1) 底层用的hash表;HashSet是使用数组和链表设计的,兼有数组的查询快和链表的增删快的优点为一身


(2)对象的hash码、equals的概念

一般结论:不同的对象的hashCode不同 ;String特殊因为String重写了hashCode()和equals()重写


例如:

String s1="abc";

String s2=new String("abc");

System.out.println(s1.hashCode());

System.out.println(s2.hashCode());

我们可以人为重写,例如:

public class Demo

{

@Override

public int hashCode() {

// TODO Auto-generated method stub

return 100;

}

public static void main(String[] args)

{


System.out.println(new Demo().hashCode()==new Student().hashCode());

}

}

public class Student {

@Override

public int hashCode() {

// TODO Auto-generated method stub

return 100;

}

}

2、HashSet为什么数据元素唯一

(1) hashCode相同:quals相同,说明数据重复,不能添加;quals不相同,说明数据不重复,可以添加

(2) hashCode不相同:直接可以添加

HashSet举例:

public static void main(String[] args)

{

Set<Student> set=new HashSet<Student>();

set.add(new Student("lily001"));

set.add(new Student("lily002"));

for(Student s:set)

{

System.out.println(s.hashCode());

}

}

3、TreeSet

【1】底层设计原理:采用二叉树,红黑树

【2】TreeSet天生就能对数据排序,但是我们自定义的对象你得实现Comparable 和Comparator接口

【3】对象排序实现Comparable 和Comparator

(1)使用Comparable 给对象排序

public class Goods implements Comparable<Goods>{

private String gid;

private String gname;

private float gprice;

public String getGid() {

return gid;

}

public void setGid(String gid) {

this.gid = gid;

}

public String getGname() {

return gname;

}

public void setGname(String gname) {

this.gname = gname;

}

public float getGprice() {

return gprice;

}

public void setGprice(float gprice) {

this.gprice = gprice;

}

public Goods(String gid, String gname, float gprice) {

this.gid = gid;

this.gname = gname;

this.gprice = gprice;

}


public int compareTo(Goods goods) {

float f=this.gprice-goods.gprice;

if(f>0)

{

return 1;

}

if(f<0)

{

return -1;

}

return 0;

}

}


public class Demo

{

public static void main(String[] args)

{

Set<Goods> set=new TreeSet<Goods>();

set.add(new Goods("g001","book001",212));

set.add(new Goods("g002","book002",100));

set.add(new Goods("g003","book003",913));

for(Goods g:set)

{

System.out.println(g.getGprice());

}

}


}

(2)使用Comparator<T>实现排序

第一步:有不可更改的实体类

public class Goods {

private String gid;

private String gname;

private float gprice;

public String getGid() {

return gid;

}

public void setGid(String gid) {

this.gid = gid;

}

public String getGname() {

return gname;

}

public void setGname(String gname) {

this.gname = gname;

}

public float getGprice() {

return gprice;

}

public void setGprice(float gprice) {

this.gprice = gprice;

}

public Goods(String gid, String gname, float gprice) {

this.gid = gid;

this.gname = gname;

this.gprice = gprice;

}

}

第二步:自定义类实现Comparator<T>接口

public class MyGoods implements Comparator<Goods>{

@Override

public int compare(Goods o1, Goods o2) {

// TODO Auto-generated method stub

float f=o1.getGprice()-o2.getGprice();

if(f>0)

{

return 1;

}

if(f<0)

{

return -1;

}

return 0;

}

}

第三步:

public static void main(String[] args)

{

//生成自定义的MyGoods对象

MyGoods myGoods=new MyGoods();

//使用重载的构造方法TreeSet(Comparator<? super E> comparator)

Set<Goods> set = new TreeSet<Goods>(myGoods);

set.add(new Goods("g001","book001",212));

set.add(new Goods("g002","book002",100));

set.add(new Goods("g003","book003",913));

for(Goods g:set)

{

System.out.println(g.getGprice());

}

}


三、迭代器Iterator

1、依赖于集合对象而存在

示例1:

public static void main(String[] args)

{

List<String> list=new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

Iterator<String> it = list.iterator();

while(it.hasNext())

{

String s = it.next();

System.out.println(s);

}

}

示例2:

public static void main(String[] args)

{

Set<String> set=new TreeSet<String>();

set.add("aaa");

set.add("bbb");

set.add("ccc");

Iterator<String> it = set.iterator();

while(it.hasNext())

{

String s = it.next();

System.out.println(s);

}

}

2、因为集合对象有多种形态,比如List、Set,接口是实现多态的最佳选择

四、map数据结构

map存储键值对key-value结构的数据

Map---HashMap

----TreeMap


Dictionary类--> HashTable


Map示例-1:

Map<String,String> map=new HashMap<String,String>();

map.put("010", "北京");

map.put("021", "上海");

map.put("0451", "哈尔滨");

//map对象有keySet()返回 Set对象

Set<String> keys = map.keySet();

for(String k:keys)

{

String v = map.get(k);

System.out.println(k+"====="+v);

}

示例-2:TreeMap自然排序

public static void main(String[] args)

{

Map<String,String> map=new TreeMap<String,String>();

map.put("aaa", "111");

map.put("ddd", "333");

map.put("ccc", "666");

map.put("bbb", "888");


//map对象有keySet()返回 Set对象

Set<String> keys = map.keySet();

for(String k:keys)

{

String v = map.get(k);

System.out.println(k+"====="+v);

}

}


示例-3:非自然排序实现

public class Goods {

private String gid;

private String gname;

private float gprice;


public String getGid() {

return gid;

}


public void setGid(String gid) {

this.gid = gid;

}


public String getGname() {

return gname;

}


public void setGname(String gname) {

this.gname = gname;

}


public float getGprice() {

return gprice;

}

public void setGprice(float gprice) {

this.gprice = gprice;

}

public Goods(String gid, String gname, float gprice) {

this.gid = gid;

this.gname = gname;

this.gprice = gprice;

}


}


public class MyGoods implements Comparator<Goods>{


@Override

public int compare(Goods o1, Goods o2) {

// TODO Auto-generated method stub

float f=o1.getGprice()-o2.getGprice();

if(f>0)

{

return 1;

}

if(f<0)

{

return -1;

}

return 0;

}


}


public static void main(String[] args)

{

MyGoods my=new MyGoods();

Map<Goods,String> map=new TreeMap<Goods,String>(my);

map.put(new Goods("g001","book001",300), "111");

map.put(new Goods("g002","book002",100), "333");

map.put(new Goods("g003","book003",200), "666");


//map对象有keySet()返回 Set对象

Set<Goods> keys = map.keySet();

for(Goods k:keys)

{

String v = map.get(k);

System.out.println(k.getGprice()+"====="+v);

}

}


面试题

1、HashMap和Hashtable的区别

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

示例:

public static void main(String[] args)

{

Hashtable<String,String> hs=new Hashtable<String,String>();

hs.put("010", "aaa");

hs.put("020", "bbb");

hs.put("030", "ccc");

Set<String> keys = hs.keySet();

for(String k:keys)

{

System.out.println(k+"====="+hs.get(k));

}

}

二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的


三.值:只有HashMap可以让你将空值作为一个表的条目的key或value ;Hashtable的key和value不能为null

下列是错误的

public static void main(String[] args)

{

Hashtable<String,String> hs=new Hashtable<String,String>();

hs.put(null, "aaa");

hs.put(null, "bbb");

hs.put("030", "ccc");

Set<String> keys = hs.keySet();

for(String k:keys)

{

System.out.println(k+"====="+hs.get(k));

}

}

2、Collection 和 Collections的区别。

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

(1)排序

public static void main(String[] args)

{

List<String> list=new ArrayList<String>();

list.add("ddd");

list.add("aaa");

list.add("bbb");

for(String s:list)

{

System.out.println(s);

}

System.out.println("============");

Collections.sort(list);

for(String s:list)

{

System.out.println(s);

}

}

(2) 反转指定列表中元素的顺序。

public static void main(String[] args)

{

List<String> list=new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

for(String s:list)

{

System.out.println(s);

}

System.out.println("============");

Collections.reverse(list);

for(String s:list)

{

System.out.println(s);

}


}

(3)给对象排序

第一步:定义个实体类,并且这个实体类不能被修改

public class Goods {

private String gid;

private String gname;

private float gprice;

public String getGid() {

return gid;

}

public void setGid(String gid) {

this.gid = gid;

}

public String getGname() {

return gname;

}

public void setGname(String gname) {

this.gname = gname;

}

public float getGprice() {

return gprice;

}

public void setGprice(float gprice) {

this.gprice = gprice;

}

public Goods(String gid, String gname, float gprice) {

this.gid = gid;

this.gname = gname;

this.gprice = gprice;

}


}

第二步:实现Comparator接口

public class MyGoods implements Comparator<Goods>{

@Override

public int compare(Goods o1, Goods o2) {

// TODO Auto-generated method stub

float f=o1.getGprice()-o2.getGprice();

if(f>0)

{

return 1;

}

if(f<0)

{

return -1;

}

return 0;

}


}

第三步:测试

public class Demo

{


public static void main(String[] args)

{

MyGoods MyGoods();

List<Goods> goodsList=new ArrayList<Goods>();

Goods g1=new Goods("g001","book001",99);

Goods g2=new Goods("g002","book002",88);

Goods g3=new Goods("g003","book003",666);

goodsList.add(g1);

goodsList.add(g2);

goodsList.add(g3);

System.out.println("排序前===============");

for(Goods g:goodsList)

{

System.out.println(g.getGprice()+" "+g.getGid());

}

Collections.sort(goodsList, myGoods);

System.out.println("排序后=============");

for(Goods g:goodsList)

{

System.out.println(g.getGprice()+" "+g.getGid());

}

}

}


《大数据和人工智能交流》的宗旨

1、将大数据和人工智能的专业数学:概率数理统计、线性代数、决策论、优化论、博弈论等数学模型变得通俗易懂。

2、将大数据和人工智能的专业涉及到的数据结构和算法:分类、聚类 、回归算法、概率等算法变得通俗易懂。

3、最新的高科技动态:数据采集方面的智能传感器技术;医疗大数据智能决策分析;物联网智慧城市等等。

根据初学者需要会有C语言、Java语言、Python语言、Scala函数式等目前主流计算机语言。

根据读者的需要有和人工智能相关的计算机科学与技术、电子技术、芯片技术等基础学科通俗易懂的文章。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码