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 集合专练的更多相关文章

  1. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  2. Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)

    Java集合概述.Set集合(HashSet类.LinkedHashSet类.TreeSet类.EnumSet类) 1.Java集合概述1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指 ...

  3. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  4. Java集合(1)一 集合框架

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) java集合(4)一 红黑树. ...

  5. JAVA (集合和数据结构)

    Collection和Collections的区别: 1.java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类 ...

  6. Java集合框架详解(全)

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  7. 【由浅入深理解java集合】(二)——集合 Set

    上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...

  8. 知识点:Java 集合框架图

    知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...

  9. JAVA—集合框架

    ref:https://blog.csdn.net/u012961566/article/details/76915755 https://blog.csdn.net/u011240877/artic ...

随机推荐

  1. Android开发(20)--RadioGroup的使用

    RadioGroup 有时候比較实用.主要特征是给用户提供多选一机制. MainActivity.java package com.example.lesson16_radio; import and ...

  2. [AngularJS] Transforming raw JSON data to meaningful output in AngularJS

    angular.module('APP', []) .controller('MainController', function($scope, UserConstants){ var user = ...

  3. [转载]C#开源项目(国外的还是很多)

    C#开源项目(国外的还是很多)一.Ajax框架Ajax.NET Professional (AjaxPro)是最先把AJAX技术在微软.NET环境下的实现的AJAX框架之一.它在客户端脚本之上创建代理 ...

  4. GDI+编程的10个基本技巧(转)

    创建绘图表面 创建绘图表面有两种常用的方法.下面设法得到PictureBox的绘图表面. private void Form1_Load(object sender, System.EventArgs ...

  5. C#调用C++的DLL 数据类型转换

    /C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...

  6. Windows命令行(DOS命令)教程-6 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_5.html

    8. type [功能] 在屏幕上显示文本文件内容命令 [格式] type [C:][path]filename.ext [说明] type命令用来在屏幕上快速.简便地显示文本文件的内容,扩展名为TX ...

  7. 方法覆盖(override)”的要点

    方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!请自行编写代码测试以下特性:在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 结论:          在“ ...

  8. python中raw_input()与input()

    raw_input([prompt]) input([prompt]) # prompt:如果参数存在,直接输出到屏幕上,不会再另起一行 raw_input 如其字面意思一样,返回输入字符的字符串形式 ...

  9. 《APUE》读书笔记第十一章-线程

    本章主要介绍了线程,了解如何使用多线程在单进程环境中来执行多任务.由于多个线程共享其进程空间,所以必须采用同步的机制来保护数据的一致性. 一.线程的概念 典型的Unix系统都可以看成只有一个控制线程, ...

  10. android 开发中判断网络是否连接的代码

    在android的开发中,尤其是与访问网络有关的开发,都要判断一下手机是否连接上了网络,下面是一个判断是否连接网络的嗲吗片段: package cn.com.karl.util; import com ...