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 ...
随机推荐
- flash与字符串:字符串与属性
有时候,我们想通过设置一个DisplayObject 类是属性值,只是需要通过点来引用即可.有时候,通过字符串也可以引用显示对象里面的属性值. 下面举个例子 . ...
- 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)
相对于第一篇来讲,这里讲的是磁盘缓存的延续.在这里我们主要是关注四个类.各自是DiskLruCache.LruDiskCache.StrictLineReader以及工具类Util. 接下来逐一的对它 ...
- char图表
首先看一下chart图表相应的各个属性: 要想使用chart图表,首先须要安装MSChart.exe:安装完后,工具箱里仍然没有,此时要在web.Config文件中加入以下代码: <span s ...
- [RxJS] Changing Behavior with MapTo
You often need streams to trigger different behaviors on the data based on which streams triggers. T ...
- [RxJS] Updating Data with Scan
You often need to update the data flowing through the stream with custom logic based on what you nee ...
- asp.net从服务器(指定文件夹)下载任意格式的文件到本地
一.我需要从服务器下载ppt文件到本地 protected void Btn_DownPPT_Click(object sender, EventArgs e) { ...
- oracle数据库ID自增长
使用sequence --创建sequenceCREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 ...
- I/O复用-epoll模型
epoll函数 epoll函数的使用与select.poll上有很大的差异. epoll使用一组函数来完成任务,而不是单个函数. epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而 ...
- js迭代器模式
在迭代器模式中,通常有一个包含某种数据的集合的对象.该数据可能储存在一个复杂数据结构内部,而要提供一种简单 的方法能够访问数据结构中的每个元素. 实现如下: //迭代器模式 var agg = (fu ...
- Python多线程,threading的用法
虫师的文章: 需要注意的是: threads = [ ] t1 = threading.Thread(target=music,args=(u'爱情买卖',)) threads.append(t1) ...