Java--List和Set

本文详细介绍了Java集合框架中的List和Set容器类,包括它们的特点、用法及内部实现原理。对比了ArrayList和LinkedList的不同应用场景,解释了HashSet、TreeSet和LinkedHashSet如何存储唯一元素并保持特定顺序。
List和Set的用法
容器类可以大大提高编程效率和编程能力,在Java2中,所有的容器都由SUN公司的Joshua Bloch进行了重新设计,丰富了容器类库的功能。

Java2容器类类库的用途是“保存对象”,它分为两类:

Collection----一组独立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set不能有重复元素。

Map----一组成对的“键值对”对象,即其元素是成对的对象,最典型的应用就是数据字典,并且还有其它广泛的应用。另外,Map可以返回其所有键组成的Set和其所有值组成的Collection,或其键值对组成的Set,并且还可以像数组一样扩展多维Map,只要让Map中键值对的每个“值”是一个Map即可。

1.迭代器

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

2.List的功能方法

List(interface): 次序是List最重要的特点;它确保维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。

ArrayList: 由数组实现的List。它允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和删除元素,因为这比LinkedList开销要大很多。

LinkedList: 对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

3.Set的功能方法

Set(interface): 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。

TreeSet: 保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。

LinkedHashSet: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计的;TreeSet采用红黑树的数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。
本篇文章来源于 :刘志猛博客 原文链接:[url]http://www.liuzm.com/article/java/0963b.htm[/url]
### Javasetget方法的入门知识 在Java编程语言中,`set` `get` 方法是一种常见的编码模式,用于访问类中的私有成员变量。这种设计遵循了面向对象编程中的封装原则,通过将属性设为私有(`private`),并提供公共(`public`)的 getter setter 方法来控制对这些属性的访问修改[^1]。 #### 1. 封装的意义 封装是面向对象编程的核心概念之一,它允许将数据(属性)操作数据的方法绑定在一起,并对外隐藏实现细节。通过使用 `private` 关键字限制直接访问属性,可以确保数据的安全性一致性。例如,如果某个属性需要满足特定条件才能被修改,可以在 `set` 方法中添加验证逻辑[^4]。 #### 2. `get` `set` 方法的基本形式 以下是一个简单的例子,展示了如何定义 `get` `set` 方法: ```java public class Person { private String name; // 私有属性 private int age; // 私有属性 // Getter 方法 public String getName() { return name; } // Setter 方法 public void setName(String name) { this.name = name; } // Getter 方法 public int getAge() { return age; } // Setter 方法 public void setAge(int age) { if (age > 0) { // 添加验证逻辑 this.age = age; } else { System.out.println("年龄必须大于0"); } } } ``` 在上述代码中: - `getName()` `getAge()` 是 `get` 方法,用于获取属性值。 - `setName(String name)` `setAge(int age)` 是 `set` 方法,用于设置属性值。`setAge` 方法中还包含了一个简单的验证逻辑,以确保年龄值的有效性。 #### 3. 使用场景 `get` `set` 方法通常用于以下场景: - **数据封装**:保护类的内部状态,防止外部直接修改属性。 - **数据验证**:在 `set` 方法中添加逻辑,确保属性值符合预期规则。 - **灵活性**:即使将来需要更改属性的存储方式或计算逻辑,也可以通过修改 `get` `set` 方法而不影响调用方代码[^3]。 #### 4. 示例代码 以下是一个完整的示例,演示如何使用 `get` `set` 方法: ```java public class TestPerson { public static void main(String[] args) { Person person = new Person(); // 使用 set 方法设置属性值 person.setName("Alice"); person.setAge(25); // 使用 get 方法获取属性值 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } ``` 运行结果: ``` Name: Alice Age: 25 ``` #### 5. List 接口中的 `get` `set` 方法 除了类中的 `get` `set` 方法外,Java 的集合框架(如 `List` 接口)也提供了类似的命名方法。例如,`List` 的 `get` 方法用于根据索引获取元素,而 `set` 方法用于替换指定索引位置的元素[^2]。 以下是一个使用 `List` 的 `get` `set` 方法的示例: ```java import java.util.ArrayList; import java.util.List; public class TestList { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add("C++"); list.add("Python"); // 使用 get 方法获取元素 System.out.println("Original element at index 1: " + list.get(1)); // 使用 set 方法替换元素 String oldValue = list.set(1, "Go"); System.out.println("Replaced element: " + oldValue); System.out.println("Updated list: " + list); } } ``` 运行结果: ``` Original element at index 1: C++ Replaced element: C++ Updated list: [Java, Go, Python] ``` #### 6. 自动生成 `get` `set` 方法 在实际开发中,手动编写 `get` `set` 方法可能会显得繁琐。大多数现代IDE(如 IntelliJ IDEA 或 Eclipse)都提供了自动生成这些方法的功能。只需右键选择相关选项即可快速生成所需的代码。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值