【Java】列表、集合、哈希表和可变参数

1 List

1.1 List的特点

  1. List接口继承自Collection接口
  2. List是有序集合,存取顺序一致
  3. 允许存储重复元素

1.2 List的特有方法【带索引】

  1. public void add(int index, E element);
  2. public E get(int index)
  3. public E remove(int index):返回移除元素
  4. public E set(int index, E element):替换指定位置的元素,返回更新前元素
  5. 遍历List:for+get+index(iterator、foreach非特有)

使用示例

public static void main(String[] args) {List<String> list = new ArrayList<>();//1.list.add("a");list.add("b");list.add("b");//可重复list.add("d");System.out.println(list);//[a, b, b, d]重写了toString直接打印列表 而不是地址//2.list.remove(2);System.out.println(list);//[a, b, d]//3.String s = list.get(1);System.out.println(s);//b//4.String result = list.set(2, "c");System.out.println(result);//dSystem.out.println(list);//[a, b, c]}

1.3 List的实现类

ArrayList:数组实现,查询快,增删慢
LinkedList:链表实现,查询慢,增删快

LinkedList特有方法:不能用多态

  1. addFirst(E, e) getFirst removeFirst
  2. addLast(E, e) getLast removeLast
  3. push(E e)
  4. pop()

使用示例

public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("b");list.add("c");System.out.println(list);//[b, c]list.addFirst("a");System.out.println(list);//[a, b, c]list.addLast("d");System.out.println(list);//[a, b, c, d]list.push("1");//==addFirstSystem.out.println(list);//[1, a, b, c, d]list.pop();//==removeFirstSystem.out.println(list);//[a, b, c, d]String first = list.getFirst();String last = list.getLast();System.out.println(first+" "+last);// a dString s1 = list.removeFirst();String s2 = list.removeLast();System.out.println(s1+" "+s2);// a dSystem.out.println(list);//[b,c]}

2 Set

2.1 Set的特点

  1. Set接口继承自Collection接口
  2. 不允许存储重复元素
  3. 无索引,不能使用普通for循环遍历

2.2 Set的实现类

HashSet:无序集合、不同步、底层是哈希表(查询快)
使用HashSet

public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("1");set.add("2");set.add("3");set.add("3");Iterator<String> it = set.iterator();while(it.hasNext()){System.out.print(it.next() + " ");}System.out.println();for(String s: set){System.out.print(s+" ");}}

2.3 哈希表

哈希值:十进制整数,系统随机给出。(逻辑地址而非物理地址)
hashCode方法源码没有方法体 native代表调用本地操作系统的方法

public native int hashCode();

数据结构
jdk1.8之前:数组+链表
使用链表处理冲突,同一hash值的链表都存储在一个链表里。hash值相等的元素较多时,通过key值依次查找的效率较低
jdk1.8之后:数组+链表+红黑树(提高查询速度)
哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

Set集合判断元素是否重复:在调用add方法的时候会调用元素的hashCode方法和equals方法。如果hashCode一样,则发生了哈希冲突,调用equals方法判断两个元素是否相同,不相同时才存入表中。

前提:要重写equals方法和hashCode方法
原因:不重写:默认的equals()判断的是两个对象的引用指向的是不是同一个对象;而hashCode()根据对象地址生成一个整数数值;hashCode()的修饰符为native,表明该方法是否操作系统实现,java调用操作系统底层代码获取哈希值。

自定义类型存入HashSet
定义Person类

import java.util.Objects;public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}@Override//打印属性信息public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Override//比较属性值public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Override//属性的hash值public int hashCode() {return Objects.hash(name, age);}

定义测试类

import java.util.HashSet;
import java.util.Set;public class HashSetTest {public static void main(String[] args) {Set <Person> persons = new HashSet<>();Person p1 = new Person("张三",30);Person p2 = new Person("张三",25);Person p3 = new Person("张三",30);System.out.println(p1.hashCode());//重写后:24022550System.out.println(p3.hashCode());//重写后:24022550persons.add(p1);persons.add(p2);persons.add(p3);//重写了equals 认为同名同姓是一个人	重写前比较对象地址//重写了toString 打印对象属性信息 	重写前是包名.类型@16进制哈希值//重写了hashCode 					重写前是对象地址的hash值System.out.println(persons);//[Person{name='张三', age=30}, Person{name='张三', age=25}]}
}

2.4 LinkedHashSet

底层是哈希表(数组+链表/+红黑树)+链表,多加一条链表用来记录元素的存储顺序,保证元素有序

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetTest {public static void main(String[] args) {Set<String> hs = new HashSet<>();hs.add("def");hs.add("abc");hs.add("ghi");System.out.println(hs);//存取无序 [abc, def, ghi]Set<String> lhs = new LinkedHashSet<>();lhs.add("def");lhs.add("abc");lhs.add("ghi");System.out.println(lhs);//存取有序 [def, abc, ghi]}
}

3 可变参数

JDK1.5之后出现的新特性。当方法的参数列表数据类型已确定,但参数个数不确定,就可以使用可变参数。

修饰符 返回值类型 方法名(数据类型…遍历名){}

原理:底层是一个数组,根据参数个数的不同创建不同长度的数组,来存储这些参数传递的参数个数。

public static void main(String[] args) {int result = add(1,2,3,4,5);System.out.println(result);}//计算0~n个整数和的方法public static int add(int...nums){int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}return sum;}

4 Collections

4.1 常用功能

  1. addAll:往集合中添加一些元素
  2. shuffle:打乱集合顺序
  3. sort:按默认规则排序
  4. sort:按指定规则排序。this.排序属性 - 参数.排序属性:升序

在自定义类中重写

//implement Comparable<Person>
@Overridepublic int compareTo(Person o) {//初始认为元素相同//return 0;//自定义://return this.getAge() - o.getAge();//按年龄升序//return this.getName() - o.getName();//按名字升序//组合排序:int result = this.getAge() - o.getAge();if(result == 0){return this.getName() - o.getName();}return result;}

示例1 在定义类时实现接口并重写compareTo

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"a","b","c","d","e");System.out.println(list);//[a, b, c, d, e]Collections.shuffle(list);System.out.println(list);//[e, b, c, a, d]Collections.sort(list);//默认规则:升序排序System.out.println(list);//[a, b, c, d, e]ArrayList<Person> persons = new ArrayList<>();persons.add(new Person("张三",50));//sort使用前提是实现了Comparable接口重写CompareTo方法persons.add(new Person("李四",20));//对自定义类排序Collections.sort(persons);System.out.println(persons);//[Person{name='李四', age=20}, Person{name='张三', age=50}]}

示例2 在调用sort时 通过匿名对象进行重写

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7);Collections.shuffle(list);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;//升序//return o2 - o1;//降序}});System.out.println(list);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白硕 | 知识图谱,就是场景的骨架和灵魂

本文转载自公众号恒生技术之眼 知识图谱&#xff0c;目前已在全世界得到了重视和应用&#xff0c;成为当下人工智能热的一个重要组成部分。它究竟是怎样的一种技术&#xff1f;它的应用场景在哪里&#xff1f;未来国内企业该如何发展&#xff1f;让我们一起来聊聊。 从知识图谱…

您的DST大礼包请查收

本文转载自刘冲大佬&#xff08;知乎id&#xff1a;呜呜哈&#xff09;的知乎文章&#xff0c;链接&#xff1a;https://zhuanlan.zhihu.com/p/40988001除本文外&#xff0c;作者还写了很多对话相关的良心好文&#xff01;做对话的小伙伴千万不要错过这位良心答主噢(&#xffe…

LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)

摘要&#xff1a;如果你是一名单身狗&#xff0c;不要伤心&#xff0c;或许是因为你的记忆太好了。有时&#xff0c;遗忘是件好事&#xff0c;它让你对琐碎之事不再斤斤计较。然而每当自己记不住单词而“问候亲人”时&#xff0c;也确实气死个人。于是你懂得了如何控制好什么信…

【Java】如何理解Java中的双列集合Map?

1 Map<K,V>接口 1.1 特点 双列集合一个元素包含俩值Key不可以重复&#xff0c;Value可以重复Key和Value一一对应Key和Value可以时任意类型 1.2 常用方法 public V put(K key, V value): 不重复返回null&#xff0c;重复返回value public static void main(String[] a…

技术动态 | 清华大学开源OpenKE:知识表示学习平台

本文转载自公众号机器之心&#xff0c;选自 THUNLP。 清华大学自然语言处理实验室近日发布了 OpenKE 平台&#xff0c;整合了 TransE、TransH、TransR、TransD、RESCAL、DistMult、HolE、ComplEx 等算法的统一接口高效实…

多任务学习时转角遇到Bandit老虎机

注&#xff1a;本文的正文干货转载并少量修改自大佬覃含章&#xff08;知乎id同名&#xff0c;知乎必关的数值优化大佬啊啊&#xff09;的一篇知乎回答&#xff0c;链接https://www.zhihu.com/question/53381093/answer/562235053一个转角事情是这样的&#xff0c;最近小夕在做…

NLP13-LDA引发的一系活动

摘要&#xff1a; 目标是想了解也学习LDA&#xff0c;寻找学习LDA相关资料&#xff0c;学习LDA相关的概率基础&#xff0c;对于LSI&#xff0c;pLsa,LDA作为主题模型的对比&#xff1b;然后到LDA本身&#xff0c;对LDA相关的概率基础进行学习。把相关资料疏理与集合起来。

王昊奋 | 从聊天机器人到虚拟生命:AI技术的新机遇

本文转载自公众号中国人工智能学会。 10月12-13日&#xff0c;第七届中国智能产业高峰论坛在佛山开幕&#xff0c;在NLP与服务机器人专题论坛上&#xff0c;深圳狗尾草CTO王昊奋发表了主题为《从聊天机器人到虚拟生命&#xff1a;AI技术的新机遇》的精彩演讲。 以下是王昊奋老师…

【Java】如何理解Java中的异常机制?

1 异常的概念 程序在执行过程中出现非正常线性&#xff0c;导致JVM非正常停止异常不是语法错误 2 异常的分类 Throwable是所有错误或异常的超类Exception是编译期间异常&#xff08;写代码时IDE会报错&#xff09;RuntimeException时运行期异常&#xff0c;程序运行时出现的…

文本匹配相关方向总结(数据,场景,论文,开源工具)

Motivation 前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》&#xff0c;于是有不少小伙伴来问分类和匹配的参考资料了&#xff0c;鉴于文本分类的资料已经超级多了&#xff0c;就不写啦&#xff08;不过分类相关的tricks可以看之前写的这篇文章《文本分类重要tricks…

机器学习】LDA线性判别分析

【机器学习】LDA线性判别分析1. LDA的基本思想2. LDA求解方法3. 将LDA推广到多分类4. LDA算法流程5. LDA和PCA对比【附录1】瑞利商与广义瑞利商线性判别分析 (Linear Discriminant Analysis&#xff0c;LDA)是一种经典的线性学习方法&#xff0c;在二分类问题上因为最早由[Fish…

科普 | 动态本体简介

本文转载自知乎专栏知识图谱和智能问答。 1 近年来&#xff0c;随着语义Web的兴起&#xff0c;本体技术受到了广泛关注。很多大型跨国公司都开始研究本体技术。谷歌于2012年提出了知识图谱的项目&#xff0c;旨在利用本体技术来提高搜索的精度和更智能化的知识浏览。国内的互联…

【LeetCode】4月3日打卡-Day19-字符串转整数

描述 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。接下来的转化规则如下&#xff1a; 如果第一个非空字符为正或者负号时&#xff0c;则将该符号与…

文本匹配相关方向打卡点总结

Motivation前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》[1]&#xff0c;于是有不少小伙伴来问分类和匹配的参考资料了&#xff0c;鉴于文本分类的资料已经超级多了&#xff0c;就不写啦&#xff08;不过分类相关的tricks可以看之前写的这篇文章《文本分类重要tric…

深入理解K-Means聚类算法

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/taoyanqi8932/article/details/53727841 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit…

刘挺 | 从知识图谱到事理图谱

本文转载自 AI科技评论。 在“知识图谱预见社交媒体”的技术分论坛上&#xff0c;哈尔滨工业大学刘挺教授做了题为“从知识图谱到事理图谱”的精彩报告。会后AI科技评论征得刘挺教授的同意&#xff0c;回顾和整理了本次报告的精彩内容。 刘挺教授 刘挺教授的报告内容分为四部分…

我对JVM的理解

一、JVM简介 JVM总体上是由类装载子系统&#xff08;ClassLoader&#xff09;、运行时数据区、执行引擎、内存回收这四个部分组成。 其中我们最为关注的运行时数据区&#xff0c;也就是JVM的内存部分则是由方法区&#xff08;Method Area&#xff09;、JAVA堆&#xff0…

【LeetCode】4月4日打卡-Day20-接雨水

描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&#xff0c;可以接 6 个单位的雨水&#xff08;蓝色部分表示雨水&a…

算法与数据结构--空间复杂度O(1)遍历树

大家好~我叫「小鹿鹿鹿」&#xff0c;是本卖萌小屋的第二位签约作&#xff08;萌&#xff09;者&#xff08;货&#xff09;。和小夕一样现在在从事NLP相关工作&#xff0c;希望和大家分享NLP相关的、不限于NLP的各种小想法&#xff0c;新技术。这是我的第一篇试水文章&#xf…

PCA主成分分析学习总结

大概主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。首先…