Java基础_16LikedList[开发不用】_Object类_Set集合

昨天的内容回顾
List接口下面的方法:add(Object o);  添加数据到集合容器中add(int index, Object o);在指定下标下面,添加数据到集合容器中addAll(Collection<? extends E> e);addAll(int index, Collection<? extends E> e);remove(Object o);remove(int index);clear();E set(int index, E e);size();isEmpty();contains();containsAll();toArray();get(int index);indexOf(Object o);lastIndexOf(Object o);subList(int fromIndex, int toIndex);startWith();endWith();
2.遍历集合中的数据1.for循环2.增强for循环3.迭代器3.ArrayList底层面试角度:1.ArrayList  是集合容器,用来存数据的。是有序的集合并且他的数据可以重复的底层是数组Object[] elementData。一旦牵涉到数组,容量是固定的,但是ArrayList可以扩容的。默认容量是10.一旦操作10容量的话,每次扩容1.5倍。增删是比较效率比较低的o(n),因为增的时候有可能牵涉扩容。牵涉到数据整体前移和后移。查询 是比较快的 因为用索引下标 时间复杂度o(1)开发中用的最多!!!开发中查询的最多的!!!

今天的内容

1.LinkedList【开发不用】

2.Object类

3.Set集合

1.LinkedList

LinkedList 是 List接口的实现类

只不过它有自己独有的方法

双链表实现了ListDeque接口。 实现所有可选列表操作,并允许所有元素(包括null )。

所有的操作都能像双向列表一样预期。 索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。

package com.qf.a_linkedlist;import java.util.LinkedList;
import java.util.List;public class Demo1 {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("狗蛋");list.addLast("李四");list.add("嘻嘻");list.addFirst("张三");System.out.println(list);}
}

面试题 : ArrayList和LinkedList区别

2.Object类

Object是类结构的根。 每个class都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。

2.1toString
StringtoString()返回对象的字符串表示形式。

返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。

toString类方法Object返回一个由其中的对象是一个实例,该符号字符的类的名称的字符串@` ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode()) 
  • 结果

    对象的字符串表示形式。

package com.qf.b_object;class Person {String name;int age;@Overridepublic String toString() {return "" +"name='" + name + '\'' +", age=" + age;}
}
public class Demo1 {public static void main(String[] args) {Object obj= new Object();System.out.println(obj);//java.lang.Object@1b6d3586//该符号字符`的类的名称的字符串@ ”和对象的哈希码的无符号的十六进制表示System.out.println(obj.toString());//java.lang.Object@1b6d3586Person person = new Person();//结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖(重写)此方法。person.name = "狗蛋";person.age = 12;//Person{name='null', age=0}//Person{name='狗蛋', age=12}System.out.println(person);//com.qf.b_object.Person@4554617c// System.out.println(person.toString());//总结:  如果在一个类不重写toString方法  打印是地址 看不懂//如果重写toString之后,打印重写的字符串 目的让人容易阅读}
}
2.2equals方法
public boolean equals(Object obj) {return (this == obj);
}

Object类下面的equals方法是比较的内存地址,。使用的是==。

为啥String类中的equals比较内容的? 因为一句话重写!!!

package com.qf.b_object;public class Demo2 {public static void main(String[] args) {Object obj1 = new Object();Object obj2 = new Object();System.out.println(obj1.equals(obj2));//false//String 继承了Object类啊//因为父类(Object)的需求满足不了子类(String)的所以子类重写euqals方法String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1.equals(str2));//true}
}

案例:

package com.qf.b_object;class Student {int id;//编号String name;int age;char sex;public Student(int id, String name, int age, char sex) {this.id = id;this.name = name;this.age = age;this.sex = sex;}@Override//student1.equals(student2)public boolean equals (Object obj) {//Object obj = student2;  向上转型//this===>student1//obj ====>student2if (this == obj) {//先比较的是内存地址return  true;}//接下来判断对象的内容//student2 instanceof Studentif (obj instanceof Student) {Student stu = (Student) obj;//向下转型//stu  就是student2return stu.id == this.id && stu.name.equals(this.name) && this.age == stu.age && this.sex == stu.sex;}return false;}
}
public class Demo3 {public static void main(String[] args) {Student student1 = new Student(1, "狗蛋", 34, '男');Student student2 = new Student(1, "狗蛋", 34, '男');System.out.println(student1.equals(student2));//false//STudent此时继承Object  要使用父类下面equals方法//Obejct  下面的equals方法比较的是地址。所以false//但是真实的开始的时候,关注数据的内容,而不是内存地址//所以要求equals方法的结果是true。那咋办?}
}

总结:现在要关注的是对象的内容,而不是地址。

练习:

1.toStringPerson类
2.
声明一个Dog类name   age  kind
创建两个对象,要求调用equals方法,如果属性值一样,返回true

回顾上午的内容

1.linkeList从代码角度来说,开发不用!!!底层  是双向链表  数据结构val  0x123pre  0x124next  0x456
2.Object类一个方法就是一个功能toString();equals();
2.3HashCode方法
public int hashCode()

返回对象的哈希码值。 在Object类型中,hash值 是十六进制的内存地址转为十进制的值,就叫hash值

尽可能多的合理实用,由类Object定义的hashCode方法确实为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)

package com.qf.b_object;class Man {}
public class Demo4 {public static void main(String[] args) {Object obj = new Object();System.out.println(obj);System.out.println(obj.hashCode());//Object obj2 = new Object();System.out.println(obj2);System.out.println(obj2.hashCode());Man man = new Man();//十六进制的内存地址转为十进制的值System.out.println(man.hashCode());Man man1 = new Man();System.out.println(man1.hashCode());}
}

扩展: 字符串呢?

请注意,无论何时覆盖该方法(equals),通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象(equals)必须具有相等的哈希码。

通用合同: (规定)

  • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
package com.qf.b_object;class Teacher {int id;String name;public Teacher(int id, String name) {this.id = id;this.name = name;}public boolean equals (Object obj) {if (this == obj) {return true;}if (obj instanceof  Teacher) {Teacher teacher = (Teacher) obj;return teacher.id == this.id && teacher.name.equals(this.name);}return false;}public int hashCode() {return id + name.hashCode();}
}
public class Demo5 {public static void main(String[] args) {Teacher tea1 = new Teacher(1, "老邢");Teacher tea2 = new Teacher(1, "骚磊");System.out.println(tea1.equals(tea2));//1.现在关注的是内容,只要内容一样,那么equals返回值就是true//咋办? 重写equals方法  内容只要一样就是true。//规定: 如果根据equals(Object)方法两个对象相等,// 则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。System.out.println(tea1.hashCode());System.out.println(tea2.hashCode());//到这一步,发现它不符合 规定 咋办? 重写hashCode方法}
}

总结:重写equals方法必须重写hashCode方法

3.Set集合

Collection下面有两个子接口一个是List一个Set

List: 有序的可以重复的

Set: 无序的不可重复的

​ Set接口下面有两个实现类:

​ HashSet: 底层是依靠hash值进行存储的!!!如果hash值一样的就无法存到集合中

​ TreeSet: 底层是二叉树,存入数据是按照自然顺序来排 的

3.1HashSet

看一下方法

package com.qf.c_hashSet;import java.util.HashSet;
import java.util.Set;public class Demo1 {public static void main(String[] args) {Set<Integer> set = new HashSet<>();set.add(34);set.add(28);set.add(18);set.add(88);set.add(34);System.out.println(set);//[34, 18, 88, 28]Set<String> set1 = new HashSet<>();set1.add("b");set1.add("d");set1.add("a");set1.add("c");set1.add("ab");System.out.println(set1);for (String s : set1) {System.out.println(s);}}
}
3.2HashSet存数据的时候是一个自定义的类
package com.qf.c_hashSet;import java.util.HashSet;
import java.util.Objects;
import java.util.Set;class Phone {String name;double price;//价格public Phone(String name, double price) {this.name = name;this.price = price;}@Overridepublic int hashCode() {//将name 和 price 两个值 进行hash计算变成一个具体的int类型的hahsreturn Objects.hash(name, price);}@Overridepublic String toString() {return "Phone{" +"name='" + name + '\'' +", price=" + price +'}';}
}
public class Demo2 {public static void main(String[] args) {Set<Phone> set = new HashSet<>();Phone phone1 = new Phone("ab", 4567.2);System.out.println("phone1的hash值:" + phone1.hashCode());set.add(phone1);Phone phone2 = new Phone("ba", 4567.2);System.out.println("phone2的hash值:" + phone2.hashCode());set.add(phone2);Phone phone3 = new Phone("华为", 4567.2);System.out.println("phone3的hash值:" + phone3.hashCode());set.add(phone3);System.out.println(set);//为啥都能存进去?因为hashSet的底层是按照hash值进行存储的//如果hash值是一样的话,那么肯定存不进去。//Phone 继承Object   默认去调用Object的hashCode方法(十六进制转为十进制表示形式)//内存不一样 意味hash值不一样的//存进去是不合适的。因为关注的是内容。如果内容一样,不能存到Set集合中//那咋办? 重写equals方法和hashCode}
}
package com.qf.c_hashSet;import java.util.HashSet;
import java.util.Objects;
import java.util.Set;class Student {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {System.out.println("嘻嘻");if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {System.out.println("哈哈");return name.hashCode() + age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Demo3 {public static void main(String[] args) {Set<Student> set1 = new HashSet<>();set1.add(new Student("a", 2));set1.add(new Student("b", 1));//你的hash值都不一样的额话,就没有必要调用equals方法了System.out.println(set1);}
}

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

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

相关文章

12-pyspark的RDD算子注意事项总结

目录 相近算子异同总结相近变换算子异同foreach和foreachPartitionfold和reducecoalesce和repatition 相近动作算子异同cache和persist 算子注意事项需要注意的变换算子需要注意的动作算子 PySpark实战笔记系列第三篇 10-用PySpark建立第一个Spark RDD(PySpark实战笔记系列第…

Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace,Kotlin

Android性能优化RecyclerView预加载LayoutManager的getExtraLayoutSpace&#xff0c;Kotlin RecyclerView默认只加载当前屏幕肉眼可见区域的有限item数量&#xff0c;有些场景下&#xff0c;需要在屏幕外不可见的区域多加载一批item出来&#xff0c;这有时候被称之为“预加载”…

2024考研调剂须知

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

QEMU MINI2440 如何设置显示分辨率?

MINI2440: Option string mini24402tb MINI2440: t ignored, touchscreen not compiled in MINI2440: LCD 0:240x320 1:800x480 [2:1024x768] 嘿嘿你又懂了&#xff1f; nboot kernel setenv bootargs root/dev/mtdblock3 rootfstypejffs2 consolettySAC0,115200 mini24401t…

前端服务请求跨域被拦截,Java后端Springboot服务解决办法

跨域问题 跨域前端遇到的问题&#xff1a; Access to XMLHttpRequest at ‘http://www.xxx.xxxx/api/x/d/xc’ from origin ‘http://127.0.0.1:3000’ has been blocked by cors policy: No ‘Access-Contorl-Allow-Origin’ header is present on the requested resource. …

IDE Eval Reset —— idea 重置试用期插件安装

idea 重置试用期插件安装 一、在线安装&#xff1a; 1、打开IntelliJ IDEA 2、file—> setting —> plugins 添加三方插件库 点击后&#xff0c;跳出弹框点击号&#xff0c;添加图中的网址 https://plugins.zhile.io3、搜索 IDE Eval Reset &#xff0c;安装插件 4…

Excel·VBA二维数组S形排列

与之前的文章《ExcelVBA螺旋数组函数》将一维数组转为二维螺旋数组 本文将数组转为S形排列的二维数组&#xff0c;类似考场座位S形顺序 Function S形排列(ByVal arr, ByVal num_rows&, ByVal num_cols&, Optional ByVal mode$ "row")将数组arr转为num_rows…

动态规划求台阶

动态规划可以用来求解台阶问题&#xff0c;即在一个楼梯上&#xff0c;每次只能跨一个台阶或两个台阶&#xff0c;问有多少种不同的方式可以走到楼梯的顶部。 我们可以定义一个状态变量dp[i]&#xff0c;表示走到第i个台阶的不同方式数。则在第i个台阶上&#xff0c;只有两种走…

OpenHarmony开发案例:【分布式计算器】

介绍 本示例使用分布式能力实现了一个简单的计算器应用&#xff0c;可以进行简单的数值计算&#xff0c;支持远程拉起另一个设备的计算器应用&#xff0c;两个计算器应用进行协同计算。 远程拉起&#xff1a;通过StartAbility实现远端应用的拉起。 协同计算&#xff1a;通过…

ios包上架系列 一、打包机Flutter项目环境配置

打包的时候一定要断开网络&#xff0c;上线包名只能在打包机配置 1、Xcode 需要从其它电脑空投 版本号&#xff1a;14.3.1 升级到Xcode14.3后发现,从这个版本开始,苹果从Xcode中移除了ARC相关的库,会导致fluter项目下的原生工程使用Xcode编译原生代码没 有问题, 但是flutter项…

Python小工具提升工作效率【附完整版,可下载word】

1、多个ppt汇总成一个ppt的python代码实现: import win32com.client as win32 import os import re def find(s): pat = re.compile(r"\d+") result = pat.match(s) return int(result.group(0)) def join_ppt(path:str): """ :param path: ppt所…

springboot上传模块到私服,再用pom引用下来

有时候要做一个公司的公共服务模块。不能说大家都直接把代码粘贴进去&#xff0c;因为会需要维护很多份&#xff1b;这样就剩下两个方式了。 方式一&#xff1a;自己独立部署一个公共服务的服务&#xff0c;全公司都调用&#xff0c;通过http、rpc或者grpc的方式&#xff0c;这…

如何安装PyFluent

0.什么是PyFluent? 官方介绍如下&#xff1a; PyFluent 是 PyAnsys 生态系统的一部分&#xff0c; 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。 PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接…

基于GSP工具箱的NILM算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于GSP工具箱的NILM算法matlab仿真。GSP是图形信号处理的缩写&#xff0c;GSP非常适合对未知数据进行分类&#xff0c;尤其是当训练数据非常短时。GSPBox的基本理论是谱图论和…

WPF网格布局

1介绍: Grid为WPF中最常用的布局容器, 它可以将一个区域分为若干个行或列功用其他组件使用。 2&#xff1a;网格标签Grid.ColumnDef Grid网格区域Grid.ColumnDefinitions自定义列 只能设置宽度 不能设置高度ColumnDefinition 网格布局中列的区域(可以设置宽度&#xff0c…

构建强大的物联网平台系统架构:关键步骤与最佳实践

随着物联网&#xff08;IoT&#xff09;技术的快速发展和广泛应用&#xff0c;越来越多的企业开始意识到搭建一个强大而可靠的物联网平台系统架构的重要性。一个完善的物联网平台可以帮助企业高效地管理和监控各种连接设备&#xff0c;并实现数据的收集、处理和分析。在本文中&…

npm i -g nodemon 遇到的下载卡住及运行权限问题解决记录

一、下载nodemon原因 nodemon作用&#xff1a;用node环境运行js文件时可以实时刷新运行出结果 (即修改js代码后不需再手动重新运行js文件) 二、下载卡住 reify:semver:timing reifyNode:node_modules/nodemon Completed 卡住位置&#xff1a;reify:semver: timing reifyNode…

【muzzik 分享】3D模型平面切割

# 前言 一年一度的征稿到了&#xff0c;倒腾点存货&#xff0c;3D平面切割通常用于一些解压游戏里&#xff0c;例如水果忍者&#xff0c;切菜这些&#xff0c;今天我就给大家讲讲怎么实现3D切割以及其原理&#xff0c;帮助大家更理解3D中的 Mesh(网格)&#xff0c;以及UV贴图和…

2024年免费试用云服务器一览表

随着云计算技术的不断发展和普及&#xff0c;越来越多的企业和个人开始寻求通过云服务器来满足其数据存储、应用部署等需求。而免费试用云服务器则成为了一个吸引用户的重要手段&#xff0c;本文将为大家分享2024年免费试用云服务器一览表&#xff0c;帮助大家更好地选择合适的…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…