标签:调用 ring dash 元素 不包含 排序 不同 person 进制
数据结构:
数据结构_栈:先进后出
数据结构_队列:先进先出
数据结构_数组:
例: int[] arr = new int[]{1,2,3,4};
要把数组索引是3的元素删除
数据结构_链表:
链表中的每一个元素也称之为一个节点
一个节点包含了一个数据源(存储数组),两指针域(存储地址)
二叉树:分支不能超过两
红黑树:
特点:趋近于平衡树,查询的速度非常的快,查询叶子节点最大次数和最小次数不能超过2倍
约束:
java.util.list接口 extends Collection接口
List接口的特点:
List接口中带索引的方法(特有):
public void add(int index,E element):将指定的元素,添加到该集合中的指定位置上。 public E get(int index):返回集合中指定位置的元素。 public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。 public E set(int index,E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意:
操作索引的时候,一定要防止索引越界异常
//创建一个List集合对象,多态 List<String> list = new ArrayList<>(); { //public void add(int index,E element):将指定的元素,添加到该集合中的指定位置上。 //在索引2和索引3之间添加一个cainiao list.add(3,"cainiao");//{a,b,c,d}-->{a,b,c,cainiao,d} //移除元素 String removeE = list.remove(2) //替换元素 String setE = list.set(4,"A"); }
java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
java.util.LinkedList集合数据存储的结构是链结构。方便元素添加,删除的集合。
java.util.LinkedList集合 implements List接口
ArrayList集合的特点:
注意:
使用ArrayList集合特有的方法,不能使用多态
Vector 类可以实现可增长的对象数组。
与新collection不同,Vector是同步的。
java.util.Set接口 extends Collection接口
Set接口的特点:
java.util.HashSet集合 implements Set接口
HashSet特点:
Set<Integer> set = new HashSet<>(); //使用add方法往集合中添加元素 set.add(1); set.add(3); set.add(2); set.add(1); //使用迭代器遍历Set集合 Iterator<Integer> it = set.iterator(); while(it.hasNext(){ Iterator n = it.next(); System.out.println(n);//1,2,3 无序且不重复 }
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
HashCode方法的源码:
public native int hashCode(); native:代表该方法调用的是本地操作系的的方法
哈希表:hashSet集合存储数据的结构
jdk1.8版本之前:哈希表 = 数组+链表
jdk1.8版本之后:
哈希表的特点:速度快
存储数据到集合中,先计算元素的哈希值
数组结构:把元素进行了分组(相同哈希值的元素是一组)
链表/红黑树结构:把相同哈希值的元素连到一起(如何链表的长度超过了8位,那么就会把链转换位红黑树(提高查询的速度))
Set集合存储元素不重复的元素的前提:
前提:存储的元素必须重写hashCode方法和equals方法
//创建HashSet集合对象 HashSet<String> set = new HashSet<>();//哈希表:数组+链表/红黑树 String s1 = new String("abc"); String s2 = new String("abc"); set.add(s1); set.add(s2); set.add("重地"); set.add("通话"); set.add("abc"); System.out.println(set);/[重地,通话,abc]
原因:
Set集合在调用add方法的时候,add方法会调用元素hashCode方法和equals方法,判断元素是否重复
Set集合报错元素原因:
存储的元素(String,Integer,...Student,Person...),必须重写hashCode方法和equals方法
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树+链表:多了一条链(记录元素的存储顺序),保存元素有序
HashSet<String> set = new HashSet<>();//[]无序,不允许重复 LinkedHashSet<String> set = new LinkedHashSet<>();[]//有序,不允许重复
可变参数:是JDK1.5 之后出现的新特性
使用前提:
使用格式:定义方法时使用
可变参数的原理:
可变参数的注意事项:
public static void method(String b, double c ,int d ,int...a){} //可变参数的特殊(终极)写法 public static void method(Object...obj){} Collections集合工具类的方法 java.util.Collections是集合工具类,用来对集合进行操作。部分方法如下: public static <T> void sort(List<T> List ,Comparator<? super T>):将集合中元素按照指定规则排序。 Comparator和Comparable的区别 Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法 Comparator:相当于找一个第三方的裁判,比较两 Comparator的排序规则: o1-o2:升序
Collection接口: 定义了单列集合规范 Collection<E>
Map接口:定义了双列集合的规范 Map<K,V>
Map集合的特点:
java.util.HashMap<K,V>集合 implements Map<K,V>接口
HashMap集合的特点:
1.HashMap集合底层是哈希值:查询的速度特别的快
2.HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
java.util.LinkedHashMap<k,v>集合 extends HashMap<K,V>集合
LinkedHashMap的特点:
public V put (K key,V value):把指定的键与指定的值添加到Map集合中。
返回值:v
public V remove(Object key):把指定的值 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
返回值:V
public V get(Object key)根据指定的键,在Map集合中获取对应的值。
返回值:
boolean containsKey(Object key) 判断集合中是否包含指定的键
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
实现步骤:
Map.Entry<K,V>:在Map接口中有一个内部接口Entry
作用:当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象,键与值的映射关系)
Map集合遍历的第二种方式:使用Entry对象遍历
Set<Map.Entry<K,V> entrySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
key:Person类型
value:String类型
java.util.linkedHashMap<K,V> extends HashMap<K,V>
Map 接口的哈希表和链表列表实现,具有可预知的迭代顺序。
底层原理:
java.util.Hashtable<K,V>集合 implements Map<k,V>接口
分析:
1.使用Scanner获取用户输入的字符串
2.创建Map集合,key是字符串中的字符,value是字符的个数
3.遍历字符串,获取每一个字符
4.使用获取到的字符,去Map集合判断key是否存在
通过字符(key),获取value(字符个数) value++ put(key,value)把新的value存储到Map集合中
put(key,1)
5.遍历Map集合,输出结果
public class CaiNiao{ public static void main(String[] args){ //1.使用Scanner获取用户输入的字符串 Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String str = sc.next(); //2.创建Map集合,key是字符串中的字符,value是字符的个数 HashMap<Character.Integer> map = new HashMap<>(); //3.遍历字符串,获取每一个字符 for(char c : str.toCharArray()){ //4.使用获取到的字符,去Map集合判断key是否存在 if(map.containsKey(c)){ //key存在 Integer value = map.get(c); value++; map.put(c,value); }else{ //key不存在 map.put(c,1); } } //5.遍历Map集合,输出结果 for(Character key : map.keySet(){ Integer value = map.get(key); System.out.println(key+"="+value); } } }
JDK9的新特性:
使用前提:
注意:
Debug调试程序:
使用方式:
执行程序:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class CaiNiao{ public static void main(String[] args){ //1.准备牌 //创建一个Map集合,存储牌的索引和组装好的牌 HashMap<Integer,String> poker = new HashMap<>(); //创建一个List集合,存储花色和牌索引 ArrayList<Integer> pokerIndex = new ArrayList<>(); //定义两个数组,一个数组存储牌的花色,一个数组存储牌的序号 String[] colors = {"?","?","?","??"}; String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; //先把大王和小王存储到集合中 //定义一个牌的索引 int index = 0; poker.put(index,"大王"); pokerIndex.add(index); index++; poker.put(index,"小王"); pokerIndex.add(index); index++; //循环嵌套遍历两个数组,组装52张牌 for(String numbers:numbers){ for (String color : colors){ poker.put(index.color+number); pokerIndex.add(index); index++; } } // System.out.println(poker); // System.out.println(pokerIndex); /* 2.洗牌 使用集合的工具类Collections中的方法 static void shuffle(List<?> list) 使用默认的随机源对指定列表进行置换。 */ Collections.shuffle(poker); //System.out.println(poker); /* 3.发牌 */ //定义4 个集合,存储玩家的牌和底牌 ArrayList<String> player01 = new ArrayList<>(); ArrayList<String> player02 = new ArrayList<>(); ArrayList<String> player03 = new ArrayList<>(); ArrayList<String> dipai = new ArrayList<>(); /* 遍历poker集合,获取每一张牌 使用poker集合的索引%3给3个玩家轮流发牌 剩余3张牌给底牌 注意: 先判断底牌(i>51),否则牌就发没了 */ for(int i = 0;i<poker.size();i++){ //获取每一张牌 String p = poker.get(i); //轮流发牌 if(i>=51){ //给底牌发牌 diPai.add(p); }else if (i%3==0){ //给玩家1发牌 player01.add(p); }else if (i%3==1){ //给玩家2发牌 player02.add(p); }else if(i%3==2){ //给玩家3发牌 player03.add(p); } } /* 4.排序 使用Collectio中的方法sort(List) 默认是升序排序 */ Collection.sort(player01); Collection.sort(player02); Collection.sort(player03); Collection.sort(dipai); //5.看牌 lookpoker("刘德华:",poker,player01); lookpoker("周润发:",poker,player02); lookpoker("周星驰:",poker,player03); lookpoker("底牌 :",poker,dipai); } /* 定义一个看牌方法,提高代码的复用性 参数: String name:玩家名称 HashMap<Integer,String> poker:存储牌的poker集合 ArrayList<Integer> List:存储玩家和底牌的list集合 查表法: 遍历玩家或者底牌集合,获取牌的索引 使用牌的索引,去Map集合中,找到对应的牌 */ public static void lookpoker(String name ,HashMap<Integer,String> poker,ArrayList<Integer> list){ //输出玩家名称,不换行 System.out.println(name + ";"); //遍历玩家或者底牌集合,获取牌的索引 for(Integer key : list){ //使用牌的索引,去Map集合中,找到对应的牌 String value = poker.get(key); System.out.println(value+""); } System.out.println();//打印完每一个玩家的牌,换行 } }
标签:调用 ring dash 元素 不包含 排序 不同 person 进制
原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/11223283.html