目录
前言
https://www.bilibili.com/video/BV18J411W7cE?p=107
打印
System.out.println() \\ 换行
System.out.print() \\不换行
注释
单行注释
//
多行注释
/* */
文档注释
/** */ 暂不用
常量

null无法使用System.out.println(null)输出
数据类型
七个数值型

整数默认是int,浮点数默认是double
类型转换
自动类型转换
小范围->大范围

强制类型转换
大范围->小范围
小范围数据类型 变量名 = (小范围数据类型) 大范围的数据
example:
int k = (int)88.88
变量
变量的定义格式
数据类型 变量名 = 变量值
example:
int a = 10;
long a = 1000000000**L**,如果没有L,右边默认为int
float a = 13.14F
命名约定
方法、变量
firstName
类
FirstName
运算符
算术运算符

字符的加操作
int i = 10;
char c = 'A';
System.out.println(i + c); // 这里的'A'变成65
int k = 10 + 13.14; // 报错:因为右边会进行数据类型的升级,即结果的数据类型是double~
字符串的加操作
即连接操作
赋值运算符
short s = 10;
s += 20; // 隐含了强制类型转换,也就是说,右边强制转换成short
s = s + 20; // 报错:因为右边会进行数据类型的升级,即结果的数据类型是short~
自增自减运算符
int i = 10;
int j = i++; // j=i先执行,j=10
int j = ++i; // ++i先执行,j=11
逻辑运算符

1<a<2需要写成 (1<a) & (a<2)
短路
&&: 左边为False,右边不执行
||:左边为True,右边不执行
三元运算符
a>b?a:b
Example:
public class HelloWorld2 {
public static void main(String[] args){
int a1 = 100;
int a2 = 200;
int a3 = 300;
int tmp_a = a1>a2?a1:a2;
int max_a = tmp_a>a3?tmp_a:a3;
System.out.println("max_a:"+max_a);
}
}
数据输入——Scanner
Example:
import java.util.Scanner;
public class HelloWorld2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
System.out.println("a:"+a);
}
}
分支语句
if
if(条件语句){
执行语句;
}
if(条件语句){
执行语句1;
}else{
执行语句2;
}
if(条件语句){
执行语句1;
}else if(条件语句){
执行语句2;
}else if(条件语句){
执行语句3;
}else{
执行语句4;
}
switch
switch需要先计算表达式的值,然后和case中的值进行配对。
switch(表达式){
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
case 值3:
执行语句3;
break;
case 值4:
执行语句4;
break;
default:
执行语句5;
break; // break可以省略
}
Example:case 穿透
import java.util.Scanner;
public class HelloWorld2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
switch(month) {
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("错");
}
}
}
for
for(初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
初始化语句中的变量只属于for循环内部
while
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}
do…while
初始化语句
do{
循环体语句'
条件控制语句;
}while(条件判断语句);
Example:先执行do
public class HelloWorld2{
public static void main(String[] args){
int j = 1;
do{
System.out.println("j:"+j);
j++;
}while(j<=0);
}
}
死循环
for(;;){}
while(True){}
do{}while{True}
random
import java.util.Random;
public class HelloWorld2{
public static void main(String[] args){
Random r = new Random();
int a = r.nextInt(100) + 1; // (0-99) + 1
System.out.println("a: "+a);
}
}
数组
数组定义格式
int[] arr // √
int arr[] // ×
数组动态初始化
int[] arr = new int[3];

数组元素访问
arr[i]
多个数组指向相同的内存空间
int[] arr2 = arr1;
数组静态初始化
int[] arr = new int[]{...}
int[] arr = {...}
数组遍历
int[] arr = {1,2,3};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
👇
for (int j : arr) {
System.out.println(j);
}
char[] arr = {'1','2','3'};
for (char c : arr) {
System.out.println(c);
}
最值
用遍历
方法
方法的定义和调用
定义
public static void 方法名() {
//方法体
}
调用
psvm{
方法名()
}
带参数的方法
定义
public static void 方法名(数据类型 变量名){
...
}
调用
psvm{
方法名(参数)
}
带返回值的方法
public class ...{
public static void main(){
boolean res = fuc();
}
public static boolean fuc(){
...
}
}
方法重载


Example:

public static int sum(int a, int b){
return a+b;
}
public static double sum(double a, double b){
return a+b;
}
public static int sum(int a, int b, int c){
return a+b+c;
}
方法的参数传递
基本参数
不改变~
引用参数
改变:
public static void main(String[] args) {
int[] arr = {10,20,30};
System.out.println(arr[1]);
change(arr);
System.out.println(arr[1]);
}
public static void change(int[] arr){
arr[1] = 300;
}
例子
反转
public static void reverse(int[] arr){
int tmp = 0;
for (int start=0,end=arr.length-1; start <= end;start++, end--){
tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
}
Debug
删除多个断点
类和对象
类
public class Phone {
String brand; //成员变量
int price;
public void call(){ //成员方法 没有static
int i = 0; // 局部变量
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
}
对象
Phone p = new Phone();
面向对象之封装
如果一个成员变量被private修饰了,那么只能在本类中被访问,所以可以在本类中向外部提供访问(get)和修改(set)的接口方法。
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int a){
if(a>0){
age = a;
}else{
System.out.println("错误");
}
}
public int getAge(){
return age;
}
this
public class ...{
String name;
public void setName(String name){
name = name; // 此时name为null,即成员变量name并没有被设置,因为这里的name都是局部变量。
}
}
👇
public class ...{
String name;
public void setName(String name){
this.name = name; // 此时name为null,即成员变量name并没有被设置,因为这里的name都是局部变量。
}
}
构造方法
当一个类中没有自己定义构造方法,在main方法中,对其进行实例化时,系统会给定一个默认的无参数构造方法
带参数的构造方法需要我们自己定义,一旦定义,系统默认的无参数构造方法就会失效,如果我们依然要使用无参数构造方法,那么也需要自己重新定义之。
字符串
字符串的定义

String s1 = new String(); // 一个new,就会有一个新的对象
System.out.println(s1);
char[] chs = {'a','b','c'};
String s2 = new String(chs);
System.out.println(s2);
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println(s3);
String s4 = "abc"; // 如果String s5 也= "abc",则 s5和s4在同一个地址
System.out.println(s4);
字符串的比较——equals
==
- 基本类型:比较的是数据值
- 引用类型:比较的是地址值 --如果要比较引用类型的数据值–>equals
s1.equals(s2)
字符串的遍历——charAt
for(int i=0;i<s.length();i++){
sout(s.charAt(i));
}
判断大小写\数字字符
大写:
ch>='A' && ch <='Z'
小写:
ch>='a' && ch <='z'
数字
ch>='0'&&ch<='9'
StringBuilder
定义

添加(append)和反转(reverse)方法
添加
StringBuilder sb = new StringBuilder("xsy");
sb.append("hello").append("10"); // 由于sb.append()返回的是对象本身,所以支持链式编程
System.out.println(sb);
反转
sb.reverse();
StringBuilder ->String 的转化(toString)
StringBuilder sb = new StringBuilder();
String s = sb.toString();
String ->StringBuilder 的转化(构造方法)
StringBuilder sb2 = new StringBuilder(s);
集合(ArrayList)
定义
import java.util.ArrayList;
ArrayList<String> array = new ArrayList<>()
添加元素(add)
末尾添加
array.add(...);
指定位置添加
array.add(index, elements);
删除(remove)
array.remove(elements);
array.remove(index);
修改(set)
array.set(idnex,elements);
获取(get)
array.get(index);
长度(size)
array.size()
继承
定义
public class child extends parent{
...
}
子类对于父类的访问
子类如果要访问父类的成员变量,该方法不能是private修饰的变量
子类的成员方法中定义了同名的局部变量,此时,如果要访问子类的成员变量,需要加this. 而如果要访问父类的成员变量,需要加super
子类创建对象时,首先要使用父类的无参构造方法
如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
方法一:在子类的构造方法中,使用super显式使用父类的带参构造方法
public class parent {
public int age = 10;
public parent(int age){
this.age = age;
}
}
public class child extends parent{
private int age;
public child(int age){
super(age);
this.age = age;
}
}
方法二:在父类中定义无参构造方法
public parent(){
}
方法重写
public class parent {
public int age;
public void show(){
System.out.println(age);
}
}
public class child extends parent{
private int age;
@Overide//可以帮助检查重写方法的正确性
public void show(){
super.show();
System.out.println("other");
}
}

自动建包
有一个程序,属于1.2这个二级包:
package 1.2;
public class HelloWorld{
public static void main{
....
}
}
编译:自动创建1.2这个二级目录,并在其中生成HelloWorld.class
java -d . HelloWorld.java
运行:
java 1.2. HelloWorld.java
修饰符
权限修饰符
四种权限
package lesson1;
public class parent {
void show1(){} // 3
public void show2(){} // 1
protected void show3(){} // 2
private void show4(){} // 4
}
相同包下的子类
除了private

相同包下的无关类

不同包下的子类

不同包下的无关类

总结

状态修饰符——final
final的定义与作用
final修饰成员方法:该类中的该方法是最终方法,不可以被任何子类重写
public final void method(){
System.out.println("1");
}
final修饰成员变量:该变量不能被改变
public final int age = 20;
final修饰类:该类不能作为父类
public final class parent {}
final修饰基本类型变量:变量不能被修改
final int age = 20;
final修饰引用类型变量:引用类型变量的值可以被修改,地址不能被修改
final Student s = new Student();
s.age = 20; // √
s = new Student(); // ×
状态修饰符——static
定义
static修饰成员变量:被所有对象共享,只需要通过类名初始化一次
public class Student {
public static int age = 20;
}
----
public class other{
public static void main(){
Student.age = 20; // 建议直接使用类名进行初始化
}
}
static修饰成员方法:非静态的成员方法可以访问静态、非静态方法;静态、非静态变量 |||| 静态成员方法只能访问静态方法;静态变量
public class Student {
public static int age = 20;
public int age2 = 30;
public void show1(){}
public static void show2(){}
public void test(){
System.out.println(age);
System.out.println(age2);
show1();
show2();
}
public static void test2(){
System.out.println(age);
show2();
}
}
多态
多态的定义
向上转型
Animal a = new Cat(); // Animal是父类,Cat是子类
向下转型
Cat c = (Cat)a;
如果a是Dog(Dog也是Animal的子类,则无法向下转型成Cat)
多态的访问

即:
- 只能使用父类的成员变量,如果子类也有此成员变量,值也应该是父类的
- 只能使用父类的成员方法,如果子类也有此成员方法,将进行复写,值应该是子类的
多态的使用
动物类:eat
猫类:eat、狗类:eat、猪类:eat
使用动物类
public void useAnimal(Animal a){
a.eat();
}
在main中,只需要创建猫、狗、猪的对象,把对象传入给使用动物类的useAnimal方法,就可以使用猫、狗、猪这些动物的子类的方法了。但是只能使用这些子类中,在父类也定义过的方法,就比如eat,而a.drink是不行的,除非动物类也有drink这个方法。
多态的转型
向上转型
向下转型
抽象类
抽象类的定义
public abstract class Animal {
public int age;
public abstract void eat();
}
抽象类的性质
- 抽象类无法被实例化,除非通过多态(向上转型)
- 抽象类的子类要么重写抽象类的所有抽象方法,要么子类也是抽象类
接口
接口的定义
public interface Jumping {
public abstract void jump();
}
接口的使用(实现类)
public class Cat implements Jumping{
@Override
public void jump() {
System.out.println("haha");
}
}
接口的特点
成员特点
- 成员变量:都是被 static和final修饰了的(public static final)
- 构造方法:不能定义构造方法(那么子类的初始化时,会先去调用接口的无参构造方法,怎么办呢?——object是所有类的超类)
- 成员方法:只能是抽象方法(public abstract)
接口与类:类可以多实现接口:
public class Cat extends Object implements Jumping,Jumping1{
接口与接口:接口可以多继承接口
public interface Jumping3 extends Jumping,Jumping1{
}
接口和抽象类的区别
包括行为和属性,总体还是要继承抽象类的。如果新增了某些行为,那么定义成接口去实现。

内部类
内部类和外部类的关系
- 内部类可以访问外部类
- 外部类只能访问内部类的对象
内部类的分类与定义
成员内部类
局部内部类
匿名内部类
成员内部类
成员内部类的定义
package lesson7;
public class Outer {
int num = 10;
public class Inner{
int a = 10;
public void show(){
System.out.println(num);
}
}
public void method(){
Inner i = new Inner();
i.show();
System.out.println(i.a);
}
}
创建成员内部类的对象
外部类名.内部类名 对象名=外部类对象.内部类对象
example:
Outer.Inner oi = new Outer().new Inner()
成员内部类的一般使用方法(private)
public class Outer {
int num = 10;
private class Inner2{
public void show(){
System.out.println(num);
}
}
public void method(){
Inner2 i = new Inner2();
i.show();
}
}
//通过外部类的method去访问内部类
局部内部类
局部内部类的定义
public class Outer {
int num = 10;
public void method2(){
int num2 = 20;
class Inner3{
public void show(){
System.out.println(num);
System.out.println(num2);
}
}
Inner3 i = new Inner3();
i.show();
}
}
匿名内部类
局部内部类的特殊形式,其实是一个继承父类或者实现接口的一个对象!
匿名内部类的定义
定义一个接口:
public interface Inter {
void show();
}
创建匿名内部类
public class Outer {
int num = 10;
public void method(){
new Inter(){
@Override
public void show() {
System.out.println("haha");
}
}.show(); // 对象直接调用方法
}
}
由于是对象,则直接可以赋值给变量(顶级理解👇)
public class Outer {
int num = 10;
public void method(){
Inter i = new Inter(){
@Override
public int show() {
return 0;
}
}; //
int j = new Inter(){
@Override
public int show() {
return 1;
}
}.show();
System.out.println(i.show());
System.out.println(j);
}
}
匿名内部类的使用
定义一个接口
public interface Jumping {
void jump();
}
定义一个普通类,类中的方法的参数是:实现接口的类的对象
public class JumpingOperator {
public void method(Jumping j){
j.jump();
}
}
使用该method
//1:
JumpingOperator jo = new JumpingOperator();
Jumping j = new Cat();
jo.method(j);
//2:使用匿名内部类直接创建对象
jo.method(new Jumping() {
@Override
public void jump() {
System.out.println("hahaha");
}
});
常用的API
Math

System

Object

toString()
Student s = new Student();
System.out.println(s.toString()); // 由于object是所有类的父类,所以Student也有toString方法,建议重写👇
@Override
public String toString() {
return "Student{" +
"aga=" + aga +
", name='" + name + '\'' +
'}';
}
equals
重写equals
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (aga != student.aga) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
Arrays

example:
int[] arr = {24, 69, 80, 57, 13};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
基本类型包装类

Integer
最大值最小值
Integer.MAX_VALUE
MIN_VALUE
构造方法

Integer i1 = Integer.valueof(100)
Integer i1 = Integer.valueof("100") // 字符串-->Integer
String
Int和String的转换
int转换为String:
String s = String.valueOf(int);
String转换为int:
//1 String->Integer->int
Integer i = Integer.valueOf(String);
int ii = i.intValue();
//2 String -> int
int i = Integer.parseInt(String)
以空格为分割符的String转换成int类型的数组
import java.util.Array;
String strArray = "1 2 3 4";
int[] intArray = new int[strArray.length];
for(int i = 0;i < strArray.length; i++){
intArray[i] = Integer.parseInt(strArray[i]);
}
Arrays.sort(intArray);
String res = Arrays.toString(intArray);
自动装箱和拆箱
装:基本类型->包装类型
Integer i = Integer.valueOf(100);
Integer ii = 100; // 自动
拆:包装类型->基本类型
int iii = ii.intValue();
int iiii = ii; // 自动
日期类

Date
构造方法
Date d1 = new Date();
long a = 1000*60*60;
Date d2 = new Date(a);
获取时间(getTime())
设置时间(setTime())
SimpleDataFormat

定义
SimpleDateFormat sdf = new SimpleDateFormat()
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss")
格式化——format
传date,得String

Date d = new Date();
String = sdf.format(d);
public static String dateToString(Date data, String format){
SimpleDateFormat sdf = new SimpleDateFormat(format);
String s = sdf.format(data);
return s;
}
解析——parse

传String,得date
String ss = "2021 02 17 09 27 20";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd HH mm ss"); //需要跟ss对应
Date dd = sdf.parse(ss);
System.out.println(dd);
public static Date stringToDate(String s, String format) throws ParseException { // 系统提示使用parse时,可能出现字符串和format不匹配的编译异常,1. throws Par.... 2. try..catch...
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d = sdf.parse(s);
return d;
}
Calendar
定义
Calendar是一个抽象类
Calendar c = Calendar.getInstance();
日历字段
Calendar类中的静态成员变量
Calendar.YEAR
返回给定日历字段的值——get
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; // 从0开始
修改日历字段——add&set
c.add(Calendar.YEAR, -1);
//直接设置
c.set(2048, 11, 11);
异常

异常处理
try…catch…
代码格式

try{
代码;
}catch(ArrayIndexOutOfBoundsException e){
代码;
}
异常类的常用成员方法
sout(e.getMessage())
sout(e.toString())
sout(e.printStackTrace())
throws

自定义异常

public class Teacher {
public void checkScore(int score) throws ScoreException { // 调用该方法时,需要用try catch解决该异常,因为该异常继承自exception,是编译异常。
if(score<0 || score > 100){
throw new ScoreException();
}else{
System.out.println(score);
}
}
}
集合进阶
集合类的体系结构

collection
collection重写了toString的方法呦~
定义(ArrayList)
Collection<String> c = new ArrayList<String>();
常见方法

c.add();
c.remove(); // 删除前面的
c.clear();
c.contains();
c.isEmpty();
c.size();
遍历
得到collection的迭代器:
Iterator<String> it = c.iterator();
获取下一个元素:
it.next();
判断是否有下一个元素:
it.hasNext();
List
定义(ArrayList)
List<String> list = new ArrayList<String>();
常用方法:

list.add();
list.size();
//特有
list.add(index, elements);
list.remove(index);
list.set(index, elements);
list.get(index);
遍历:
通过get进行遍历
并发修改异常(checkForComodification)
使用iterator遍历集合list的过程中,对集合list添加、删除了元素:
while (it.hasNext()) {
String s = it.next();
list.add("nihao");
System.out.println(s);
}
对list进行for循环遍历就不会出错:
for(int i = 0; i < list.size(); i++){
String s = list.get(i);
list.add("nihao");
System.out.println(s);
}
list集合的特有迭代器——listiterator()
常用方法:

使用listiterator遍历集合list的过程中,可以对集合list添加、删除元素。
增强for循环
for(String s:list){
...
}
ArrayList(数组)&LinkedList(链表)

LinkedList:
LinkedList<String> linkedlist = new LinkedList<String>();
linkedlist.add("hello");
linkedlist.addFirst("hello");
linkedlist.addLast("hello"); // = add
linkedlist.getFirst("hello");
linkedlist.getLast("hello");
linkedlist.removeFirst("hello");
linkedlist.removeLast("hello"); // = remove
Set
集合中只能存储引用类型
定义(通过HashSet)
Set<String> set = new HashSet<String>();
哈希值
"string".hashCode();
HashSet
不可重复、无序
定义
HashSet<String> hs = new HashSet<String>();
案例:HashSet集合存储学生对象并遍历(重写对象类的hashCode和equals方法)
HashSet存储对象的原理:

所以两个成员变量相同的对象,i依然可以存储进同一个HashSet,如何解决?——重写对象类的hashCode和equals方法!
LinkedHashSet
由哈希表(不可重复)和链表(有序)实现
定义
LinkedHashSet<String> lsh = new LinkedHashSet<String>();
TreeSet
定义
TreeSet<Integer> ts = new TreeSet<Integer>();
自然排序(无参构造,实现Comparable接口)
使用无参构造方法
实现对自定义的学生类进行自然排序
现在的问题是:

所以,如果我们不对学生类实现自然排序,就会报错:
重写Comparable接口中ComparaTo的return值
0:
只能存储一个对象,因为0代表大小相同
1:
按照给定的存储顺序存储(升序)
-1:
按照给定的存储顺序逆序存储
自定义(单个成员变量):
public int compareTo(Student o) {
return this.age - o.getAge(); // 升序,this代表当前元素
}
自定义(多个成员变量):
public int compareTo(Student o) {
int num = this.age - o.getAge(); //主要
int num2 = num==0? //次要this.name.compareTo(o.name):num;
return num2;
}
非自然排序(比较器排序)(带参构造:Comparator对象)
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num = o1.getAge() - o2.getAge();
int num1 = num == 0?o1.getName().compareTo(o2.getName()):num;
return num1;
}
});
泛型
定义的格式

泛型类
泛型类下面的方法,不需要指定参数的类型,可以传入多种类型的参数
泛型类的定义
class Generic<T>{
private T t;
public T getT(){
return t;
}
public void setT(T t){
this.t = t;
}
泛型方法
现在有这样的类
class Generic<T>{
public void show(T t) {
System.out.println(t);
}
}
如果要让show方法输出不同类型的值,就需要对象化不同类型的Generic类,这样太麻烦.
泛型方法的定义
class Generic{
public <T> void show(T t) {
System.out.println(t);
}
}
泛型接口
public interface Generic<T> {
void show(T t);
}
实现类
class GenericImlp<T> implements Generic<T>{
public void show(T t){
System.out.println(t);
}
}
类型通配符
定义格式(?)
List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Integer>();
上限(extends)
List<? extends Object> list3 = new ArrayList<Object>();
List<? extends Number> list4 = new ArrayList<Integer>();
下限(super)
List<? super Object> list5 = new ArrayList<Object>();
List<? super Integer> list6 = new ArrayList<Number>();
-----255
一些轮子
arrayToString
描述
把数组中的元素按照指定的规则组成一个字符串
代码
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]);
}
}
sb.append("]");
String s = sb.toString();
return s;
}
冒泡排序
描述
冒泡排序
代码
public class maopao {
public static void main(String[] args) {
int[] arr = {24, 69, 80, 57, 13};
System.out.println("排序前:"+arrayToString(arr));
for(int i=0;i<=arr.length-2;i++){
for(int j=0;j<=arr.length-2-i;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("排序后:"+arrayToString(arr));
}
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]);
}
}
sb.append("]");
String s = sb.toString();
return s;
}
}
不可重复的随机数
描述
获取10个1-20之间的随机数,随机数不能重复
public class SetDemo {
public static void main(String[] args) {
Random r = new Random();
Set<Integer> s = new HashSet<Integer>();
while(s.size() < 10){
int i = r.nextInt(20) + 1;
s.add(i);
}
System.out.println(s);
}
}

4391

被折叠的 条评论
为什么被折叠?



