首页 > 其他分享 >泛型与集合

泛型与集合

时间:2023-05-24 15:13:06浏览次数:19  
标签:遍历 String System 集合 泛型 println out

泛型:

概述:泛型是带一个或多个类型参数的类或接口。(通过使用泛型我们就不用为每一种类型的数据写一个方法了。)

常用的类型参数名:E(表示元素)、K(表示键)、N(表示数字)、T(表示类型)、V(表示值)等。

定义格式:

修饰符 class 类名<代表泛型的变量> { }

例1: ArrayList集合(API):

class ArrayList {

​ public boolean add(E e){

​ // 代码

​ }

​ public E get(int index){

​ }

}

例2: ArrayList list = new ArrayList();

class ArrayList{

​ public boolean add(String e){}

​ public String get(int index){}

}

泛型通配符:

泛型类型本身是一个Java类型,
当使用泛型接口或者泛型类时(例如List和ArrayList),传递的数据中,泛型类型不确定,可以通过通配符<?>表示,但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用

例:(遍历)

public void test(List<?> list){
for(int i = 0; i < list.size(); i++){
System.out.pritnln(list.get(i));
}
}
【因为不知道集合中元素的具体类型,只能使用<?>通配符表示,任意的java类都可以匹配。】

集合框架:

集合(Collection)是java中提供的一种容器,可以用来存储多个数据。

所有的集合框架都包含如下内容:(下图由网络搜索出)

接口:是代表集合的抽象数据类型,例如:Collection、List、Set、Map等。之所以定义多个接口,是为了以不同的方式操作集合对象。

实现(类):是集合接口的具体实现,从本质上讲,它们是可重复使用的数据结构,例如:ArrayList,LinkedList,HashSet,HashMap.

算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如搜索和排序,这些算法被称为多态

java的集合框架主要包含两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键值对映射。Collection接口又有三种子类型,List,Set和Queue,再下面是一些抽象类,然后是具体实现类,常用的有ArrayList,LinkedList,HashSet,LinkedHashSet等等。
基本操作:(书p216)

boolean add(E e):向 集合中添加元素e;

boolean remove(Object o):从集合中删除指定的元素;

boolean contains(Object o): 返回集合中是否包含指定元素o;

boolean isEmpty(): 返回集合是否为空,即不包含元素;
int size(): 返回集合中包含的元素个数。
Iterator iterator():返回包含所有元素的迭代器对象;

default void forEach(Consumer<?super T>action):从父接口继承的方法,在集合的每个元素上执行指定的操作。

例:

import java.util.ArrayList;

import java.util.Collection;

public class Demo1Collection {

public static void main(String[] args) {

 

Collection c = new ArrayList();

c.add("他");

c.add("她");

c.add("它");

System.out.println(c);

System.out.println("判断 他 是否在集合中"+c.contains("他"));

System.out.println("删除她:"+c.remove("她"));

System.out.println("操作之后集合中元素:"+c);

System.out.println("集合中有"+c.size()+"个元素");

Object[] objects = c.toArray();

for (int i = 0; i < objects.length; i++) {

System.out.println(objects[i]);

}

c.clear();

System.out.println("集合中内容为:"+c);

System.out.println(c.isEmpty());

}

}

List接口:(collection子接口)

特点:是有序的集合,集合中每个元素都有对应的顺序序列。

List接口中常用子类:

ArrayList:最常用的线性表实现类,通过数组实现的集合对象;

                 构造方法【ArrayList();    ArrayList(Collection c);   ArrayList(int initialCapacity)】

LinkedList:底层的数据结构是链表,增删速度快。取出List集合中元素的方式:

Vector: 底层的数据结构就是数组,与ArrayList相同,不同点:线程安全,默认大小10,每次扩充1倍,Vector无论查询和增删都巨慢。(还有Stack)

List遍历方式:

// 创建集合对象
List<String> arrayList = new ArrayList<String>();
// 往集合的指定位置上添加给定的元素
arrayList.add(0, "a");
arrayList.add(1, "b");
arrayList.add(2, "c");
arrayList.add("d");
// 第一种遍历方式
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
// 第二种遍历方式
for (String arr : arrayList) {
System.out.println(arr);
}
// 第三种遍历
Iterator<String> iter = arrayList.iterator();
while (iter.hasNext()) {
String s = (String) iter.next();
System.out.println(s);
}

Set接口(无序,元素不可重复)

Collection子接口,Set无法记住添加的顺序,不允许包含重复的元素。

常用子类:

HashSet:散列存放无序,每次重新散列;

               构造方法【HashSet();  HashSet(Collection c);  HshSet(int initialCapacity);  HashSet(int initialCapacity,float loadFactor)】

TreeSet:不允许存储重复值,可排序,实现一种树集合(红-黑树)

LinkedHashSet:有序存放,带链表的

Set遍历方式:

public static void main(String[] args) {
Set<String> s = new HashSet<String>();
s.add("fff");
s.add("jkl");
s.add("eric");
s.add("loc");
s.add("hy");
s.add("tes");
System.out.println("第一种遍历方式");
Frist(s);
System.out.println("第二种遍历方式1");
Second1(s);
System.out.println("第一种遍历方式2");
Second2(s);
System.out.println("第一种遍历方式3");
Second3(s);

}
private static void Second3(Set<String> s) {
// 第三种情况:自己创建的数组大于集合元素的个数,这样会把前几个位置填充,剩下的返回null。
String[] ss = new String[10];
s.toArray(ss);
for (int i = 0; i < ss.length; i++) {
System.out.print(ss[i] + " ");
}
}
private static void Second2(Set<String> s) {
// 第二种情况:自己创建的数组大小正好等于集合的元素个数,这样就不用创建新的数组,返回的和创建的是同一个数组。
String[] ss = new String[6];
s.toArray(ss);
for (int i = 0; i < ss.length; i++) {
System.out.print(ss[i] + " ");
}
}

private static void Second1(Set<String> s) {
// 第二种遍历方式,含泛型的数组
// 第一种情况,自己创建的数组大小<小于集合的元素个数,这种情况会在集合内部产生一个新的数组,将之返回
String[] ss = new String[2];
String[] i1 = s.toArray(ss);
for (int i = 0; i < ss.length; i++) {
System.out.print(ss[i] + " ");
}
System.out.println("\n" + Arrays.toString(i1));
}

private static void Frist(Set<String> s) {
// 第一种遍历方式:
Object[] o = s.toArray();
for (int i = 0; i < o.length; i++) {
System.out.print(o[i] + " ");
}
System.out.println();
}

Map集合(键值对)

Map接口存储一组成对的键(key)-值(value)对象,key要求不允许重复,可无序,value允许重复,也可无序。HahMap是其最常用的实现类。

实现类:

HashMap:【HashMap();  HshMap(int initialCapacity);   HashMap(Map m) 】

TreeMap:【TreeMap();  TreeMap(int initialCapacity);   TreeMap(Map m) 】

注意:

1). 数据添加到HashMap集合后,所有数据类型将转换成Object类型,所有从其中获取数据时需要进行强制类型转换

2).HashMap不保证映射的顺序,特别是不保证顺序恒久不变。

Map 遍历:

Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "小王");
map.put("sex", "女");
map.put("age", "18");
map.put("phone", "11111111111111");

//第一种遍历方式:在for循环中使用entries实现Map的遍历
for(Map.Entry<String, Object> entry : map.entrySet()){
String mapKey = entry.getKey();
Object mapValue = entry.getValue();
System.out.println(mapKey+":"+mapValue);
}

//第二种遍历方式:在for循环中遍历key或者values,
//一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好
//key
for(String key : map.keySet()){
System.out.println(key);
}
//value
for(Object value : map.values()){
System.out.println(value);
}

//第三种遍历方式:通过Iterator遍历
Iterator<Entry<String, Object>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Entry<String, Object> entry = entries.next();
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key+":"+value);
}

//第四种遍历方式:通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作
for(String key : map.keySet()){
Object value = map.get(key);
System.out.println(key+":"+value);
}

 

标签:遍历,String,System,集合,泛型,println,out
From: https://www.cnblogs.com/yyyuy/p/17428336.html

相关文章

  • 泛型编程(GP)和C++标准模板库(STL)
    GenericProgramming(GP)泛型编程,就是使用template(模板)为主要工具来编写程序level0:使用C++标准库level1:认识C++标准库level2:良好使用C++标准库level3:扩充C++标准库C++StandardLibraryC++标准库,编译器带的,可以看到sourcecode至于StandardTemplateLibrary->STL标......
  • 控件包含代码块(即 <% ... %>),因此无法修改控件集合(用户自定义控件中)
    https://www.cnblogs.com/zlfucku/archive/2011/09/05/2167943.html原因:就是runat中不能有<%%>这样的东西,不然就会报这个错误解决办法: 这两行拖到body里就好了,不要放在有headrunat=server的代码块内,不然就报这个错。......
  • 2023.5.21学习内容 多态、接口、泛型、反射
    下午1.了解CSS响应式布局和兼容性问题2.浏览IDEA使用手册并修改Maven仓库设置3.复习强化JavaSE的多态、接口、泛型、反射知识importorg.junit.Test;importtest.Hello;importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.LinkedList;import......
  • java学习日记20230522-集合选择原则
    1.判断存储的类型,一组对象【单列】或者一组键值对【双列】2.一组对象【单列】:collection的子类:允许重复:List的某个实现类:增删多LinkedList(底层维护的是双向链表)                                改查多ArrayList(底层维护的是object类型的可......
  • python day08 字典、元组、集合内置方法
    字典的内置方法定义方式d={'usernamne':"kevin"}定义空字典:d={}1.key取值dic={'name':'kevin','age':18,'hobbies':['playgame','basketball']}print(dic['name'])#kevinp......
  • vue3遇到的问题集合
    1.vue3打包设置 2.vue3路由配置history 3.vue3屏蔽eslint ......
  • Python的基础语法(五)“数据内置方法之字典、元组、集合”
    字典的内置方法1、字典常用的定义方法:info={'name':'tony','age':18,'sex':'male'}info=dict(name='tony',age='18')2、字典的内置方法2.1、按照key取值,可存可取:dic={......
  • 若依框架当参数为Map集合时数据权限的设置
    1、controller接口参数类型@PreAuthorize("@ss.hasPermi('manual:staff:list')")@GetMapping("/list")publicTableDataInfolist(@RequestParamMap<String,Object>map){map.put("params",newParmStaffCostManu......
  • Python 1-19 集合
    Python1-19集合集合(set)是一个无序的不重复元素序列。创建集合,使用{}或者set(),注意:创建一个空集合必须用set(),因为{}是用来创建一个空字典。parame={value01,value02,...}或者set(value)>>>basket={'apple','orange','apple','pear','orange�......
  • 正则表达式集合
    正则表达式集合校验数字校验字符的表达式单例特殊需求表达式钱的输入格式其他表达式校验数字1、数字:^[0-9]*$2、n位的数字:^\d{n}$3、至少n位的数字:^\d{n,}$4、m-n位的数字:^\d{m,n}$5、零和非零开头的数字:^(0|[1-9][0-9]*)$6、非零开头的最多带两位小数的数字:^([1-9][0-9]*)*(.[0-9]......