List常用集合子类的特点

ArrayList底层数据结构是数组

查询快,增删慢

LinkedList底层数据结构是链表

查询慢,增删快

练习:
//ArrayList实现
import java.util.*; public class Main {
public static void main(String[] args) {
ArrayList<String> a=new ArrayList<String>();
a.add("hello");
a.add("world");
a.add("java"); Iterator<String> it=a.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
} //LinkedList实现
import java.util.*; public class Main {
public static void main(String[] args) {
LinkedList<String> ll=new LinkedList<String>();
ll.add("hello");
ll.add("world");
ll.add("java"); for(String s:ll){
System.out.println(s);
}
}
}
案例:ArrayList集合存储学生对象用三种方式遍历
import java.util.*;

public class Main {
public static void main(String[] args) {
ArrayList<DateUtils> array=new ArrayList<DateUtils>();
DateUtils s1=new DateUtils("lili",19);
DateUtils s2=new DateUtils("zhangliang",20);
DateUtils s3=new DateUtils("wangwu",18); array.add(s1);
array.add(s2);
array.add(s3);
//增强for循环
for(DateUtils s:array){ System.out.println(s.getName()+","+s.getAge());
}
//普通for循环
for(int i=0;i<array.size();i++){
System.out.println(i);
}
//迭代器
while(it.hasNext()){
DateUtils s=it.next();
System.out.println(s.getName()+","+s.getAge());
}
}
}
LinkedList集合的特有功能
import java.util.*;

public class Main {
public static void main(String[] args) {
LinkedList<String> ll=new LinkedList<String>();
//在第一位添加指定元素
ll.addFirst("hello");
//在末尾添加指定元素
ll.addLast("world");
//在第一位删除元素
ll.removeFirst();
//删除末尾元素
ll.removeLast();
//返回首位元素
System.out.println(ll.getFirst());
//返回末尾元素
System.out.println(ll.getLast());

Set集合

注意:不包含重复元素,不能使用普通for循环遍历
存储字符串并遍历练习
import java.util.*;

public class Main {
public static void main(String[] args) {
Set<String> ss=new HashSet<String>(); ss.add("hello");
ss.add("world");
ss.add("java");
//不可重复
ss.add("hello"); //加强for循环遍历
for(String s:ss){
System.out.println(s);
}
}
}
哈希值
public int hashCode();//返回哈希值
//同一个对象多次调用返回的哈希值是一样的
//默认情况下,不同对象,即便内容相同,返回的哈希值是不一样的
//在重写了hashCode方法的情况下,可以使得哈希值相同
System.out.println(s.hashCode());//得到某位对象的哈希值
hashSet集合
底层数据结构是哈希表
没有顺序,不保证存入与取出一致
不能用普通for循环遍历
不包含重复元素
存储字符串并遍历练习
import java.util.*;

public class Main {
public static void main(String[] args) {
HashSet<String> hh=new HashSet<String>();
hh.add("hello");
hh.add("world");
hh.add("java");
//增强for循环遍历
for(String s:hh){
System.out.println(s);
}
}
}
HashSet集合保证唯一性源码分析
常见数据结构之哈希表(元素为链表的数组)
相关练习:
//Main.java
import java.util.*; public class Main {
public static void main(String[] args) {
HashSet<Student> hh=new HashSet<Student>(); Student s1=new Student("lili",19);
Student s2=new Student("zhangliang",20);
Student s3=new Student("wangwu",18); hh.add(s1);
hh.add(s2);
hh.add(s3); for(Student s:hh){
System.out.println(s.getName()+","+s.getAge());
}
}
} //Student.java
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
}
LinkedHashList集合
元素的存储顺序和取出顺序是一致的
没有重复元素
相关练习:存储字符串并遍历
import java.util.*;

public class Main {
public static void main(String[] args) {
LinkedHashSet<String> ll=new LinkedHashSet<String>(); ll.add("hello");
ll.add("world");
ll.add("java"); for(String s:ll){
System.out.println(s);
}
}
}
TreeSet集合
元素有序:由具体的构造方法决定相应的顺序
不包含重复元素
不能用普通for循环遍历
相关练习:
import java.util.*;

public class Main {
public static void main(String[] args) {
TreeSet<Integer> tt=new TreeSet<Integer>();
tt.add(10);
tt.add(100);
tt.add(1000); for(Integer mm:tt){
System.out.println(mm);
}
}
}
自然排序Comparable的应用
//Main.java
import java.util.*; public class Main {
public static void main(String[] args) {
TreeSet<Student> ss=new TreeSet<Student>();
Student s1=new Student("lili",19);
Student s2=new Student("zhangliang",20);
Student s3=new Student("wangwu",18); ss.add(s1);
ss.add(s2);
ss.add(s3);
for(Student s:ss){
System.out.println(s.getName()+","+s.getAge());
}
}
} //Student.java
//按照存储顺序
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
return 1;
}
}
//反向存储顺序
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
return -1;
}
}
//按照年龄顺序
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
int num=this.age-o.age;
return num;
}
}
//反向年龄顺序
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
int num=o.age-this.age;
return num;
}
}
//年龄相同时,按照名字顺序排序
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
int num=this.age-o.age;
int num1=num==0?this.name.compareTo(o.name):num;
return num1;
}
}
比较器排序Comparator的应用
//Main.java
import java.util.*; public class Main {
public static void main(String[] args) {
TreeSet<Student> ss=new TreeSet<Student>(new Comparator<Student>(){
@Override
public int compare(Student s1,Student s2){
int num=s1.getAge()-s2.getAge();
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
Student s1=new Student("lili",19);
Student s2=new Student("zhangliang",20);
Student s3=new Student("wangwu",18); ss.add(s1);
ss.add(s2);
ss.add(s3);
for(Student s:ss){
System.out.println(s.getName()+","+s.getAge());
}
}
} //Student.java
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} @Override
public int compareTo(Student o) {
int num=this.age-o.age;
int num1=num==0?this.name.compareTo(o.name):num;
return num1;
}
}
案例:成绩排序(比较器排序)
//Main.java
import java.util.*; public class Main {
public static void main(String[] args) {
TreeSet<Student> ss=new TreeSet<Student>(new Comparator<Student>(){
@Override
public int compare(Student s1,Student s2){
//主要条件
int num=(s2.getYuwen()+s2.getMath())-(s1.getYuwen()+s1.getMath());
//次要条件
int num2=num==0?s1.getYuwen()-s2.getYuwen():num;
int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
return num3;
}
});
Student s1=new Student("lili",100,98);
Student s2=new Student("zhangliang",20,79);
Student s3=new Student("wangwu",98,76); ss.add(s1);
ss.add(s2);
ss.add(s3);
for(Student s:ss){
System.out.println(s.getName()+","+s.getYuwen()+","+s.getMath());
}
}
} //Student.java
public class Student implements Comparable<Student>{
private String name;
private int age;
private int yuwen;
private int math;
public Student(){}
public Student(String name, int age){
this.name=name;
this.age=age;
}
public Student(String name,int yuwen,int math){
this.name=name;
this.yuwen=yuwen;
this.math=math;
}
public void setName(String name){
this.name=name;
} public String getName(){
return name;
} public void setAge(int age){
this.age=age;
} public int getAge(){
return age;
} public void setYuwen(int yuwen){
this.yuwen=yuwen;
} public int getYuwen(){
return yuwen;
} public void setMath(int math){
this.math=math;
} public int getMath(){
return math;
}
案例:不重复的随机数
//HashSet--->不进行排序
import java.util.*; public class Main {
public static void main(String[] args) {
Set<Integer> tt=new TreeSet<Integer>();
Random r=new Random();
while(tt.size()<10){
int number=r.nextInt(20)+1;
tt.add(number);
} for(Integer i:tt){
System.out.println(i);
}
}
}
//TreeSet--->进行大小排序
import java.util.*; public class Main {
public static void main(String[] args) {
Set<Integer> tt=new HashSet<Integer>();
Random r=new Random();
while(tt.size()<10){
int number=r.nextInt(20)+1;
tt.add(number);
} for(Integer i:tt){
System.out.println(i);
}
}
}

泛型

好处:1、将运行时期的问题提前到了编译时期;2、避免了强制转换

基础练习:

import java.util.*;

public class Main {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
c.add(100);
Iterator it=c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
泛型类
//定义格式
修饰符 class 类名<类型>{}
相关应用:
//DateTest.java
public class DateTest<T>{
private T t;
public T getT(){
return t;
}
public void setT(T t){
this.t=t;
}
} //Main.java
public class Main {
public static void main(String[] args) {
DateTest<String> ll=new DateTest<String>();
ll.setT("lili");
System.out.println(ll.getT()); DateTest<Integer> i=new DateTest<Integer>();
i.setT(100);
System.out.println(i.getT());
}
}
泛型方法:
//格式
修饰符<类型> 返回值类型方法名(类型 变量名){}
相关应用:
//Main.java
public class Main {
public static void main(String[] args) {
DateTest s=new DateTest();
s.show("hello");
s.show(100);
}
} //DateTest.java
public class DateTest{
public <T>void show(T t){
System.out.println(t);
}
}
泛型接口
//格式
修饰符 interface 接口名<类型>{}
相关应用:
//Main.java
public class Main {
public static void main(String[] args) {
Fanxing<String> ff=new DateTest<String>();
ff.show("wangwu");
Fanxing<Integer> ii=new DateTest<Integer>();
ii.show(100);
Fanxing<Boolean> bb=new DateTest<Boolean>();
bb.show(true);
}
} //Fanxing.java
public interface Fanxing<T> {
void show(T t);
} //DateTest.java
public class DateTest<T> implements Fanxing<T>{
public void show(T t){
System.out.println(t);
}
}
类型通配符
为了表示各种泛型list的父类,可以使用类型通配符
//类型通配符
<?>
//类型通配符的上限(谨代表某一类泛型list的父类)
<?extends类型>
//类型通配符的下限,代表某一类的子类
<?super类型>
相关应用:
 //类型通配符
List<?> ll=new ArrayList<>();
List<?> ll2=new ArrayList<Number>();
List<?> ll3=new ArrayList<Integer>(); //类型通配符的上限
List<?extends Number> ll4=new ArrayList<Number>();
List<?extends Number> ll5=new ArrayList<Integer>(); //类型通配符的下限
List<?super Number> ll6=new ArrayList<>();
List<?super Number> ll7=new ArrayList<Number>();
可变参数
用作方法的形参出现,即方法参数可变
//格式
修饰符 返回值类型 方法名(数据类型...变量名){}
相关应用:
public class Main {
public static void main(String[] args) {
System.out.println(sum(10));
System.out.println(sum(10,20));
System.out.println(sum(10,20,30));
} public static int sum(int ...a){
int sum=0;
for(int i:a){
sum+=i;
}
return sum;
}
}

注意:如果需要将某个普通参数与可变参数放到一起,则需要将可变参数放到普通参数的后面。

可变参数的使用:
public static <T>list<T> asList(T...a);//返回由指定数组支持的固定大小的列表
List<String> list=Arrays.asList("hello","world","java");
//该方法构造的列表,不能通过add和remove的操作,能进行set操作。 public static <E>list<E> of(E...elements);//返回包含任意数量元素的不可变列表
List<String> ll=List.of("hello","world","java");
//该方法构造的列表,不能通过add和remove的操作,set操作也不行。 public static <E>Set<E> of(E..elements);//返回一个包含任意数量元素的不可变集合
Set<String> ll1=Set.of("hello","world","java");
//该方法构造的列表,不能通过add和remove的操作,没有set操作;不能出现重复的元素

Map集合

interface Map<K,V>  //K:键的类型   V:值的类型
//不可重复,一一对应,呈映射关系
相关应用:
//添加元素
Map<String,String> mm=new HashMap<String,String>(); mm.put("20214063","liuzijin");//添加元素
mm.put("20214056","liuyichen");//添加元素
mm.put("20214063","wangwu");//修改已有键的元素--->代替
System.out.println(mm);
Map集合基本功能:
V put(K key,V value);//添加元素
V remove(Object key);//根据键删除键值对元素
void clear();//移除所有的键值对元素
boolean containsKey(Object key);//判断集合是否包含指定的键
boolean containsValue(Object value);//判断集合是否包含指定的值
boolean isEmpty();//判断集合是否为空
int size();//集合的长度,也就是集合中键值对的个数
相关应用:
Map<String,String>  map=new HashMap<String,String>();
//添加元素
map.put("1","wo");
//移除元素
map.remove("1");//System.out.println("1");---->会输出wo
//清空元素
map.clear();
//判断集合是否包含指定的键
System.out.println(map.containsKey("1"));
//判断集合是否包含指定的值
System.out.println(map.containsValue("1"));
//判断集合是否为空
System.out.println(map.isEmpty());
//得到集合长度
System.out.println(map.size());

Java笔记第二弹的更多相关文章

  1. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  2. Java基础の第二弹 基础语法

    Java关键字 •  abstract:表明类或类中的方法是抽象的:•  boolean:基本数据类型之一,布尔类型:•  break:提前跳出一个块:•  byte:基本数据类型之一,字节类型:•  ...

  3. 菜鸡的Java笔记第二 - java 数据类型

    1.程序的本质实际上就是在于数据的处理上. JAVA中的数据类型有两类 基本数据类型:是进行内容的操作而不是内存的操作 数值型: 整型:byte(-128 ~ 127),short(-32768 ~ ...

  4. 菜鸡的Java笔记 第二十七 - java 链表基本概念

    链表基本概念        1.链表的基本形式        2.单向链表的完整实现            认识链表        链表= 可变长的对象数组,属于动态对象数组的范畴        链表 ...

  5. 菜鸡的Java笔记 第二十六 - java 内部类

    /*    innerClass        从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的        讲解它的目的第一个是为了解释概念 ...

  6. 菜鸡的Java笔记 第二十五 wrapperClass 包装类

    wrapperClass 包装类         1.包装类的特点        2.装箱与拆箱操作        3.数据转型处理            内容        Object 类可以接收 ...

  7. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  8. 菜鸡的Java笔记 第二十三 - java 抽象类的概念

    abstractClass 抽象类的概念        1.抽象类的基本定义        2.抽象类的使用原则                不会抽象类与接口,java = 没学           ...

  9. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  10. PHPCMS笔记第二弹

    熟练地使用PHPCMS可以插入模板,将静态站转变为动态站也更加方便,多加练习还是有好处的 将index.html的头和尾拆分出来,分别放在header.html和footer.html文件夹中,这三个 ...

随机推荐

  1. uniapp使用rich-text内容过长在真机无法滚动

    解决方案:在rich-text标签上加scroll-view解决 <scroll-view scroll-y="true" style="height: 745rp ...

  2. Leetcode45 跳跃,贪心算法

    leetcode  该题区别于动态规划,动态规划也能做,但是时间效率低

  3. Java-token生成

    1. 引入jar包 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt< ...

  4. 20211306 实验一《Python程序设计》实验报告

    202111306 丁文博 第一次实验报告 课程:<Python程序设计> 班级: 2113 姓名: 丁文博 学号:20211306 实验教师:王志强 实验日期:2022年3月24日 必修 ...

  5. Flask----常用路由系统及自定义路由系统

    @app.route('/user/<username>') @app.route('/post/<int:post_id>') @app.route('/post/<f ...

  6. 关于Java字符串、字符与数字之间的相互转换

    一.数字转字符串 //将整个数字转化为字符串 int i=456; //方法一 String str1=Integer.toString(i); System.out.println(str1); / ...

  7. matlab读写文件

    dsp,fpga这些产生的文件大部分都是二进制存储的,知道格式后可以直接读取. 读取后的"可懂"数据如何以"可懂"的形式保存在.dat,.txt,.csv之类文 ...

  8. Python 时间日期获取(今天,昨天或者某一段时间)

    日常使用的时间函数: 昨天,或者N天的日期 import time def time_stamp(days): hours = int(days) t = time.strftime("%Y ...

  9. Leetcode457

    A very absurd description for this problem, but people can get the idea by looking at the examples.. ...

  10. VMWare安装CentOS 7系统 & 操作系统优化

    1.准备工作 (1)VMWare 14:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.1.1-7 ...