Java包和常见工具类总结

一、内部类

什么是内部类?
顾名思义,就是将一个类的定义放在另一个类的内部。
概念很清楚,感觉很简单,其实关键在于这个内部类放置的位置,可以是一个类的作用域范围、一个方法的或是一个代码块的作用域范围。
所以理解了概念只是第一步,掌握细节才能彻底搞定Java的内部类特性。
内部类的分类
1.普通内部类(inner class):
一个类A中定义另一个类B,其中类B就是类A的内部类,也是类A的一部分

public class People {
    private String pname="张三";
    
    public void sayHello(){
        System.out.println("Let us say Hello");
        // 知识点1 :外部类的方法中,可以使用内部类的属性、方法
        Address address = new Address();
        address.addressName ="湖北武汉";
        address.contentName="张某某";
        address.showAddressInfo();
    }
     // 定义普通内部类   收货地址
    class Address{
        private String addressName;// 收货地址
        private String contentName;// 联系人
        public void showAddressInfo(){
            System.out.println("联系人:"+contentName + "--收货地址:"+addressName);
            // 内部类的方法 可以直接访问外部类的属性  (由于通常情况属性的访问必须通过对象才可以使用,而)
            System.out.println("访问外部类的属性:"+pname);
        }
    }
}

另外还可以将内部类的定义放在方法中某一语句块中,如if语句块中。
说明:内部类在if语句块中,因此它的作用范围也在if语句块的范围之内。超出该范围是不可用的。
2.静态内部类(嵌套类)
在普通内部类基础上,增加“static”关键字,与静态方法相似,满足静态的要求
静态内部类和普通内部类之间最大的区别是:
普通内部类对象隐式地保存了一个引用,指向创建它的外部类对象。而静态内部类创建对象,并不需要外部类对象。
不能从静态内部类的对象中访问非静态的外部类对象。
普通内部类不能有static数据和static字段,也不能包含嵌套类,但是静态内部类可以包含所有这些东西。

public class Product {
	private static int id = 100;
	private static class BSection implements Section{
		private String name = "bbbb";
		@Override
		public String hello() {
			return name + " hello";
		}
		// 只能访问外部类的静态数据或字段
		public int getId() {return id;}
		
		// 可以包含静态数据或方法
		static int x = 200;
		public static void test1() {}
		
		// 可以再嵌套一层
		static class BInner{
			private String name;
			static void test1() {System.out.println("inner ===");}
		}
	}
	public static void main(String[] args) {
		Section section = new BSection();
		section.hello();
	}

3.匿名内部类
匿名内部类其实是一种特殊的方法内部类(局部内部类)。它特殊在于将内部类的定义和其对象创建结合在了一块。没有通过class关键字显示声明内部类名称,故谓之“匿名”。
定义一个没有类名,只有对方法的具体实现。通常它依赖于实现关系(接口)或继承关系(父类)

public class Product {
	public Section section() {
		return new Section() {
			private String name = "hayli";
			@Override
			public String hello() {
				return name + " haha";
			}
		};
	}
	public static void main(String[] args) {
		Product p = new Product();
		p.section();
	}
}

说明:此处Section可以是接口,也可是基类。
虽然工作中使用内部类的机会可能不会很多,但是现在初学阶段还是需要了解这些最基础的知识,以后真的在项目中遇到内部类的写法,也能看懂是怎么回事,更加知道怎么去使用也是好的

二、异常

异常的概念
Java 中的异常(Exception)又称为例外,在程序中,发生“不正常”的事件,导致程序无法正常运行,并使JVM中断,称为异常,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。
例如在设计好的程序代码中提示的是“请输入数字!”假如用户没有按照要求,输入的是“非数字”,那么就会出现异常情况。
出现异常的原因
1.java 内部错误发生异常,Java 虚拟机产生的异常。
2.编写的程序代码中的错误所产生的异常,例如数组越界异常。这种异常称为未检査的异常。
我们 一般需要在某些类中集中处理这些异常。
3.通过 throw 语句手动生成的异常,这种异常称为检査的异常,用来告知该方法的调用者一些必要的信息。
处理异常的方法
在Java中,通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法会产生代表该异常的一个对象,并把它交给运行时的系统,运行时系统寻找相应的代码来处理这一异常。
(程序运行) – > 异常(对异常进行处理) – >(处理完毕,程序继续运行)
同时我们把生成异常对象,并把它提交给运行时系统的过程称为拋出(throw)异常 ;运行时系统在方法的调用栈中查找,直到找到能够处理该类型异常的对象,这一个过程称为捕获(catch)异常。
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws。
捕获异常:
Try – > 试一试,将可能发生的代码使用try包裹,try不能单独出现
Catch – >捕获异常,当发生了指定的异常对象时,执行异常
Finally – > 异常之后的最终处理,无论是否发生异常,程序总能执行
声明异常:
Throws – > 声明方法可能要抛出的各种异常(后面跟抛出异常的名字)
抛出异常:
Throw – > 手动抛出异常
如果在一个方法体中抛出了异常,如何通知调用者?
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续声明异常(main()方法声明的异常由Java虚拟机处理)
由于有些异常是不能直接抛出的,需要先声明才可以抛出,异常可以分为两大类:
a、编译器异常(check异常或者检查异常):在编译期间检查异常,如果没有处理异常,则编译出错。
b、运行期异常(runtime异常或者运行异常):在运行期间检查异常,编译期间可以不处理异常。
Exception中常用的异常类

  • RuntimeException
  • ArrayIndexOutOfBoundsException :数组下标越界异常
  • ArithmeticException:算术异常
  • NullPointerException:空指针异常
  • NumberFormatException :数字格式化异常
  • NegativeArraySizeException:负数组长度异常
  • ArrayOutOfBoundsException:数组索引越界异常
  • ClassNotFoundException:类文件未找到异常
  • ClassCastException:类转换异常
  • 检查异常(check Exception)
  • IOException:IO操作
  • FileNotFoundException: 文件未找到异常
  • SQLException:
  • EOFException:读写文件尾异常
  • DateFormatException:日期格式化异常
  • SocketException:SocketException

在这里插入图片描述

三、java包

Java是一门面向对象的语言,sun公司提供基于面向对象的帮助文档(API Application Program Interface),并针对不同的版本生成的API
java.lang包,最基础的包、核心内库。常用类有String、Math、Object、包装类等
java.util包,实用工具包,常用类有Arrays、Scanner、Random、ArrayList、Date、Calendar、HashSet、HashMap等

包装类

首先看包装类,对于包装类的出现是为了解决普通数据类型的数据不具有对象的特征的问题,对于普通的数据类型而言,它不具有方法、属性和对象之间的交互,包装类的出现就是为了解决这个问题
包装类与基本数据类型之间的转换关系

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
如上图所示,基本数据类型和包装类有着一一对应的关系,从上图可以看出包装类的名字和基本数据类型的名字有着一些规律,我们在记忆的时候,可以先记住特殊的,比如Integer和Character这两个,剩下的就按照规律记忆即可,这里的规律就是将基本数据类型的首字母大写 通过基本数据和包装类的相互转换,就可以实现基本数据类型也可以拥有对象的特征,他们转换的过程称为装箱和拆箱

基本数据类型与包装类和字符串之间的相互转换这里以byte类型为例
在这里插入图片描述
基本数据类型和包装类之间的转换(拆箱和装箱)
对于基本数据类型和包装类之间的转换中的拆箱和装箱这两个概念,可以这样理解,把箱子理解成为包装类,把东西理解成为基本数据类型,如果你想要让基本数据类型具备包装类的特点,那么就把它放到箱子里头,那么它就会具有箱子的功能
装箱分为自动装箱和手动装箱,自动装箱就是直接将基本数据类型赋值给包装类的对象引用,手动装箱就是使用包装类的构造方法,让基本数据类型作为构造方法的参数
拆箱也分为两类,一是自动拆箱,自动拆箱就是将包装类对象直接赋值给其对应的基本数据类型,二是手动拆箱,手动拆箱就是使用包装类中的方法,我们拿Integer类举例,如果想要把Integer类型的对象转换为int类型的数据,那么就可以使用intValue方法

Object类

Object类是所有类的父类,位于java. lang包中,是所有类的根。任何的对象,都可以调用Object类中的方法,包括数组对象。
Object类的常用方法
–toString()

    格式: public  String  toString(){
       String strName ="所覆写的属性名(字符串)"
                        return  String;
       }

通常,toString方法会返回一个"以文本方式表示"次对象的字符串.结果是一个简单易懂的信息表达式.
建议所有子类都重写此方法.
–equals()
把equals写入父类中可以实现多个子类的比较
格式: public boolean equals(Object obj){
String str = this.所定义的属性名 //所有本类中其他的属性属性间用+链接   
if(n1 == n2){return true}         
else {return false}
}
Object类的equals方法实现对象上差别可能性最大的相等关系;即,对任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true(x==y具有值true).
参数: obj -要与之比较的引用对象
返回:如果此对象与obj参数相同,则返回true; 否则返回false.
任何类可以根据实际需要,覆盖toString及equals方法,实现自定义的逻辑.
–hashCode()
获取对象的哈希码值,为16进制
–equals方法与hashCode方法关系
如果两个对象使用equals比较返回true,那么它们的hashCode值一定要相同;
如果两个对象equals比较返回false,那么它们的hashCode值不一定不同;
覆盖equals,往往需要覆盖hashCode,可以使用Eclipse自动生成,保证equals返回true,则hashCode相同;equals返回false,则hashCode不同;

String类

String类在java.lang包中,Java中所有的字符串都会创建该类的实例,它可以对字符串查找,检索,转变大小写,截取等一系列操作,并提供了大量的字符串操作方法。java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间。
String类对象的创建
字符串声明:String stringName;
字符串创建:stringName = new String(字符串常量);或stringName = 字符串常量;
String类常用方法
1、求字符串长度
public int length()//返回该字符串的长度
2、求字符串某一位置字符
public char charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。
3、提取子串
用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:
1)public String substring(int beginIndex)//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
2)public String substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。
4、字符串比较
1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。
5、字符串连接
public String concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。
6、字符串中单个字符查找
1)public int indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
2)public int indexOf(int ch/String str, int fromIndex)//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
3)public int lastIndexOf(int ch/String str)//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
4)public int lastIndexOf(int ch/String str, int fromIndex)//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
7、字符串中字符的大小写转换
1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串
8、字符串中字符的替换
1)public String replace(char oldChar, char newChar)//用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
2)public String replaceFirst(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
3)public String replaceAll(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
9、其他类方法
1)String trim()//截去字符串两端的空格,但对于中间的空格不处理。
2)boolean statWith(String prefix)或boolean endWith(String suffix)//用来比较当前字符串的起始字符或子字符串prefix和终止字符或子字符串suffix是否和当前字符串相同,重载方法中同时还可以指定比较的开始位置offset。
3)regionMatches(boolean b, int firstStart, String other, int otherStart, int length)//从当前字符串的firstStart位置开始比较,取长度为length的一个子字符串,other字符串从otherStart位置开始,指定另外一个长度为length的字符串,两字符串比较,当b为true时字符串不区分大小写。
4)contains(String str)//判断参数s是否被包含在字符串中,并返回一个布尔类型的值。
5)String[] split(String str)//将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回

对象的克隆

首先,我们来明确,为什么要用克隆?
克隆的对象可能包含一些已经修改过的属性,为new出来的对象的属性都还是初始化时候的值!
所以当需要一个新的对象来保存当前对象的状态的时候,就靠克隆方法了!
克隆又分为深克隆和浅克隆
浅克隆:当对象被复制的时候,只复制他本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有实现真正意义上的复制,只是引用值传递!
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制,强调的就是引用类型的,实现了真正的复制!
具体的操作去实现克隆:
1.第一种:我们利用Cloneable接口和重写的object超类中的clone方法
(1)首先,关于cloneable接口的说明:
标志性接口,其接口内部是空的,仅作为一个标志使用。
而且这个标志也仅仅是针对object类中clone()方法的,如果要有克隆功能的类,没有实现这个接口,就使用了object类的clone方法,那么此时,clone方法会CloneableNotSupportedException异常

(2)关于clone方法
首先明确其在超类Object中的实现:
声明是这样的:protected native Object clone() throws …
函数逻辑是:可以理解为浅克隆!
其次在来说明clone()方法

①Object中的clone方法是一个native方法,native方法的效率一般来说都是远高于java中的非native方法,这也就理解了为什么我们实现对象的拷贝要利用clone方法,而不是先new一个类,然后把原始对象的信息复制到新对象中去
②clone方法返回的是Object类,具体使用时注意类型强转
③protected修饰符的理解:其权限表明只能在本包中或者在其他包中的子类中访问,一定要理解,是在子类中访问!
相信,稍微学习过java的都知道,protected访问权限外部是不可见的!
这也就解释了,为什么我们不能直接使用clone方法,而必须在类中重写方法,间接调用clone方法,以使用!
(3)而其在实现类中的具体实现Clone()方法则确定了其克隆逻辑
就是说,重写clone()的逻辑,决定了其是浅克隆(直接使用超类的clone)还是深克隆(手动克隆引用类型)
PS:强调一点,实现克隆,自己在实现类中,实现克隆逻辑的方法不是必须对clone()方法重写,只是借用了clone。
这一点,很容易理解,因为这种方法具体实现克隆逻辑的代码完全是程序员自身实现的!只不过为了效率问题,借用到了超类的clone方法,而要借用这个方法,就要实现相应的标志性接口(上述也说了,仅作为标志使用,内部为空,所以并没有需要实现接口内的方法,接口中根本就没有方法)。所以,可以看出,没有任何环节要求实现方法必须为clone。所以,本质上是自己的代码逻辑借用到了clone()方法,而不是重写clone()方法。所以无论是,传入的形式参数,方法名,返回类型都可以跟Object中的Clone方法没有一点关系!
如果要实现深克隆,也就是对象引用型成员变量也拷贝一份,只需要在实现类的实现方法的逻辑中实现即可。

Math类

在编写程序时,可能需要计算一个数的平方根、绝对值、获取一个随机数等。java.lang包中的Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。另外,Math类还有两个静态常量,E和PI,它们的值分别是2.7182828284590452354和3.14159265358979323846.

以下是Math类常用方法:

public static long abs(double a) 返回a的绝对值

public static double max(double a,double b) 返回a、b的最大值

public static double min(double a,double b) 返回a、b的最小值

public static double random() 产生一个0到1之间的随机数(不包含0和1)

public static double pow(double a,double b) 返回a的b次幂

public static double sqrt(double a) 返回a的平方根

public static double log(double a) 返回a的对数

public static double sin(double a) 返回正弦值

public static double asin(double a) 返回反正弦值

有时可能需要对输出的数字结果进行必要的格式化,例如3.14356789,希望保留小数位3位,整数部分至少要显示3位,即将3.14356789格式化为003.144,可以使用java.text包中的NumberFormat类,该类调用类方法:

public static final NumberFormat getInstance()实例化一个NumberFormat对象,该对象调用 public final String format(double number)方法可以格式化数字number。

NumberFormat类有如下常用方法:

public void setMaximumFractionDigits(int newValue)

public void setMinimumFractionDigits(int newValue)

public void setMaximumIntegerDigits(int newValue)

public void setMinimumIntegerDigits(int newValue)

Date类和Calendar类

在JAVA中有两个日期类Date类和Calendar类,在开始的时候只有Date类来表示日期。后来出现了Calendar类对Date类开始替代,由Calendar类来对日期进行计算,之后Date类中的很多方法已经废弃不用,但是两者都是时间表示类。
两者主要区别:java.util.Date是个日期数据,java.util.Calendar 用于日期相关的计算。
具体区别:
Date:
Date表示特定的瞬间,精确到毫秒。它允许把日期解释为年、月、日、小时、分钟和秒值;它也允许格式化和解析日期字符串。现在一般只用来当做时间数据表示类。
Calendar:
Calendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR、MONTH、DAY_OF_MONTH、HOUR),也就是对日期时间进行计算。
Calendar类因为是抽象类无法直接创建对象使用,但是它有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象,该方法是使用默认时区和语言环境获得一个日历,也就是获得当前系统时间。
Date输出的是一个日期时间表示,而Calendar输出的是一个对象,里面有各种日期数据。
所以如果要用Calendar来输出一个日期时间,只要用gettime()方法获取就行了。而两者转换成时间戳的方法都是gettime(),只不过calendar要在gettime()方法获得时间后再调用gettime()方法才能把日期钻换成时间戳。
下面介绍Calendar对日期的一些操作
1.指定一个日期(年月日,时分秒)
使用Calendar的set(int year, int month, int date, int hourOfDay, int minute,int second)方法。
set还有其他的重载方法,如果只设定年月日等,没设定的其他日期数据如时分秒,默认用当前系统时间填充。
还可以用Calendar的 set(int field, int value) 方法来指定日期
field 表示时间量,它的值可以如下:
Calendar.ERA:表示无加减
Calendar.YEAR:年
Calendar.MONTH:月
Calendar.DATE:日
Calendar.HOUR:小时
Calendar.MINUTE:分钟
Calendar.SECOND:秒
除了上述7个以外,field参数还可以是Calendar中所有的常量。如 Calendar.DAY_OF_MONTH,Calendar.WEEK_OF_MONTH,DAY_OF_WEEK等。然后这个参数要是和周相关,那后面的value参数就是周为单位(一年中的第几周,一个月中的第几周)。同理,和日相关,后面的value参数就以日位单位(一个月中的第几日,一年中的第几日,一周的第几日),和小时相关,后面的value参数就以小时为单位(一天中的第几小时)。
value 表示要对这个时间(年份或者月份等)设置的数值,类型为整数。

正则表达式

正则表达式(Regular Expression)由字符和符号组成的具有特定意义的公式,用于匹配或减少符合条件的字符串。
正则表达式不属于某一门编程语言,可以在很多种语言中使用,例如Java,Python,JS,MySql
元字符是组成正则表达式的最基本的符号,通常代表一定意义

元字符解释
.匹配任意一个字符
\w匹配一个数字,字母,_或汉字 \W:对\w取反
\d匹配一个数字 \D:对\d取反
\s匹配一个空白字符 \S:对\s取反
\b匹配以什么字符开头
^以指定的字符串开头,用于正则开始的标志位
$以指定的字符串结尾,用于正则结束的标志位

重复限定符,正则表达式中用于匹配重复次数的符号

重复限定符意义
*匹配前一个字符0次或多次
匹配前一个字符0次或1次
+匹配前一个字符1次或多次
{n}匹配前一个字符n次
{n,}匹配前一个字符至少n次
{n,m}匹配前一个字符n到m次(包含n次,m次)

如果要匹配的字符串中本身就包含小括号,那是不是冲突?应该怎么办?
针对这种情况,正则提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,做法很简 答,就是在要转义的字符前面加个斜杠,也就是\即可。 如:要匹配以(ab)开头
或条件
手机号匹配,我们都知道:国内号码都来自三大网,它们都有属于自己的号段,比如联通有130/131/132/155/156/185/186/145/176等号段,假如让我们匹配一个联通的号码,那按照我们目前所学到的正 则,应该无从下手的,因为这里包含了一些并列的条件,也就是“或”,那么在正则中是如何表示“或”的呢? 正则用符号 | 来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成 功。
那么我们就可以用或条件来处理这个问题

// 创建匹配格式的编译器
        String phone ="13388880000";
        Pattern pattern = Pattern.compile("1[356789][0-9]{9}");
        //  根据编译器获取匹配器
        Matcher matcher = pattern.matcher(phone);
        System.out.println("是否匹配目标字符串:"+matcher.matches());

        // 或者简写  匹配年龄 (0-100   01-09 | 10-99 |100)
       boolean flag =  Pattern.matches
               ("(0?[0-9])|([1-9][0-9])|(100)","10");

        System.out.println(flag);

        // 匹配一个特殊字符
        // 匹配一个字符串中是否包含 .
        String s2 ="adb";
        System.out.println(s2.matches(".*b.*"));
        // 因为.表示的所有字符  当匹配.时,需要转义
        System.out.println(s2.matches(".*\\..*"));

        // 对于特殊符号 需要转义   \\
        // 匹配邮箱   包含  任意字符任意个数@域名.com
        //    .cn  .com.cn  .gov  .net
        String email="1@softeem.com";
        System.out.println(email.matches("\\w+@\\w+(\\.[a-z]{2,3}){1,2}"));

        // 匹配一级网址 http://    https://d
        String url="http://www.baidu.com";
        System.out.println(url.matches("https?://www\\.\\w+\\.[a-z]{2,3}"));


        // 匹配生日格式   1900-13-01  ~ 2099-12-31   01  -31
        String birthday="1998-13-10"; // yyyy-MM-dd
        String regexp="((19)|(20))[0-9]{2}-((0[0-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))";
        System.out.println(birthday.matches(regexp)); 

Java 中常用的集合类

在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。
一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。
集合是java中存放对象的容器,存放于java.util包中。下图是java集合类的继承与实现关系:
在这里插入图片描述
集合中重要类的接口介绍:
1、List(有序、可重复)

List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

List是列表类型,以线性方式存储对象,自身的方法都与索引有关,个别常用方法如下。
在这里插入图片描述
2、Set(无序、不能重复)

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

Set接口常用方法如下
在这里插入图片描述
集合现在所学不多,后期还需要更多的学习掌握更多的知识,去充实自己。对于以前所学的知识也要温故而知新。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值