方法名 | 说明 |
---|---|
public static int abs(int a) | 获取参数a的绝对值 |
public static double ceil(double a) [ce’l] | 向上取整 |
public static double floor(double a) | 向下取整 |
public static long round(double a) | 四舍五入取整 |
public static int max(int a,int b) | 返回两个数中较大值 |
public static int min(int a,int b) | 返回两个数中较小值 |
public static double pow(double a,double b) | 获取a的b次幂 |
public static double random() | 返回值为double类型随机数 [0.0~1.0) |
public class MathDemo {
public static void main(String[] args) {
//1、public static int abs(int a) 获取参数a的绝对值
System.out.println(Math.abs(88)); //88
System.out.println(Math.abs(-88)); //88
//2、public static double ceil(double a) 向上取整
System.out.println(Math.ceil(12.34)); //13.0
System.out.println(Math.ceil(12.56)); //13.0
//3、public static double floor(double a) 向下取整
System.out.println(Math.floor(12.34)); //12.0
System.out.println(Math.floor(12.56)); //12.0
//4、public static long round(double a) 四舍五入取整
System.out.println(Math.round(12.34)); //12
System.out.println(Math.round(12.56)); //13
//5、public static int max(int a,int b) 返回两个数中较大值
System.out.println(Math.max(66,88)); //88
//6、public static int min(int a,int b) 返回两个数中较小值
System.out.println(Math.min(66,88)); //66
//7、public static double pow(double a,double b) 获取a的b次幂
System.out.println(Math.pow(2.0,3.0)); //8.0
//8、public static double random() 返回值为double类型随机数 [0.0~1.0)
System.out.println(Math.random()); //0.36896250602163483
System.out.println(Math.random()); //0.3507783145075083
}
}
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止JVM虚拟机,非 0 是异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |
import java.text.SimpleDateFormat;
public class SystemDemo {
public static void main(String[] args) {
/*
System.out.println("开始"); //开始
//1、public static void exit(int status) 终止JVM虚拟机,非 0 是异常终止
System.exit(0);
System.out.println("结束"); //没有输出结束
*/
//2、public static long currentTimeMillis() 返回当前时间(以毫秒为单位)
System.out.println(System.currentTimeMillis()); //1625491582918
long time = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
System.out.println(sdf.format(time)); //2021年07月05日 21:26:22 星期一 下午
}
}
public Object()
1、public String toString()
package ceshi;
public class Student extends Object{
private String name;
private int age;
public Student() { }
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//自动生成重写toString()方法;按下Fn+Alt+Insert / 右键 -> generate -> toString -> OK
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package ceshi;
public class ObjectDemo {
public static void main(String[] args) {
Student s = new Student();
s.setName("yy");
s.setAge(20);
System.out.println(s); //ceshi.Student@1b6d3586
System.out.println(s.toString()); //ceshi.Student@1b6d3586
//重写后输出
/*源码
Student{name='yy', age=20}
Student{name='yy', age=20}*/
//选中方法Ctrl+B查看方法源码
/*public void println(Object x) { //1、x = s
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}*/
/*public static String valueOf(Object obj) { //2、obj = x
return (obj == null) ? "null" : obj.toString();
}*/
/*public String toString() { //3、
return getClass().getName() + "@" + Integer.toHexString(hashCode()); //所以重写前才会输出ceshi.Student@1b6d3586
}*/
}
}
2、public boolean equals(Object o)
package ceshi;
public class Student extends Object{
private String name;
private int age;
public Student() { }
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//自动生成重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true; //1、比较地址是否相同,如果相同就是同一个对象,直接返回true
//2、先判断参数是否为null;判断连个对象是否来自同一个类;一个满足就返回false
if (o == null || getClass() != o.getClass()) return false;
//向下转型
Student student = (Student) o; //student = s2;
//3、比较年龄是否相同,年龄相同往下走
if (age != student.age) return false;
//比较名字是否相同,s1的name不是null才能取调方法
return name != null ? name.equals(student.name) : student.name == null;
}
}
package ceshi;
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("yy");
s1.setAge(20);
Student s2 = new Student();
s2.setName("yy");
s2.setAge(20);
//比较两个对象内容是否相等
System.out.println(s1.equals(s2)); //重写前:false ; 重写后:true
/*public boolean equals(Object obj) {
//this---s1
//obj---s2
return (this == obj); //重写前==比较的是地址值,不是内容需要重写equals()方法
}*/
}
}
方法名 | 说明 |
---|---|
public static boolean equals(Object a, Object b) | 比较两个对象内容是否相等 |
public static boolean isNull(Object obj) | 判断变量是否为 null , 为 null 返回 true |
public class ObjectsDemo {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.equals(s2));
System.out.println(Objects.equals(s1,s2));
// true
// true
//询问s1是否为null,为null返回true
System.out.println(Objects.isNull(s1));
}
}
方法名 | 说明 |
---|---|
public static String toString(int[] a) | 返回指定数组的内容的字符串表示形式 |
public static void sort(int[] a) | 按照数字排序指定的数组 |
package ceshi;
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = {21,56,15,89,62};
System.out.println("排序前:"+arrayToString(arr)); //排序前:[21, 56, 15, 89, 62]
//冒泡排序
for(int i=0;i<arr.length-1;i++) {
for(int x=0;x< arr.length-1-i;x++) {
if(arr[x] > arr[x+1]) {
//当前一个大于后一个时,双方交换位置
int temp = arr[x];
arr[x] = arr[x+1];
arr[x+1] = temp;
}
}
}
System.out.println("排序后:"+arrayToString(arr)); //排序后:[15, 21, 56, 62, 89]
}
public static String arrayToString(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0;i<arr.length;i++) {
if(i==arr.length-1) {
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s = sb.toString();
return s;
}
}
package ceshi;
import java.util.Arrays;
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = {21,56,15,89,62};
//1、public static String toString(int[] a) 返回指定数组的内容的字符串表示形式
System.out.println("排序前:"+ Arrays.toString(arr)); //排序前:[21, 56, 15, 89, 62]
//2、public static void sort(int[] a) 按照数字排序指定的数组
Arrays.sort(arr);
System.out.println("排序后:"+Arrays.toString(arr)); //排序后:[15, 21, 56, 62, 89]
}
}
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer(重点) |
long | Long |
float | Float |
double | Double |
char | Character(特殊) |
boolean | Boolean |
方法名 | 说明 |
---|---|
public static Integer vlaueOf(int i) | 返回表示指定的int值的 Integer 实例 |
public static Integer vlaueOf(String s) | 返回一个保存指定的 Integer 对象 String |
public class IntegerDemo {
public static void main(String[] args) {
//1、public static Integer vlaueOf(int i) 返回表示指定的int值的 Integer 实例
Integer i1 = new Integer(100);
System.out.println(i1); //100
//2、public static Integer vlaueOf(String s) 返回一个保存指定的 Integer 对象 String
Integer i2 = new Integer("100");
// Integer i2 = new Integer("abc"); 报错,NumberFormatException
System.out.println(i2); //100
}
}
1、int 转换为 String 类型
public static String valueOf(int i)
:返回 int 参数的字符串表示形式。该方法是 String 类中的方法
2、String 转换为 int 类型
public static int parselnt(String s)
:将字符串解析为int类型。该方法是 Integer 类中的方法
package ceshi;
public class IntegerDemo {
public static void main(String[] args) {
//int --- String
int number = 10;
//1、public static String valueOf (int i)
String s = String.valueOf(number);
System.out.println(s); //10
//String --- int
String s1 = "100";
//2、public static int parseInt(String s)
int i = Integer.parseInt(s1);
System.out.println(i); //100
}
}
package ceshi;
import java.util.Arrays;
public class IntegerTest {
public static void main(String[] args) {
String s = "15 8 45 32 21";
String[] strArray = s.split(" "); //以空格进行分割符传入数组
/*for(int i=0;i< strArray.length;i++) {
System.out.print(strArray[i]+" "); //15 8 45 32 21
}*/
int[] arr = new int[strArray.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(strArray[i]); //String 类型转换为int类型再赋值
}
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]);
} else {
sb.append(arr[i]).append(", ");
}
}
String s1 = sb.toString();
System.out.println(s1); //8, 15, 21, 32, 45
}
}
public class PackageClass {
public static void main(String[] args) {
//基本数据类型的值或变量赋值给包装类
Integer i = Integer.valueOf(100); //手动调方法装箱
Integer ii = 100; //默认调用Integer.valueOf(100);
//拆箱
int i1 = ii; //自动拆箱,100
ii +=200; //
System.out.println(ii) //300
//开发中如果是引用类型变量最好先做不为null判断
Integer iii = null;
if(iii != null) {
iii += 300; //NullPointerException
}
}
}
java.util.Date
方法名 | 说明 |
---|---|
public Date() | 创建当前系统的此刻日期时间对象 |
public Date(long time) | 把时间毫秒值转换成日期对象 |
package ceshi;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
//1、public Date()
Date d1 = new Date();
System.out.println(d1); //Tue Jul 06 22:36:15 CST 2021
//2、public Date(long time)
long date = 60;
Date d2 = new Date(date);
System.out.println(d2); //Thu Jan 01 08:00:00 CST 1970
}
}
方法名 | 说明 |
---|---|
public long getTime() | 获取日期对象从1970年1月1日00:00:00 到现在的毫秒值 |
public void setTime(long time) | 设置时间,给的是毫秒值 |
package ceshi;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
//1、public long getTime() 获取日期对象从1970年1月1日00:00:00 到现在的毫秒值
Date d = new Date();
System.out.println(d.getTime()); //1625582796041
//2、public void setTime(long time) 设置时间,给的是毫秒值
long time = 1000*60*60;
d.setTime(time);
System.out.println(d); //Thu Jan 01 09:00:00 CST 1970
}
}
方法名 | 说明 |
---|---|
public SimpleDateFormat() | 使用默认模式和日期模式 |
public SimpleDateFormat(String pattern) | 指定时间的格式创建简单日期格式化对象 |
方法名 | 说明 |
---|---|
public String format(Date date) | 将日期格式化为日期 / 时间字符串 |
public String format(Object time) | 将时间毫秒格式化为日期 / 时间字符串 |
public Date parse(String source) [pɑːz] | 从给定的字符串开始解析文本生成日期 |
package ceshi;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
//格式化 Date》String
Date d = new Date();
//1、 SimpleDateFormat sdf = new SimpleDateFormat(); //无参构造
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E a"); //2、带参构造
String s = sdf.format(d);
System.out.println(s); //1、21-7-11 上午10:13 2、2021年07月11日 10:16:00 星期日 上午
//解析 String > date
String s1 = "2020年1月1日 8:25:12";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d1 = sdf1.parse(s1); //parse报错了,选中按下Alt+enter,默认选第一个
System.out.println(d1); //Wed Jan 01 08:25:12 CST 2020
}
}
package ceshi;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
工具类
构造方法私有
成员方法静态
*/
public class DateUtils {
private DateUtils() {
}
//时间对象格式化
public static String dateToString(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String s = sdf.format(date);
return s;
}
//给定日期字符串解析为时间对象
public static Date stringDate(String s,String formart) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(formart);
Date d = sdf.parse(s);
return d;
}
}
package ceshi;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) throws ParseException {
Date d = new Date();
String s = DateUtils.dateToString(d, "yyyy年MM月dd日 HH:mm:ss");
System.out.println(s); //2021年07月07日 20:46:08
String s1 = "2022年12月5日";
Date d1 = DateUtils.stringDate(s1, "yyyy年MM月dd日");
System.out.println(d1); //Mon Dec 05 00:00:00 CST 2022
}
}
方法名 | 说明 |
---|---|
public static Calendar getInstance() | 返回一个日历类的对象 |
public int get(int field) | 返回给定日历的值 |
public void set(int field,int value) | 修改日历的某个字段信息 |
public abstract void add(int field,int amount) | 根据日历的规则,将指定的时间量添加或减去给定的日历字段 |
public final void set(int year,int month,int date) | 设置当前日历年月日 |
package ceshi;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
//1、获取Calendar对象
Calendar c = Calendar.getInstance(); //多态形式
//2、public int get (int field) 根据给的日历字段返回值
/* int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; //从0开始所以加个1
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日"); //2021年7月7日*/
//3、public void set(int field,int value) 修改日历的某个字段信息
//c.set(Calendar.YEAR,2099);
// System.out.println(rightNow.get(Calendar.YEAR)); //2099
//4、public abstract void add(int field,int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
//需求1:三年前
/* c.add(Calendar.YEAR,-3);
int year = c.get(Calendar.YEAR);
System.out.println(year); //2018,减了三年*/
//需求2:十年后,五天前
/*c.add(Calendar.YEAR,10);
c.add(Calendar.DATE,-5);
System.out.println();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日"); //2031年7月2日*/
//5、public final void set(int year,int month,int date):设置当前日历年月日
c.set(2022,1,1);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+date+"日"); //2022年2月1日
}
}
方法名 | 说明 |
---|---|
public String() | 创建一个空字符串对象,不包含任何内容 |
public String(chas[] chs) | 根据字符数组内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方法创建字符串对象,内容就是abc |
推荐使用直接赋值的方式
案例:
public class Demo{
public static void main(String[] args){
//1.public String() 创建一个空字符串对象,不包含任何内容
String s1 = new String();
System.out.println("s1:"+s1); //s1:(无内容)
//2.public String(chas[] chs) 根据字符数组内容,来创建字符串对象
char[] chs = {'a','b','c'};
String s2 = new String(chs);
System.out.println("s2:"+s2); //s2:abc
//3.public String(byte[] bys) 根据字节数组内容,来创建字符串对象
byte[] bys = {97,98,99}; //对应计算机底层字符
String s3 = new String(bys);
System.out.println("s3:"+s3); //s3:abc
//4.String s = “abc”; 直接赋值的方法创建字符串对象,内容就是abc
String s4 = "abc";
System.out.println("s4:"+s4); //s4:abc
}
}
public class Demo{
public static void main(String[] args){
//构造方法的方式得到对象
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
//直接赋值的方法得到对象
String s3 = "abc";
String s4 = "abc";
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s3.equals(s4)); //true
}
}
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
//1
String username = "YM";
String password = "123456";
Scanner sc = new Scanner(System.in);
//4
for(int i=1;i<=3;i++) {
//2
System.out.println("请输入用户名");
String name = sc.nextLine();
System.out.println("请输入密码");
String pwd = sc.nextLine();
//3
if(name.equals(username)&& pwd.equals(password)) {
System.out.println("登录成功");
break;
}else {
if (3-i==0){
System.out.println("你的账户被锁定");
}else {
System.out.println("登陆失败,你还有"+(3-i)+"次机会");
}
}
}
}
}
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = sc.nextLine();
for(int i=0;i<line.length();i++) { //length():获取字符串长度
System.out.println(line.charAt(i));
}
}
}
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符");
String line = sc.nextLine();
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
//遍历字符串,得到每个字符
for(int i=0;i<line.length();i++) {
char ch = line.charAt(i);
//判断字符类型,统计变量+1
if(ch>='A' && ch<='Z'){
bigCount++;
}else if(ch>='a' && ch<='z'){
smallCount++;
}else if(ch>='0' && ch<='9'){
numberCount++;
}
}
System.out.println("大写字母:"+bigCount+"个");
System.out.println("小写字母:"+smallCount+"个");
System.out.println("数字:"+numberCount+"个");
}
}
public class Demo {
public static void main(String[] args) {
int[] arr = {1,2,3};
String s = arrayToString(arr);
System.out.println(s); //[1, 2, 3]
}
public static String arrayToString(int[] arr) {
String s = "";
s += "[";
for(int i=0;i<arr.length;i++) {
if(i== arr.length-1) {
s += arr[i];
}else {
s += arr[i]+", ";
}
}
s += "]";
return s;
}
}
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = sc.nextLine(); //abc
String s = myReverse(line);
System.out.println(s); //cba
}
public static String myReverse(String s) {
String ss = "";
for(int i=s.length()-1;i>=0;i--) {
ss += s.charAt(i);
}
return ss;
}
}
public class Demo {
/*
截取字符串:
String substring(int beginIndex):
从传入的索引位置处向后截取,一直截取到末尾,得到新字符串并返回
String substring(int beginIndex, int endIndex):
从beginIndex索引位置开始截取,截取到endIndex索引位置,得到新字符串并返回(包括头,不包括尾)
*/
public static void main(String[] args){
String s = "itheima";
String ss = s.substring(2);
System.out.println(ss); //heima
String sss = s.substring(0,2);
System.out.println(sss); //it
}
}
//String replace(CharSequence target,Char Sequense replacement)
// 第一个参数为target(被替换的旧值)内容
// 第二个参数为replacement(替换的新值)进行替换
// 返回新的字符串
import java.util.Scanner
public class Demo{
public static void main(String[] args){
// 1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
// 2.进行敏感提替换
String result = s.replace("TMD","***");
// 3.输出结果
System.out.println(result);
}
}
public class Demo {
public static void main(String[] args) {
//创建空白可改变字符串对象
StringBuilder sb = new StringBuilder();
System.out.println("sb:"+sb); //sb:
System.out.println("sb.length():"+sb.length()); //sb.length():0
//根据字符串内容创建对象
StringBuilder sb2 = new StringBuilder("hello");
System.out.println("sb2:"+sb2); //sb2:hello
System.out.println("sb2.length():"+sb2.length()); //5
}
}
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public int length() | 返回长度(字符出现的个数) |
public class Demo {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//1.public StringBuilder append(任意类型) 添加数据,并返回对象本身
// StringBuilder sb2 = sb.append("java");
// System.out.println("sb:"+sb); //sb:java,因为返回的是对象本身所以sb赋值了java
// System.out.println("sb2:"+sb2); //sb2:java
// System.out.println(sb==sb2); //true
// sb.append("java");
// sb.append("word");
// sb.append(100);
// System.out.println("sb:"+sb); //sb:javaword100
//链式编程
sb.append("java").append("word").append(100);
System.out.println("sb:"+sb); //sb:javaword100
//2.public StringBuilder reverse() 返回相反的字符序列
sb.reverse();
System.out.println("sb:"+sb); //sb:001drowavaj
}
}
public String toString() | 通过toString()可以把StringBuilder 转换为 String |
---|
public StringBuilder(String s) | 通过构造方法就可以把String 转换为 StringBuilder |
---|
public class Demo {
public static void main(String[] args) {
//1.StringBulider 转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello");
//public String toString() 通过toString()可以把StringBuilder 转换为 String
String s = sb.toString();
System.out.println("s:"+s); //s:hello
//2.String 转换为 StringBulider
String s1 = "hello";
//public StringBuilder(String s) 通过构造方法就可以把String 转换为 StringBuilder
StringBuilder sb1 = new StringBuilder(s1);
System.out.println("sb1:"+sb1); //sb1:hello
}
}
public class Demo {
public static void main(String[] args) {
//1
int[] arr = {1,2,3};
String s = arrayToString(arr);
System.out.println(s); //[1, 2, 3]
}
//2,定义方法,拼接字符串
public static String arrayToString(int[] arr) {
//3
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0;i< arr.length;i++) {
if(i==arr.length-1){
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s= sb.toString();
return s;
}
}
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = sc.nextLine(); //abc
String s = myReverse(line);
System.out.println(s); //cba
}
public static String myReverse(String s) {
//在方法使用StringBuilder实现字符串反转,并把结果转换为String返回
//String - StringBuilder - reverse() - String
// StringBuilder sb = new StringBuilder(s);
// sb.reverse();
//
// String ss = sb.toString();
// return ss;
//链式编程
return new StringBuilder(s).reverse().toString();
}
}
ArrayList、ArrayList
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> array = new ArrayList<>();
System.out.println(array); //[]
//添加到集合末尾
array.add("hello");
array.add("word");
array.add("java");
System.out.println(array); //[hello, word, java]
//指定位置,添加元素
array.add(1,"javase");
System.out.println(array); //[hello, javase, word, java]
array.add(4,"javaee");
System.out.println(array); //[hello, javase, word, java, javaee]
array.add(6,"javaweb");
System.out.println(array); //IndexOutOfBoundsException,不能中间跳一个位置
}
}
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中元素的个数 |
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> array = new ArrayList<>();
System.out.println(array); //[]
//添加到集合末尾
array.add("hello");
array.add("word");
array.add("java");
System.out.println(array); //[hello, word, java]
//1,public boolean remove(Object o) 删除指定的元素,返回删除是否成功
// System.out.println(array.remove("hello")); //true; 集合变为[word, java]
// System.out.println(array.remove("javase")); //false; 集合变为[hello, word, java]
//2,public E remove(int index) 删除指定索引处的元素,返回被删除的元素
// System.out.println(array.remove(1)); //word,集合变为[hello, java]
//3,public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
// System.out.println(array.set(1,"javase")); //word;集合变为[hello, javase, java]
//4,public E get(int index) 返回指定索引处的元素
// System.out.println(array.get(0)); //hello
// System.out.println(array.get(1)); //word
// System.out.println(array.get(2)); //java
//5,public int size() 返回集合中元素的个数
System.out.println(array.size()); //3
}
}
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> array = new ArrayList<>();
//加元素
array.add("java");
array.add("天下");
array.add("第一");
for(int i=0;i<array.size();i++) {
String s = array.get(i);
System.out.print(s+" "); //java 天下 第一
}
}
}
package ceshi;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package ceshi;
import java.util.ArrayList;
public class ArrayListStudent {
public static void main(String[] args) {
//定义集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建学生对象
Student stu1 = new Student("小白",20);
Student stu2 = new Student("小明",21);
Student stu3 = new Student("小黑",22);
//添加学生对象到集合中
array.add(stu1);
array.add(stu2);
array.add(stu3);
//遍历集合
for(int i=0;i<array.size();i++) {
Student s = array.get(i);
System.out.println(s.getName()+","+s.getAge()); //小白,20
//小明,21
//小黑,22
}
}
}
package ceshi;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListStudent {
public static void main(String[] args) {
ArrayList<Student> array = new ArrayList<Student>();
for(int i=1;i<4;i++) {
addStudent(array); //调三次方法
}
//遍历集合
for(int i=0;i<array.size();i++) {
Student s = array.get(i);
System.out.println(s.getName()+","+s.getAge());
}
}
public static void addStudent(ArrayList<Student> array) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个名字");
String name = sc.nextLine();
System.out.println("请输入一个年龄");
String age = sc.nextLine();
//创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
Student stu = new Student();
stu.setName(name);
stu.setAge(age);
//往集合里加学生对象
array.add(stu);
}
}
package ceshi;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
//创建Collection集合对象
Collection<String> c = new ArrayList<String>();
//添加元素
c.add("hello");
c.add("world");
c.add("java");
System.out.println(c); //[hello, world, java]
}
}
方法名 | 说明 |
---|---|
public boolean add(E e) | 把给定的元素添加到当前集合中 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public void clear() | 清空集合中所有的元素 |
public boolean contains(Object obj) [kənˈteɪnz] 包括 | 判断当前集合中是否存在指定的对象 |
public boolean isEmpty() [ˈenpti] | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数 |
public Object[] toArray( ) | 把集合中的元素,储存到数组中 |
package ceshi;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
//创建Collection集合对象
Collection<String> c = new ArrayList<String>();
//1、public boolean add(E e) 把给定的元素添加到当前集合中
c.add("hello");
c.add("hello");
System.out.println(c); //[hello, hello] ;ArrayList可以存储重复元素
//2、public boolean remove(E e) 把给定的对象在当前集合中删除
/*System.out.println(c.remove("hello")); //true
System.out.println(c.remove("java")); //false
System.out.println(c); //[hello]*/
//3、public void clear() 清空集合中所有的元素
/*c.clear();
System.out.println(c); //[]*/
//4、public boolean contains(Object obj) 判断当前集合中是否存在指定的对象
/*System.out.println(c.contains("java")); //false
System.out.println(c.contains("hello")); //true*/
//5、public boolean isEmpty() 判断当前集合是否为空
// System.out.println(c.isEmpty()); //false
//6、public int size() 返回集合中元素的个数
// System.out.println(c.size()); //2
//7、public Object[] toArray( 把集合中的元素,储存到数组中
Object[] arr = c.toArray();
for(int i= 0;i< arr.length;i++) {
System.out.print(arr[i]+","); //hello,hello
}
}
}
Iterator iterator()
:返回此集合中元素的迭代器,通过集合的iterator()
方法得到方法名 | 说明 |
---|---|
E next() | 获取迭代中的下一个元素 |
boolean hasNext() | 如果迭代具有更多元素,则返回true |
package ceshi;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("java");
c.add("天下");
c.add("无敌");
//Iterator iterator():返回此集合中元素的迭代器,通过集合的iterator0方法得到
Iterator<String> it = c.iterator(); //c.iterator();按下Ctrl+alt+v
/*public Iterator iterator() {
return new ArrayList.Itr(); //返回的是实现类的对象
}
private class Itr implements Iterator {...}
*/
//E next()
/*System.out.println(it.next()); //java
System.out.println(it.next());
System.out.println(it.next());
System.out.println(it.next()); //NoSuchElementException:表示请求的元素不存在*/
//boolean hasNext() 如果迭代具有更多元素,则返回true
/*if(it.hasNext()) {
System.out.println(it.next()); //java
}
if(it.hasNext()) {
System.out.println(it.next()); //天下
}
if(it.hasNext()) {
System.out.println(it.next()); //无敌
}
if(it.hasNext()) {
System.out.println(it.next()); //无输出
} */
//while循环改良
while(it.hasNext()) {
String s = it.next();
System.out.println(s); //java
//天下
//无敌
}
}
}
package ceshi;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
//2、创建Collection集合对象
Collection<Student> c = new ArrayList<Student>();
//3、创建学生对象
Student s1 = new Student("y1", 10);
Student s2 = new Student("y2", 20);
Student s3 = new Student("y3", 30);
//4、把学生添加到集合
c.add(s1);
c.add(s2);
c.add(s3);
//5、遍历集合
Iterator<Student> it = c.iterator(); //必须集合添加完毕后创建迭代器对象
while (it.hasNext()) {
Student s = it.next();
System.out.println(s.getName() + "," + s.getAge());
/*
y1,10
y2,20
y3,30
*/
}
}
}
java.util.Collections
方法名 | 说明 |
---|---|
public static |
将指定的列表按升序排序 |
public static void reverse(List> list) | 反转指定列表中元素顺序 |
public static void shuffle(List> list) | 使用默认的随机源随机排序指定的列表 |
package ceshi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MapDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(30);
list.add(20);
list.add(50);
list.add(10);
list.add(40);
System.out.println(list); //[30, 20, 50, 10, 40]
//1,public static > void sort(List list) 将指定的列表按升序排序
/*Collections.sort(list);
System.out.println(list); //[10, 20, 30, 40, 50]*/
//2,public static void reverse(List> list) 反转指定列表中元素顺序
/*Collections.reverse(list);
System.out.println(list); //[40, 10, 50, 20, 30]*/
//3,public static void shuffle(List> list) 使用默认的随机源随机排序指定的列表
Collections.shuffle(list);
System.out.println(list);
//第一次运行[10, 40, 30, 50, 20]
//第二次运行[10, 30, 20, 50, 40]
}
}
List集合概述
1、有序集合(也称为序列),用户可以精确控制列表中每个元索的插入位置。用户可以通过整数索引访问元素,并获取列表中的元素
2、与Set集合不同,List集合允许重复的元素
List集合特点
1、有序: 存储和取出的元素顺序一致
2、可重复: 存储的元素可以重复
package ceshi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
//创建集合对象
List<String> list = new ArrayList<>();
//添加元素
list.add("java");
list.add("天下");
list.add("无敌");
list.add("java");
System.out.println(list); //[java, 天下, 无敌, java]
//迭代器遍历
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String s = it.next();
System.out.println(s);
/*java
天下
无敌
java*/
}
}
}
方法名 | 说明 |
---|---|
public void add(int index,E element) | 该集合中的指定位置上插入元素 |
public E remove(int index) | 删除列表中指定位置的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引的元素,返回被修改的元素 |
public E get(int index) | 返回集合中指定位置的元素 |
package ceshi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
//创建集合对象
List<String> list = new ArrayList<>();
//添加元素
list.add("java");
list.add("天下");
list.add("无敌");
list.add("java");
System.out.println(list); //[java, 天下, 无敌, java]
//1、public void add(int index,E element) 该集合中的指定位置上插入元素
list.add(1,"javase");
System.out.println(list); //[java, javase, 天下, 无敌, java]
//2、public E remove(int index) 删除列表中指定位置的元素,返回被删除的元素
System.out.println(list.remove(1)); //javase
System.out.println(list); //[java, 天下, 无敌, java]
//3、public E set(int index,E element) 修改指定索引的元素,返回被修改的元素
System.out.println(list.set(0,"java1")); //java
System.out.println(list); //[java1, 天下, 无敌, java]
//4、public E get(int index) 返回集合中指定位置的元素
System.out.println(list.get(2)); //无敌
//for循环遍历
for(int i=0;i< list.size();i++) {
//5,public E get(int index) 返回集合中指定位置的元素
String s = list.get(i);
System.out.println(s);
/*java1
天下
无敌
java*/
}
}
}
package ceshi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
//2、创建集合对象
List<Student> list = new ArrayList<Student>();
//3、创建学生对象
Student s1 = new Student("y1",10);
Student s2 = new Student("y2",20);
Student s3 = new Student("y3",30);
//4、学生对象添加到集合
list.add(s1);
list.add(s2);
list.add(s3);
//5、遍历集合:迭代器方法
Iterator<Student> it = list.iterator();
while(it.hasNext()) {
Student s = it.next();
System.out.println(s.getName()+","+s.getAge());
/*y1,10
y2,20
y3,30*/
}
//5、遍历集合:for循环
for(int i=0;i<list.size();i++) {
Student ss = list.get(i);
System.out.println(ss.getName()+","+ss.getAge());
/*y1,10
y2,20
y3,30*/
}
}
}
listterator()
方法得到,所以说它是List集合特有的迭代器方法名 | 说明 |
---|---|
list.listIterator() | 得到 listIterator 迭代器 |
E next() | 返回迭代中的下一个元素 |
boolean hasNext() | 如果迭代具有更多元素,则返回true |
E previous() [ˈpriːviəs] | 返回列表中的上一个元素 |
boolean hasPrevious() | 如果此列表迭代器在相反方向遍历列表时具有更多元索,则返回true |
void add(E e) | 将指定的元索插入列表 |
package ceshi;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("java");
list.add("python");
list.add("scala");
//通过list集合的listIterator() 方法得到迭代器
/*ListIterator lit = list.listIterator();
while(lit.hasNext()) {
String s = lit.next();
System.out.println(s);
*/ /*java
python
scala*//*
}
System.out.println("---------");
//逆向遍历
*//*E previous0 返回列表中的上一个元素
boolean hasPrevious() 如果此列表迭代器在相反方向遍历列表时具有更多元索,则返回true*//*
while(lit.hasPrevious()) {
String s = lit.previous();
System.out.println(s);
*//*scala
python
java*//*
}*/
//获取列表迭代器
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()) {
String s = lit.next();
if(s.equals("java")) {
lit.add("world");
}
}
System.out.println(list); //[java, world, python, scala]
}
}
增强for:简化数组和Collection集合的遍历
for(元素类型 变量名: 数组名或collection集合){
}
//范例
int[] arr = {1,2,3,4,5};
for(int i : arr) {
System.out.println(i);
}
package ceshi;
import java.util.ArrayList;
import java.util.List;
public class ForDemo {
public static void main(String[] args) {
//int类型数组
int[] arr = {1,2,3,4,5};
for(int i : arr) {
System.out.println(i);
/*
1
2
3
4
5*/
}
//String类型数组
String[] strArray = {"java","python","scala"};
for(String s : strArray) {
System.out.println(s);
/*java
python
scala*/
}
//集合
List<String> list = new ArrayList<>();
list.add("y1");
list.add("y2");
list.add("y3");
for(String lt:list) {
System.out.println(lt);
/*y1
y2
y3*/
}
//判断:内部原理是一个Iterator迭代器
for(String s:list) {
if(s.equals("y1")) {
list.add("y4"); //ConcurrentModificationException:并发修改异常
}
}
}
}
package ceshi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student s1 = new Student("y1",10);
Student s2 = new Student("y2",20);
Student s3 = new Student("y3",30);
list.add(s1);
list.add(s2);
list.add(s3);
//迭代器方式
Iterator<Student> it = list.iterator();
while(it.hasNext()) {
Student s = it.next();
System.out.println(s.getName()+","+s.getAge());
}
System.out.println("----------");
//for带索引方式
for(int i =0;i<list.size();i++) {
Student s = list.get(i);
System.out.println(s.getName()+","+s.getAge());
}
System.out.println("----------");
//增强for
for(Student s: list) {
System.out.println(s.getName()+","+s.getAge());
}
}
}
ArrayList
:底层数据结构数组实现,查询快,增删慢LinkedList
:底层数据结构链表实现,查询慢,增删快package ceshi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
//1、创建ArrayList集合对象
ArrayList<String> arraylist = new ArrayList<>();
arraylist.add("java");
arraylist.add("python");
arraylist.add("scala");
//增强for
for(String s: arraylist) {
System.out.println(s);
}
System.out.println("-------");
//普通for循环
for(int i=0;i< arraylist.size();i++) {
String s = arraylist.get(i);
System.out.println(s);
}
System.out.println("-------");
//迭代器的方式
Iterator<String> it = arraylist.iterator();
while(it.hasNext()) {
String s = it.next();
System.out.println(s);
}
System.out.println("-------");
//2、创建LinkedList集合对象
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("a");
linkedList.add("b");
linkedList.add("c");
//增强for
for(String s:linkedList) {
System.out.println(s);
}
System.out.println("-------");
//普通for
for(int i=0;i< linkedList.size();i++) {
String s = linkedList.get(i);
System.out.println(s);
}
System.out.println("-------");
//迭代器
Iterator<String> it1 = linkedList.iterator();
while(it1.hasNext()) {
String s = it1.next();
System.out.println(s);
}
}
}
方法名 | 说明 |
---|---|
public void addFirst(E,e) | 在该列表开头插入指定的元素 |
public void addLast(E,e) | 将指定的元索追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元索 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst | 从此列表中删除并返回第一个元素 |
public E removeLast | 从此列表中删除并返回最后一个元素 |
package ceshi;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
//创建集合对象
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("java");
linkedList.add("python");
linkedList.add("scala");
System.out.println(linkedList); //[java, python, scala]
//1、public void addFirst(E,e) 在该列表开头插入指定的元素
linkedList.addFirst("1");
System.out.println(linkedList); //[1, java, python, scala]
//2、public void addLast(E,e) 将指定的元索追加到此列表的末尾
linkedList.addLast("5");
System.out.println(linkedList); //[1, java, python, scala, 5]
//3、public E getFirst() 返回此列表中的第一个元索
System.out.println(linkedList.getFirst()); //1
//4、public E getLast() 返回此列表中的最后一个元素
System.out.println(linkedList.getLast()); //5
//5、public E removeFirst 从此列表中删除并返回第一个元素
System.out.println(linkedList.removeFirst()); //1
System.out.println(linkedList);//[java, python, scala, 5]
//6、public E removeLast 从此列表中删除并返回最后一个元素
System.out.println(linkedList.removeLast()); //5
System.out.println(linkedList); //[java, python, scala]
}
}
HashSet
:添加的元素是无序,不重复,无索引的LinkedHashSet
: 添加的元素是有序,不重复,无索引的TreeSet
: 不重复,无索引,按照大小默认升序排列package ceshi;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
//创建Set集合对象
Set<String> set = new HashSet<>();
//添加元素
set.add("java");
set.add("python");
set.add("scala");
//不包含重复元素
set.add("java");
//两种遍历方式
for(String s:set) {
System.out.println(s);
/*python
java
scala*/
}
System.out.println("--------");
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String s = it.next();
System.out.println(s);
/*python
java
scala*/
}
}
}
public int hashCode()
:返回对象的哈希码值package ceshi;
public class HashDemo {
public static void main(String[] args) {
//创建学生对象
Student s1 = new Student("y1",10);
//同一个对象多次调用hashCode()方法哈希值相同
System.out.println(s1.hashCode()); //460141958
System.out.println(s1.hashCode()); //460141958
System.out.println("---------");
//默认情况下,不同对象哈希值不同;重写hashCode()方法就可以使哈希值相同
Student s2 = new Student("y2",20);
System.out.println(s2.hashCode()); //1163157884
System.out.println("---------");
System.out.println("java".hashCode()); //3254818
System.out.println("python".hashCode()); //-973197092
System.out.println("scala".hashCode()); //109250886
System.out.println("---------");
System.out.println("无".hashCode()); //26080
System.out.println("敌".hashCode()); //25932
}
}
package ceshi;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
hs.add("java");
hs.add("python");
hs.add("scala");
hs.add("scala");
for(String s:hs) {
System.out.println(s);
/*python
java
scala*/
}
}
}
HashSet<String> hs = new HashSet<>();
hs.add("java");
hs.add("python");
hs.add("scala");
hs.add("scala");
for(String s:hs) {
System.out.println(s);
/*python
java
scala*/
}
-----------------------------------
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true); //上个方法的返回的值是hash(key)的值
}
//hash值和元素的hashCode()方法
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
//如果哈希表未初始化就对其初始化
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
//根据对象的哈希值计算对象的存储位置,
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null); //如果该位置没有元素,就存储新元素
//有元素就走else
else {
Node<K,V> e; K k;
//存入的元素和以前的元素比哈希值
if (p.hash == hash &&
//二、如果哈希值相同,调用对象的equals()比较内容是否相同
//1、如果内容不同equals()返回false,就走一把元素添加到集合
//2、如果内容相同返回true,说明元素重复,走e = p;不存储
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
//一、如果哈希值不同,就走else存储元素到集合
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null); //新元素添加到集合
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
package ceshi;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写快捷键:Fn+Alt+insert,选择equals() and hashCode()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
package ceshi;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("y1",10);
Student s2 = new Student("y2",20);
Student s3 = new Student("y3",30);
Student s4 = new Student("y3",30);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for(Student s: hs) {
System.out.println(s.getName()+","+s.getAge());
/*y3,30
y2,20
y1,10
y3,30;s4内容和s3重复并存入了,需要重写hashCode()和equals()
*/
//重写后
/*
y1,10
y3,30
y2,20*/
}
}
}
package ceshi;
import java.util.LinkedHashSet;
public class LinkedHashSetDemo {
public static void main(String[] args) {
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("java");
linkedHashSet.add("python");
linkedHashSet.add("scala");
linkedHashSet.add("scala");
for(String s:linkedHashSet) {
System.out.println(s);
/*java
python
scala*/
}
}
}
TreeSet集合特点
TreeSet()
:根据其元素的自然排序进行排序 TreeSet(Comparator comparator)
:根据指定的比较器进行排序package ceshi;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
//jdk5以后添加元素自动装箱int》integer
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
for(Integer i:ts) {
System.out.println(i);
/*
10
20
30
40
50*/
}
}
}
存储学生对象并遍历,创建TreeSet集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论:
Student类
package ceshi;
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 String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
// return 0; //返回0说明元素是重复的,只能存一个元素
// return 1; //整数是升序排序
// return -1; //负数是倒叙排序
//按照年龄排序
int num = this.age-s.age; //this是s2,s是s1
//年龄相同时,按照名字字母排序
int num2 = num==0 ? this.name.compareTo(s.name):num;
return num2;
}
}
package ceshi;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<>();
Student s1 = new Student("y1",10);
Student s2 = new Student("y3",30);
Student s3 = new Student("y2",20);
Student s4 = new Student("y4",40);
Student s5 = new Student("a4",40); //判断按字母排序
Student s6 = new Student("y4",40); //判断会存储重复值吗
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
for(Student s:ts) {
System.out.println(s.getName()+","+s.getAge());
/*y1,10
y2,20
y3,30
a4,40
y4,40*/
}
}
}
package ceshi;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package ceshi;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<>(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("y2",20);
Student s2 = new Student("y1",10);
Student s3 = new Student("y3",30);
Student s4 = new Student("y4",40);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
for(Student s:ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}
package ceshi;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo {
public static void main(String[] args) {
// Set set = new HashSet<>();
Set<Integer> set = new TreeSet<>();
Random r = new Random();
//判断集合是否《10
while(set.size()<10) {
int number = r.nextInt(20)+1;
set.add(number); //把随机数添加到集合
}
for (Integer i:set) {
System.out.print(i+" "); //1(哈希set集合):16 17 2 20 8 9 10 11 14 15
//2(TreeSet集合):1 3 4 5 6 7 8 10 16 19
}
}
}
HashMap
: 元素按照键是无序,不重复,无索引,值不做要求 LinkedHashMap
: 元素按照键是有序,不重复,无索引,值不做要求package ceshi;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("y1","10");
map.put("y2","20");
map.put("y2","30"); //键和前面相同时,会替换前面的值
map.put("y3","30");
System.out.println(map); //{y1=10, y3=30, y2=30}
}
}
方法名 | 说明 |
---|---|
public V put(K key, V value) | 添加元素 |
public V remove(Object key) | 根据键删除键值对元素 |
public void clear() | 移除所有键值对元素 |
public boolean containKey(Object key) [kənˈteɪn] | 判断集合是否包含指定的键 |
public boolean containValue(Object value) | 判断集合是否包含指定的值 |
public boolean isEmpty() | 判断集合是否为空 |
public int size() | 集合的长度,也就是集合中键值对个数 |
package ceshi;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
//1,public V put(K key, V value) 添加元素
map.put("y1","10");
map.put("y2","20");
map.put("y3","30");
System.out.println(map); //{y1=10, y2=20, y3=30}
//2,public V remove(Object key) 根据键删除键值对元素
/*map.remove("y2");
System.out.println(map); //{y1=10, y3=30}
*/
//3,public void clear() 移除所有键值对元素
/* map.clear();
System.out.println(map); //{}
*/
//4,public boolean containKey(Object key) [kənˈteɪn] 判断集合是否包含指定的键
/*System.out.println(map.containsKey("y2")); //ture
System.out.println(map.containsKey("y4")); //false*/
//5,public boolean containValue(Object value) 判断集合是否包含指定的值
// System.out.println(map.containsValue("10")); //true
//6,public boolean isEmpty() 判断集合是否为空
// System.out.println(map.isEmpty()); //false
//7,public int size() 集合的长度,也就是集合中键值对个数
System.out.println(map.size()); //3
}
}
方法名 | 说明 |
---|---|
public V get(Object key) | 根据键获取值 |
public Set |
获取所有键的集合,存储到Set集合中 |
public Collection |
获取所有值的集合,存储到Collection集合中 |
public Set |
获取所有键值对对象的集合(Set集合) |
package ceshi;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
//public V put(K key, V value) 添加元素
map.put("y1","10");
map.put("y2","20");
map.put("y3","30");
System.out.println(map); //{y1=10, y2=20, y3=30}
//1,public V get(Object key) 根据键获取值
System.out.println(map.get("y1")); //10
System.out.println(map.get("y4")); //null
//2,public Set keySet() 获取所有键的集合,存储到Set集合中
Set<String> key = map.keySet();
for(String s:key) {
System.out.println(s);
/*y1
y2
y3*/
}
//3,public Collection values() 获取所有值的集合,存储到Collection集合中
Collection<String> vlaues = map.values();
for(String s:vlaues) {
System.out.println(s);
/*10
20
30*/
}
//4,public Set> entrySet() 获取所有键值对对象的集合(Set集合)
Set<Map.Entry<String, String>> entries = map.entrySet();
for(Map.Entry<String, String> s:entries) {
System.out.println(s);
/*
y1=10
y2=20
y3=30*/
}
}
}
keySet()
方法实现get(Object key)
方法实现package ceshi;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
//public V put(K key, V value) 添加元素
map.put("y1", "10");
map.put("y2", "20");
map.put("y3", "30");
System.out.println(map); //{y1=10, y2=20, y3=30}
//1、获取所有键的集合:用keySet()方法实现
Set<String> keySet = map.keySet();
//2、遍历键的集合,获取到每一个键:用增强for遍历实现
for (String key : keySet) {
//3、根据键去找值:在增强for中,用get(Object key)方法实现
String value = map.get(key);
System.out.println(key + "=" + value);
/*
y1=10
y2=20
y3=30*/
}
}
}
Set> entrySet()
Map.Entry
geKey()
得到键;用getValue()
得到值package ceshi;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
//public V put(K key, V value) 添加元素
map.put("y1", "10");
map.put("y2", "20");
map.put("y3", "30");
System.out.println(map); //{y1=10, y2=20, y3=30}
//1、获取所有键值对对象的集合:Set> entrySet()
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//2、遍历键值对对象的集合,得到每一个键值对对象:用增强for实现,得到每一个Map.Entry
for(Map.Entry<String, String> me:entrySet) {
//3、根据键值对对象获取键和值:在增强for中,用geKey()得到键;用getValue()得到值
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"="+value);
/*
y1=10
y2=20
y3=30*/
}
}
}
package ceshi;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
//public V put(K key, V value) 添加元素
map.put("y1", "10");
map.put("y2", "20");
map.put("y3", "30");
System.out.println(map); //{y1=10, y2=20, y3=30}
map.forEach((k , v) -> {
System.out.println(k+"="+v);
/*
y1=10
y2=20
y3=30*/
});
}
}
hashCode()
和equals()
方法public class LinkedHashMapDemo {
public static void main(String[] args) {
Map<String , Integer> map = new LinkedHashMap<>();
map.put("y1",10);
map.put("y2",20);
map.put("y3",30);
map.put("y3",100); //键不变,只是替换其值
System.out.println(map);// {y1=10, y2=20, y3=100}
}
}
package ceshi;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
//创建HashMap集合对象
HashMap<String,Student> hm =new HashMap<>();
Student s1 = new Student("y1",10);
Student s2 = new Student("y2",20);
Student s3 = new Student("y3",30);
hm.put("itheima1",s1);
hm.put("itheima2",s2);
hm.put("itheima3",s3);
//键找值
Set<String> keySet = hm.keySet();
for(String key:keySet) {
Student value = hm.get(key);
System.out.println(key+","+value.getName()+","+value.getAge());
/*itheima3,y3,30
itheima1,y1,10
itheima2,y2,20*/
}
System.out.println("---------");
//键值对
Set<Map.Entry<String, Student>> entrySet= hm.entrySet();
for(Map.Entry<String, Student> me:entrySet) {
String key = me.getKey();
Student value = me.getValue();
System.out.println(key+","+value.getName()+","+value.getAge());
/*itheima3,y3,30
itheima1,y1,10
itheima2,y2,20*/
}
}
}
package ceshi;
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
//1,创建ArrayList集合对象
ArrayList<HashMap<String,String>> array = new ArrayList<>();
//2,创建HashMap集合,并添加键值对元素
HashMap<String,String> hm1 = new HashMap<>();
hm1.put("y1","10");
HashMap<String,String> hm2 = new HashMap<>();
hm1.put("y2","20");
HashMap<String,String> hm3 = new HashMap<>();
hm1.put("y3","30");
//3,把HashMap作为元素添加到Arraylist
array.add(hm1);
array.add(hm2);
array.add(hm3);
//遍历Arraylist
for(HashMap<String,String> hm:array) {
Set<String> keySet = hm.keySet();
for(String key:keySet) {
String value = hm.get(key);
System.out.println(key+","+value);
/*y1,10
y2,20
y3,30*/
}
}
}
}
泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型
这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型定义格式:
JDK 1.7开始之后,泛型后面的申明可以省略不写
泛型和集合都只能支持引用数据类型,不支持基本数据类型
ArrayList<String> lists = new ArrayList<String>();
ArrayList<String> lists = new ArrayList<>();
// JDK 1.7开始之后,泛型后面的申明可以省略不写!!
Collection<String> c = new ArrayList<>();
c.add("java");
// c.add(100); //报错
// c.add(false); //报错
修饰符 class 类名<泛型变量>{}
//范例
public class Generic<T> {}
泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型
泛型类
package ceshi;
public class Generic<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
package ceshi;
public class GenericDemo {
public static void main(String[] args) {
Generic<String> g1 = new Generic<>();
g1.setT("y1");
Generic<Integer> g2 = new Generic<>();
g2.setT(20);
System.out.println(g1.getT()+","+g2.getT()); //y1,20
Generic<Boolean> g3 = new Generic<>();
g3.setT(true);
System.out.println(g3.getT()); //true
}
}
修饰符 <类型> 返回值类型 方法名(类型 变量名){}
//范例
public <T> void show(T t) {}
package ceshi;
/*public class Generic {
public void show(String s) {
System.out.println(s);
}
public void show(Integer i) {
System.out.println(i);
}
public void show(Boolean b) {
System.out.println(b);
}
}*/
//泛型类改进
/*
public class Generic {
public void show(T t) {
System.out.println(t);
}
}
*/
//泛型方法
public class Generic {
public <T> void show (T t) {
System.out.println(t);
}
}
package ceshi;
public class GenericDemo {
public static void main(String[] args) {
/*Generic g1 = new Generic();
g1.show("y1");
g1.show(30);
g1.show(true);*/
//泛型类
/*Generic g1 = new Generic<>();
g1.show("y1");
Generic g2 = new Generic<>();
g2.show(10);*/
//泛型方法
Generic g = new Generic();
g.show("y1");
g.show(10);
g.show(true);
g.show(13.14);
/*y1
10
true
13.14*/
}
}
修饰符 interface 接口名称<类型> {}
//范例
public interface Generic<T> {}
package ceshi;
public interface Generic<T> {
void show(T t);
}
package ceshi;
public class GenericImpl<T> implements Generic<T>{
@Override
public void show(T t) {
System.out.println(t);
}
}
package ceshi;
public class GenericDemo {
public static void main(String[] args) {
GenericImpl g1 = new GenericImpl();
g1.show("y1");
g1.show(10);
}
}
为了表示各种泛型List的父类,可以使用类型通配符
如果说我们不希望List>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限
extends类型>
除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限
package ceshi;
import java.util.ArrayList;
import java.util.List;
public class GenericDemo {
public static void main(String[] args) {
//类型通配符: >
List<?> list1 = new ArrayList<Number>();
List<?> list2 = new ArrayList<String>();
List<?> list3 = new ArrayList<Integer>();
//类型通配符上限: extends类型>
// List extends Number> list4 = new ArrayList
List<? extends Number> list5 = new ArrayList<Number>();
List<? extends Number> list6 = new ArrayList<Integer>();
//类型通配符 下限::
List<? super Number> list7 = new ArrayList<Object>();
List<? super Number> list8 = new ArrayList<Number>();
// List super Number> list9 = new ArrayList(); 报错
}
}
public static int sum(int...a) {}
public static int sum(int b,int...a) {}
package ceshi;
import java.util.ArrayList;
import java.util.List;
public class GenericDemo {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum(10,20,30));
System.out.println(sum(10,20,30,40));
/*
30
60
100*/
}
public static int sum(int...a) { //a为数组
int sum =0;
for(int i:a) {
sum +=i;
}
return sum;
}
//一个方法有多个参数,可变参数放最后
/*public static int sum(int b,int...a) {
return 0;
}*/
}
1、Arrays工具类中有一个静态方法:
public static List asList(T... a)
:返回由指定数组支持的固定大小的列表2、List接口中有一个静态方法:(JDK9以上)
public static List of(E... elements)
:返回包含任意数元素的不可变列表3、Set接口中有一个静态方法: (JDK9以上)
- public static
:返回一个包含任意数量元素的不可变集合
package ceshi;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class GenericDemo {
public static void main(String[] args) {
//1、public static List asList(T... a):返回由指定数组支持的固定大小的列表
/* List list = Arrays.asList("java", "python", "scala");
System.out.println(list); //[java, python, scala]
// list.add("javase"); //UnsupportedOperationException;不支持请求操作
// list.remove("java"); //UnsupportedOperationException;不支持请求操作
list.set(0,"javase");
System.out.println(list); //[javase, python, scala]*/
//2、public static List of(E... elements):返回包含任意数元素的不可变列表
List<String> list = List.of("java","python","scala","java")
System.out.println(list); //[javase, python, scala,java]
//list.add("javaee"); //UnsupportedOperationException
//list.remove("java"); //UnsupportedOperationException
//list.set(0,"javaee") //UnsupportedOperationException
//3、public static Set of(E.... elements):返回-一个包含任意数量元素的不可变集合
//Set set = Arrays.of("java", "python", "scala","java"); //set集合不能重复
Set<String> set = Arrays.of("java", "python", "scala");
System.out.println(set); //[java, python, scala]
//set.add("javaee"); //UnsupportedOperationException
//set.remove("java"); //UnsupportedOperationException
}
}