集合框架_DAY17
1:五种数据结构:
数组:长度固定,有序,查找方便
链表:添加删除方便
栈:先进后出
队列:先进先出
树结构:完成排序动作
2:泛型(了解)
(1)是一种把明确数据类型的工作推迟到创建对象或者调用方法的时候采取明确的特殊的类型,将运行时的异常转到编译时的异常。
(2)格式:
<数据类型>
注 默认情况下,泛型是Object类型。
(3)好处:(理解)
A:优化了程序的设计。
B:把运行期的问题提前到了编译期。
D:避免了强制类型转换。
(4)泛型体现:
A:泛型类 :把泛型定义在类上 (见例题2)
B:泛型接口:把泛型定义在接口上
方式一:在类实现接口时定义范型(见例题3)
方式二:在类实现接口时任然不明确范型类型,在创建对象时明确范型类型(见例题3)
C:泛型方法 :把泛型定义在方法上(见例题4)
(5)泛型通配符,表示任意类型<?>。
<?>与<T>的差别:
通配符修饰的泛型不能直接使用而<T>可以使用
通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递,如collection的containsAll方法(见例题5)
使用<?>可以完成类型限定,可参见TreeSet构造方法
TreeSet(Collection<? extends E> c) , 限定类型上限 (见例题6)
TreeSet(Comparator<? super E> comparator)
, 限定类型下限
3:静态导入
import 包.包.类.静态成员(见例题 7)
4:可变参数
格式:方法名(参数类型... 变量名)(见例题8)
本质:将参数转成数组再进行操作
注意事项:
可变参数与数组类型不能重载,因为二者本质上是一样的;
可变参数必须放在最后。
5:Stack类(底部存储结构是堆栈)
Stack类的主要方法:
push():加入一个元素
pop():弹出一个元素(堆栈少一个元素)
peak():取出一个元素(堆栈中的元素不会少)
6:Arrays与Collections
数组与集合工具类
附:
1、完成ArrayList、LinkedList、HashSet、TreeSet的泛型使用。
import java.util.*;
public class GenericsTest {
public static void main(String[] args) {
System.out.println("-----------ArrayList----------------");
ArrayList<String> arrayList=new ArrayList<>(); String string1="唐嫣";
String string2="糖糖";
String string3="唐老鸭"; arrayList.add(string1);
arrayList.add(string2);
arrayList.add(string3);
//arrayList.add(2); 只能加String for(String string:arrayList){
System.out.println(string);
} Iterator<String> iterator= arrayList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
} System.out.println("---------------LinkedList---------------");
LinkedList<String> linkedList=new LinkedList<String>(); linkedList.add(string1);
linkedList.add(string2);
linkedList.add(string3); //linkedList.add(2); 只能加String for(String string:linkedList){
System.out.println(string);
} System.out.println("---------------HashSet---------------");
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(string1);
hashSet.add(string2);
hashSet.add(string3);
for(String string:hashSet){
System.out.println(string);
} System.out.println("---------------TreeSet---------------");
TreeSet<String> treeSet=new TreeSet<String>();
treeSet.add("1string");
treeSet.add("2string");
treeSet.add("3string");
treeSet.add("4花花");
treeSet.add("5绿绿");
for(String string:treeSet){
System.out.println(string);//TreeSet类实现了Comparable接口,里面的元素实现了自然排序
}
}
}
2、自定义范型类的使用
public class defGeneTest {
public static void main(String[] args) {
DedineGenerics<String> dedineGenerics=new DedineGenerics<String>();
dedineGenerics.setObj("自定义范型");
String obj=dedineGenerics.getObj();
System.out.println(obj); }
}
public class DedineGenerics<T> {
private T obj; public T getObj() {
return obj;
} public void setObj(T obj) {
this.obj = obj;
}
}
3、范型接口的两种使用方式
方式1:在类实现接口时定义范型
public interface MyInterface<T> { public abstract void method(T t);
}
public class MyClass implements MyInterface<String> { @Override
public void method(String t) { System.out.println(t);
} }
public class Demo2 { public static void main(String[] args) {
//不带泛型的类,直接创建对象即可。
MyClass myClass = new MyClass();
myClass.method("我爱中华,莫谈国事!"); }
}
方式2:在类实现接口时任然不明确范型类型,在创建对象时明确范型类型
//定义了MyClass2类,定义该类时,不明确接口的泛型类型,从而使该类也变成了泛型类。
public class MyClass2<T> implements MyInterface<T>{ @Override
public void method(T t) {
System.out.println(t);
} }
public class Demo2 {
public static void main(String[] args) {
//泛型类创建对象时,需要指定泛型类型。
MyClass2<Person> myClass2 = new MyClass2<Person>();
myClass2.method(new Person("唐嫣",28));
}
}
4、把泛型定义在方法上
public class Demo<T> { public static void main(String[] args) {
Demo<Person> p = new Demo<Person>(); p.method(new Person("唐嫣", 28)); p.method2(new Person("唐唐",26));
p.method2("唐嫣");
} public void method(T t){
System.out.println(t);
} public <E> void method2(E e){
System.out.println(e);
}
}
5、通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递,如collection的containsAll方法
public class Demo3 { public static void main(String[] args) { Collection<String> collection = new ArrayList<String>(); collection.add("唐嫣");
collection.add("唐三彩");
collection.add("唐伯虎");
collection.add("唐人街"); Collection<Person> collection2 = new ArrayList<Person>(); collection2.add(new Person("唐嫣",28));
collection2.add(new Person("baby",30));
collection2.add(new Person("杨颖",26)); collection.containsAll(collection2);
}
}
6、使用<?>可以完成类型限定,可参见TreeSet构造方法 TreeSet(Collection<? extends E> c) , 限定类型上限
public class Demo4 {
public static void main(String[] args) {
//public TreeSet(Collection<? extends E> c)
// Collection<Person> c = new ArrayList<Person>(); 存Person类型不可以
Collection<Cat> c = new ArrayList<Cat>(); //Cat类是Animal的子类,可以存
TreeSet<Animal> animals = new TreeSet<Animal>(c);
} }
7、静态导入
import static java.lang.System.out;
import static java.lang.Math.PI;
import static java.lang.Math.random; public class Demo5 { public static void main(String[] args) { System.out.println("hello");
System.out.println("hello");
System.out.println("hello"); out.print("hello");
out.print("hello");
out.print("hello"); double random = Math.random(); out.println(PI);
out.println(random());
}
}
8、可变参数
/*
* 可变参数: 即参数可变,可以传入任意个数的参数,只要数据类型相同,这些参数会自动存储到数组当中,只需要操作数组即可。
* 格式:函数名(参数类型... 数组名)
*
* 注意事项:
* 可变参数与数组类型不能重载,因为二者本质上是一样的。
* 可变参数必须放在最后
*/
public class Demo6 { public static void main(String[] args) { System.out.println(getSum(1, 2));
System.out.println(getSum("的调用", 2,3));
System.out.println(getSum(1, 2, 3));
System.out.println(getSum(1, 2, 3,4,5,6,7,8,9));
} // // 计算两个数字的和
// public static int getSum(int a, int b) {
// return a + b;
// }
//
// // 计算三个数字的和
// public static int getSum(int a, int b, int c) {
// return a + b + c;
// }
// 计算N个数字的和
public static int getSum(int... numbers) {
System.out.println("可变参数方法");
int sum = 0;
for (int i : numbers) {
sum += i;
}
return sum;
} public static int getSum(String b,int... numbers) {
System.out.println("可变参数方法"+b);
int sum = 0;
for (int i : numbers) {
sum += i;
}
return sum;
}
//可变参数与数组类型不能重载,因为二者本质上是一样的。
// public static int getSum(int[] numbers) {
// System.out.println("可变参数方法");
// int sum = 0;
// for (int i : numbers) {
// sum += i;
// }
// return sum;
// }
}
9、完成单列集合嵌套任意其他集合。如ArrayList当中元素为HashSet等
import java.util.ArrayList;
import java.util.HashSet; /*
* 完成单列集合嵌套任意其他集合。如ArrayList当中元素为HashSet等。
*/
public class CollectionNesting {
public static void main(String[] args) {
ArrayList<HashSet> arrayList=new ArrayList<HashSet>(); HashSet<String> hashSet1=new HashSet<String>();
hashSet1.add("宝宝");
hashSet1.add("乖乖");
hashSet1.add("亲爱的");
hashSet1.add("花花"); HashSet<String> hashSet2=new HashSet<String>();
hashSet2.add("宝宝");
hashSet2.add("乖乖");
hashSet2.add("亲爱的");
hashSet2.add("花花"); HashSet<String> hashSet3=new HashSet<String>();
hashSet3.add("宝宝");
hashSet3.add("乖乖");
hashSet3.add("亲爱的");
hashSet3.add("花花"); arrayList.add(hashSet1);
arrayList.add(hashSet2);
arrayList.add(hashSet3); System.out.println(arrayList);
}
}
10、产生10个1-20之间的随机数要求随机数不能重复案例。
public class Test2 { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<Integer>(); for (int i = 1; i <=20 ; i++) {
arrayList.add(i);
} Collections.shuffle(arrayList);//随机打乱顺序,取前10个 for (int i = 0; i < 10; i++) {
Integer integer = arrayList.get(i);
System.out.print(integer+" ");
}
} }
11、键盘录入多个数据在控制台输出最大值案例
方法1:
/**
*键盘录入多个数据在控制台输出最大值案例
*/
public class shuffle {
public static void main(String[] args) {
System.out.println("请输入任意个数,以输入0结束:");
Scanner in = new Scanner(System.in);
//创建集合
List list = new ArrayList();
//向集合里添加元素
while(true) {
int num=in.nextInt();
if(num !=0){
list.add(num);
}else{
break;
}
}
//打印集合
System.out.println("您输入的数是:");
System.out.println(list);
//求集合里的最大值
int maxNum = (int)Collections.max(list);
//输出最大值
System.out.println("最大值是:"+maxNum);
}
}
方法2:
import java.util.*; /**
*键盘录入多个数据在控制台输出最大值案例
*/
public class shuffle {
public static void main(String[] args) {
//键盘录入
Scanner sc=new Scanner(System.in); String str=sc.nextLine(); //建TreeSet集合
TreeSet treeSet=new TreeSet();
//切割字符串成字符串数组
String[] strings=str.trim().split(" +"); //字符串数组转Integer类型数组,并且存在集合中
for (String string:strings){
Integer integer=Integer.parseInt(string);
treeSet.add(integer);
} //排序过后的treeSet
System.out.println(treeSet); //输出做大值
int max=(int)treeSet.last();
System.out.println(max);
}
}
12、键盘录入多个数据,按数据从小到大的顺序打印到控制台
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner; /**
* 键盘录入多个数据,按数据从小到大的顺序打印到控制台
*/
public class InputNumSort {
public static void main(String[] args) {
System.out.println("请输入任意个数,以输入0结束:");
Scanner in = new Scanner(System.in);
//创建集合
List list = new ArrayList();
//向集合里添加元素
while(true) {
int num=in.nextInt();
if(num !=0){
list.add(num);
}else{
break;
}
}
//打印集合
System.out.println("您输入的数是:");
for(Object num:list){
System.out.print(num+" ");
} //从大到小的顺序排序
Collections.sort(list); System.out.println(); //排序后的集合输出到控制台
System.out.println("排序后的数是:");
for(Object num:list){
System.out.print(num+" ");
}
}
}
集合框架_DAY17的更多相关文章
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 【目录】JUC集合框架目录
JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之Concurr ...
- java面试题——集合框架
先来看一下集合框架关系图 Collection FrameWork 如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └S ...
- Java使用实现面向对象编程:第七章集合框架的解读=>重中之重
对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- Java 之 集合框架(JCF)
1.集合框架 a.框架:为了实现某一目的或功能,而预先提供的一系列封装好的.具有继承或实现关系的类与集合 b.集合:①定义:Java中对一些数据结构和算法进行封装,即封装(集合也是一种对象) ②特点: ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
随机推荐
- mysql的myBatis,主键自增设置
方法一: insert id="insert" parameterType="Person" useGeneratedKeys="true" ...
- 分分钟搞懂rank() over(partition by)的使用
一.rank() over(partition by ...order by) 解释:partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组. 二.语法:ROW_NUM ...
- windows10; ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17);默认数据库位置查找
1.想要导入数据到一个数据库中,但是,无法导入,同时也无法删除数据库重新建立-----------------------------备份当前数据库 2,分析:很多资料显示说数据库下有异常文件,于是就 ...
- location位置操作
使用location对象可以通过很多方式来改变浏览器的位置. location.assign('http://www.klkx.com') 传入一个URL地址 这样可以立即打开一个新的URL并在浏览器 ...
- hibernate4.3.5,Final hibernate.cfg.xml的配置
今天是接触hibernate的第二天,用来练习的是hibernate最新的版本hibernate-release-4.3.5.Final 要使用hibernate,则先要引入它的jar包,要引入的ja ...
- html5 ajax多图片可预览上传图片
最近不是特别忙,我就利用html5写了个上传图片(或其他文件)的页面,主要利用是html5的file api,此页面比较简陋,没做样式的优化,包含上传图片预览,多图片上传,上传进度条(利用html5的 ...
- Ng第十七课:大规模机器学习(Large Scale Machine Learning)
17.1 大型数据集的学习 17.2 随机梯度下降法 17.3 微型批量梯度下降 17.4 随机梯度下降收敛 17.5 在线学习 17.6 映射化简和数据并行 17.1 大型数据集的学习 ...
- c51较c比较,单片机最小系统
sfr(Special function registers):特殊功能寄存器声明 bit:位变量声明 sbit:特殊位声明 psw^2,表示psw寄存器上的第2位 << >> ...
- IntelliJ IDEA配置Tomcat(完整版教程)
查找该问题的童鞋我相信IntelliJ IDEA,Tomcat的下载,JDK等其他的配置都应该完成了,那我直接进入正题了. 1.新建一个项目 2.由于这里我们仅仅为了展示如何成功部署Tomcat,以及 ...
- java中三种注释
//单行注释 /* 多行注释 */ /** * 文档注释 * version 2018.10.25 * authou GMY */