java 集合专练
handsomecui的blog地址为:http://www.cnblogs.com/handsomecui/
本人网站为:handsomecui.top
引言:本次主要练习单列集合:Collection,List,ArrayList,LinkedList,Vector,Set,HashSet,
1.Collect: 单列集合的跟接口;
2.List: 如果是实现了List接口的集合类,具备的特点: 有序,可重复
3.ArrayList:ArrayList的底层是使用了Object数组实现的,特点:查询速度快,增删慢
4.LinkedList:底层使用了链表数据结构实现的,特点:查询慢,增删快
5.Vector:底层使用了Object数组实现,实现与ArrayList一致,但是线程安全,操作效率低下
6.Set:如果实现了Set接口,具备的特点:无需,不可重复
7.HashSet:底层用哈希表实现的,特点:存取速度快
8.TreeSet:
(1)添加元素时,如果元素具备自然顺序的特点,那么TreeSet会根据元素自然顺序存取
(2)如果不具备自然顺序,那么元素所属的类就必须要实现Comparable接口,把比较的规则定义在ComepareTo的方法上。
(3)如果不具备自然顺序,而且元素所属的类也没有实现Comparable接口,那么必须在创建TreeSet对象的时候就必须传入比较器对象。
比较器的定义格式:
class 类名 implements Comparator{}
双列集合:
1.Map:存储的结构是以键值的形式存在的,键不可以重复,值可以重复
2.HashMap:底层也是用哈希表实现的。
3.TreeeMap:底层是红黑树数据结构实现的。
HashSet:
实例:
package com.java.base;
import java.util.HashSet;
class Person{
private int id;
private String name;
private int age;
public Person(int id, String name, int age){
this.name = name;
this.age = age;
this.id = id;
}
public String toString(){
return name + "的年龄是: " + age + "\n";
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return id;
}
@Override
public boolean equals(Object obj) {
Person person = (Person)obj;
return person.id == id;
}
}
public class hashSetLearn{
public static void main(String[] args){
HashSet<Person>hashset = new HashSet<Person>();
hashset.add(new Person(10, "张三", 21));
hashset.add(new Person(11, "李四", 21));
hashset.add(new Person(11, "李四", 21));
System.out.println(hashset);
}
}
往haset 中添加元素的时候会先用hashCode 的方法得到元素的hash值,然后把这个值经过运算得到位置,如果这个位置没有值,就放里面,如果有
就用equal的方法,如果true就重复,不允许添加,如果false就添加。
集合的遍历:
package com.java.base; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry; public class CollectVisited { public static void main(String[] args) {
ArrayList<String>list = new ArrayList<String>();
list.add("张三");
list.add("李四");
System.out.println("---------get方式遍历--------------");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i));
}
System.out.println(); //注意迭代器使用过程不能添加删除元素
System.out.println("---------迭代器的第一种访问方式--------------");
Iterator<String>iter = list.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + ",");
}
System.out.println(); System.out.println("---------迭代器的第二种访问方式--------------");
for(String item : list){
System.out.print(item);
}
System.out.println(); System.out.println("----------hashmap的第一种遍历----------------");
HashMap<String, String>map = new HashMap<String, String>();
map.put("张三", "001");
map.put("李四", "002");
map.put("王五", "003");
Set<Entry<String, String>>entrys = map.entrySet();//
for(Entry<String, String>entry : entrys){
System.out.println(entry.getKey() + "的代号是:" + entry.getValue());
} System.out.println("----------hashmap的第二种遍历----------------");
Iterator<Entry<String, String>>eiter = entrys.iterator();
while(eiter.hasNext()){
System.out.println(eiter.next());
} } }
java 泛型练习:
泛型的好处:
1.把运行时出现的问题提前至了编译时
2.避免了无谓的强制类型转换。
泛型方法的定义格式:
修饰符<声明自定义泛型>返回值类型 函数名(形参列表。。。)
泛型类的定义格式:
class 类名<声明自定义泛型>{
}
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
注意:
1.泛型中没有多态的概念,两边数据类型必须一致
2.在方法上的自定义泛型的具体数据类型是调用该方法的时候传入的实参确定的
package com.java.base;
import java.util.ArrayList;
interface MyInterface<T>{
public void add(T t);
public void remove(T t);
}
//自定义一个集合对象
class MyList <T> implements MyInterface<T> {
Object[] arr;
int index = 0;
public MyList(){
arr = new Object[10];
}
public void add(T o){
arr[index++] = o;
}
public int size(){
return index;
}
public T get(int i){
return (T)arr[i];
}
@Override
public void remove(T t) {
int j = -1;
for(int i = 0; i < index; i++){
if(((T)arr[i]).equals(t)){
j = i;
break;
}
}
for(; j < index - 1; j++){
arr[j] = arr[j + 1];
}
arr[index - 1] = null;
index--;
}
}
public class Genericity_exercise {
/*泛型的好处:
1.把运行时出现的问题提前至了编译时
2.避免了无谓的强制类型转换。
泛型方法的定义格式:
修饰符<声明自定义泛型>返回值类型 函数名(形参列表。。。)
泛型类的定义格式:
class 类名<声明自定义泛型>{
}
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
注意:
1.泛型中没有多态的概念,两边数据类型必须一致
2.在方法上的自定义泛型的具体数据类型是调用该方法的时候传入的实参确定的
*/
public static <T> T print(T o){
return o;
}
public static void main(String[] args) {
ArrayList<String>list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i).toUpperCase());
}
System.out.println(print(213));
System.out.println(print("asfd"));
MyList mylist = new MyList<String>();
mylist.add("eee");
mylist.add("fff");
mylist.add("ggg");
mylist.add("hhh");
mylist.remove("fff");
for(int i = 0; i < mylist.size(); i++){
System.out.println(mylist.get(i));
}
}
}
java 集合专练的更多相关文章
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)
Java集合概述.Set集合(HashSet类.LinkedHashSet类.TreeSet类.EnumSet类) 1.Java集合概述1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指 ...
- Java笔记:Java集合概述和Set集合
本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...
- Java集合(1)一 集合框架
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) java集合(4)一 红黑树. ...
- JAVA (集合和数据结构)
Collection和Collections的区别: 1.java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类 ...
- Java集合框架详解(全)
一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...
- 【由浅入深理解java集合】(二)——集合 Set
上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...
- 知识点:Java 集合框架图
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...
- JAVA—集合框架
ref:https://blog.csdn.net/u012961566/article/details/76915755 https://blog.csdn.net/u011240877/artic ...
随机推荐
- Linux备份
Eking<longpeisky@vip.qq.com> 19:35:17 增量备份是针对于上一次备份(无论是哪种备份):备份上一次备份后,所有发生变化的文件. (增量备份过程中,只备份 ...
- 《31天成为IT服务达人》之技能篇硬件维护技能概要
server维护技能 server硬件作为应用软件部署的基础平台,是基础架构中最为核心的设备.一旦server出现问题就会影响业务的正常开展.因此,server的运维管理对于企业整个IT运维管理 ...
- c语言学习之结构篇代码演示样例-输入n个同学的姓名,数学英语成绩,依照平均分从低到高排序并输出
#include<stdio.h> void main(){ const int count = 5;//定义数量 struct student{ char name[80]; float ...
- 从free命令看Linux内存管理
free命令是Linux系统下用来查看内存使用情况的,例如: $ free -h total used free shared buffers cached Mem: 7.8G 6.6G 1.3G 0 ...
- .NET基础拾遗(6)特性
1 神马是特性?如何自定义一个特性? (1)特性是什么 特性是一个对象,可以加载到程序集及程序集的对象中,这些对象包括 程序集本身.模块.类.接口.结构.构造函数.方法.方法参数等,加载了特性 ...
- MySql查看表信息
SELECT TABLE_NAME, TABLE_COMMENT -- 指定信息列 FROM `information_schema`.`tables` A WHERE A.`TABLE_SCHEMA ...
- [.NET | 發佈] 如何指定固定的目錄給程式調用的外部DLL?
1.OverView 一般程式只會查找與主程式同目錄的DLL檔案 解決方案主要可以參考這篇:http://support.microsoft.com/kb/837908 2.實作app.config方 ...
- 《第一行代码》学习笔记30-内容提供器Content Provider(3)
1."如何在自己的程序中访问其他应用程序的数据",思路->获取到该应用程序的内容URI,再借助ContentResolver进行CRUD操作. 2.要实现跨程序共享数据-&g ...
- .net 调用Oracle.Data.Access 组件提供的用于批量操作的方法—获取数据库表结构方法和跟参数赋值方法
1./// <summary> /// 获取当前目标表结构 /// </summary> /// <param name="tableName"> ...
- IOS 创建App的最佳捷径
简网App工场 ----------------创建App的最佳捷径