JavaSE基础知识之常用类和集合

常用类

Object类

protected Object clone() throws CloneNotSupportedException

  • 克隆方法:创建并返回此对象的一个副本
  • Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。
  • protected void finalize()throws Throwable(跟垃圾回收器有关系)
  • 垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

Scanner类

文本扫描器:Scanner (java.util.Scanner)

  • 之前的使用:
  • 1)导包
  • 2)创建键盘录入对象:
  • Scanner sc = new Scanner(System.in) ;
    
  • 构造方法:
  •  public Scanner(InputStream source)
    
  • 形式参数:
  • 抽象类:java.io.InputStream:字节输入流(用来读取字节数)
  • 如果方法的形式参数是一个抽象类,那么需要传递该抽象类的子类对象
  • System.in:System:是jdk提供的一类
  • public static final InputStream in:成员变量 :标准输入流
  • public static final PrintStream out:标准输出流

Scanner类中提供了一些判断功能:

  • public boolean hasNextXXX():判断当前是否是执行XXX类型
  •  		int,short,float,double...
    
  • public XXX nextXXX() :接收指定XXX类型
  •  举例:
    
  •  		public boolean	haxNextInt() :判断接收的类型是否是int类型			
    
  •  		public int nextInt()  : 接收指定的int类型的数据
    
  •  		public boolean	haxNextLine():判断接收的数据是否是一个String类型
    
  •  		public String nextLine() : 接收一个String类型
    

Scanenr:键盘录入的细节问题

  • 先录入int类型,在录入String类型 (nextLine())
  • 问题:
  • 当前字符串录入数据:值就被漏掉了,原因就是回车符号(本身字符串)
  • 在下一次录入String类型前,再次创建一个Scanner类型对象

String类

常用类之String

  • String 类代表字符串
  • 字符串是常量;它们的值在创建之后不能更改(常量的地址值)
  • String类是一个特殊的引用类型
  • String类型如果作为参数传递,形式参的改变不会影响实际参数
  • (跟基本类型作为参数的效果一样)
  • null 和 ""的区别: null:对象为空 " ":空字符序列 “” +任何数据

String类的构造方法

  • public String() :无参构造方法:创建一个字符串对象
  • public String(byte[] bytes):使用平台的默认编码集 :将字节数组---->构造出String类型
  • public String(byte[] bytes, int offset, int length):将字节数组的一部分转换成字符串
  • 参数1:传递的实际字节数组对象
  • 参数2:从哪个位置开始
  • 参数3:指定长度
  • public String(char[] value):将字符数组—构造成一个字符串对象
  • public String(char[] value,int offset,int count) :将字符数组一部分转换成字符串
  • 参数1:传递的实际字符数组对象
  • 参数2:从哪个位置开始
  • 参数3:指定长度
  • public String(String original):将一个字符串值存储进来,创建一个字符串对象

String类型的判断功能

  • public boolean equals(Object anObject):比较两个字符串内容是否相同
  • public boolean equalsIgnoreCase(String anotherString):不区分大小写比较
  • public boolean startsWith(String prefix):判断是否以指定的子串开头
  • public boolean endsWith(String suffix):判断是否以指定的子串结尾
  • public boolean isEmpty():判断字符串是否为空

tring类的获取功能:

  • int length():获取字符串长度
  • public char charAt(int index):获取指定索引处的字符
  • public String concat(String str):字符串拼接功能:使用当前字符串和指定str字符串进行拼接
  • public int indexOf(int ch):获取指定字符在此字符串中第一次出现索引值
  • public int indexOf(String str):获取指定字符串在此字符串中第一次出现索引值

String类的分割功能

  • public String[] split(String regex):通过指定的字符串进行分割,返回值字符串数组

String类转换功能:

  • public char[] toCharArray():将字符串转换成字符数组
  • public byte[] getBytes() :将字符串----变成字节数组 (过程:编码)
  • public static String valueOf(XXX xx):可以将任何类型的数据转换成String
  • public String toUpperCase():将此字符串转换成大写
  • public String toLowerCase():将此字符串转换成小写

String类的截取功能

  • public String substring(int beginIndex):从指定位置开始截取,默认截取到末尾
  • public String substring(int beginIndex,int endIndex)
  • 从指定位置开始截取,到指定位置结束,但是包含beginIndex,不包含endIndex索引(包前不包后)

替换功能

  • public String replace(char oldChar,char newChar):将以前的字符用心的字符替换掉
  • public String replace(String oldStr,char newStr):将以前的字符用心的字符替换掉
  • 去除两端空格 public String trim()
  • 按照字段顺序比较! :如何比较的
  • public int compareTo(String anotherString)

StringBuffer类

StringBuffer:线程安全的可变字符序列 ,提供字符串缓冲区

  • 多线程有关系!

  • 进程:—>打开任务管理器,一些客户后台!

  • 线程—相当于开启进程后的某一个任务! 360软件

  • 线程安全 ---->同步的----->执行效率低 !

  • 举例:银行的网站

  • 医院网站…

  • 线程不安全---->不同步的---->执行效率高!

  • 举例:

  • 论坛网站,部分游戏网站…

  • 两个获取功能

  • int length():获取长度(缓冲区中字符数)

  • public int capacity():获取缓冲区的容量大小

  • StringBuffer的构造方法:

  • 1)public StringBuffer():空参构造,初始容量为 16 个字符。(默认的容量足够,不需要指定容量大小)

  • 2)public StringBuffer(String str):构造一个缓冲区,指定字符串内容到缓冲区中,容量大小等于16个+当前字符串的实际长度

  • 3)public StringBuffer(int capacity):指定容量大小,构造一个缓冲区

  • 注意事项:

  • 不能将String类型的值赋值给一个StringBuffer类型

  • StringBuffer sb = “hello” ; //错误的

  • String s = new String(“hello”) ;

  • StringBuffer sb2 = s ; //错误的

StringBuffer的添加功能:

  • public StringBuffer append(任何类型数据…):将任何类型的数据追加到缓冲区中(追加末尾)
  • public StringBuffer insert(int offset,String str/任何类型数据):将某个元素插入到指定位置

StringBuffer的删除功能

  • public StringBuffer deleteCharAt(int index):删除指定位置处的字符,返回缓冲区本身
  • public StringBuffer delete(int start,int end):删除从指定位置到指定位置结束(包前不包后,end-1位置)

关于:反转功能

  • 键盘录入一个数据,将字符串进行反转—(内容还是字符串内容)
  • public StringBuffer reverse():将缓冲区中的字符进行反转!

StringBuffer的其他功能

  • StringBuffer的截取功能
  • public String substring(int start):从指定位置开始截取,默认截取到末尾
  • public String substring(int start, int end):从指定位置开始截取,截取到指定位置结束!

StringBuffer的替换功能

  • public StringBuffer replace(int start,int end, String str)
  • 从指定位置开始到指定位置结束(end-1处)使用str子串进行替换

String <----> StringBuffer类型的相互转换

//String---->StringBuffer
	String s = "world" ;
	//StringBuffer sb = s; //type Mismatch:类型不匹配
	//方式1:通过StringBuffer构造方法:StringBuffer(String str)
	StringBuffer sb = new StringBuffer(s) ;
	System.out.println(sb);
	System.out.println("-------------------------------");
	
	//方式2:StringBuffer()无参构造+append(String str):追加
	StringBuffer sb2 = new StringBuffer() ;
	sb2.append(s) ;
	System.out.println(sb2);	
	System.out.println("-------------------------------");
	
//StringBuffer----->String
	StringBuffer buffer = new StringBuffer("hello") ;
	//方式1
	//public String(StringBuffer buffer):String类型的构造方法
	String str = new String(buffer) ;
	System.out.println(str);
	
	System.out.println("-------------------------------");
	//StringBuffer--->public String toString() 
	String str2 = buffer.toString() ;
	System.out.println(str2);
将数组拼接字符串 "[元素1, 元素2, 元素3, ....]"
//方式1定义一个功能: 将数组拼接成String
	public static String arrayToString(int[] arr) {
		//定义一个结果变量
		String result = "" ;
		//拼接左中括号
		result += "[" ;
		//遍历数组
		for (int i = 0; i < arr.length; i++) {
			if(i==arr.length-1) {
				result += arr[i] ;
				result += "]" ;
			}else {
				result += arr[i] ;
				result += ", " ;
			}
		}
		return result;
	}
	//方式2:使用StringBuffer的append追加
	public static String arrayToString2(int[] arr) {
		//创建一个StringBuffer对象
		StringBuffer sb = new StringBuffer() ;
		sb.append("[") ;
		//遍历数组
		for (int i = 0; i < arr.length; i++) {
			if(i==arr.length-1) {
				sb.append(arr[i]).append("]") ;
			}else {
				sb.append(arr[i]).append(", ") ;
			}
		}
		return sb.toString() ;
	}
字符串内容反转
//方式1
	public static String reverse(String s) {
		//定义一个结果变量
		String result = "" ;
		//将s变量---->变成字符串数组
		char[] chs = s.toCharArray() ;
		for(int x = chs.length-1; x >=0 ; x --) {
			//拼接每一个元素
			result += chs[x] ;
		}
		return result ;
	}
	//方式2:利用StringBuffer的reverse()方法
	public static String reverse2(String s) {
		//一步走
		return new StringBuffer(s).reverse().toString();
	}

StringBuffer,StringBuilder和数组的区别

  • 前两个都是字符串缓冲区,都支持可变的字符序列,有相同的api

  • 前者:它是一个线程安的,-----同步的----->执行效率低(线程安全的类)

  • 后者:它是一个线程不安全的—不同步的---->执行效率高 单线程程序---->考虑效率问题---->后者会将前者替换掉!

  • 多线程程序—>最重要的安全问题---->StringBuffer了 他们和数组: 都容器,都可以存储数据的!

  • 字符串缓冲区:存储数据最终以"字符序列"存储的(StringBuffer/StringBuilder)

     				长度可变,可以不断追加:append(xxx)
     				字符串遍历:length()+charAt(int index) 			数组:只能存储同一种类的元素
     				长度是固定的,(也是数组的弊端)
     				数组的遍历:length属性:获取数组长度
    

StringBuffer和String类型作为形式参数有什么区别:

  • 两个都是引用类型

  • String类作为形式参数,它的效果基本数据类型一样(String是最特殊的引用类型)

  • String是一个常量,一旦被赋值,其值不能被改变

  • StringBuffer/StringBuilder,他们作为形式参数,

  • 形式参数的改变会直接影响实际参数(和其他引用类型效果一样)

Integer类

Integer类:包含了int类型的值

  • public static String toBinaryString(int i):将整数值以"二进制"文本形式体现…

  • public static String toOctalString(int i)

  • public static String toHexString(int i)

  • 成员变量(字段)

  • public static final int MIN_VALUE:最小值

  • public static final int MAX_VALUE:最大值

Integer类的构造方法

  • Integer(int value) :将int类型包装了Integer类型

  • Integer(String s) :将字符串内容包装Integer类型

  • 注意事项:

  • String是一个数字字符串,否则出现异常!
    Jdk5提供一些特性:自动拆装箱功能,后面: 静态导入(导入到方法的级别:前提方式静态的),可变参数(public static 返回值类型 方法名(int …))

  • 增强for循环(集合),泛型:类名/接口名<引用类型>
  • 举例:
  • 基本类型----引用类型: 自动装箱 int---->Integer
  • 引用类型—基本数据类型 : 自动拆箱 :Integer --int
  • String----->int :Inerget.parseInt(String str)
  • String----->long :Long.parseLong(String str)
  • String----->double:Double.parseDouble(String str)
  • int------>String: Integer.toString(int i)

Character类

Character:char类型的包装类类型,包含一个char类型的值

  • 构造方法

  • public Character(char value)

  • 判断功能:

  • public static boolean isDigit(char ch):判断当前字符是否是数字字符

  • public static boolean isLowerCase(char ch):判断当前字符是否是小写字母字符

  • public static boolean isUpperCase(char ch):判断当前字符是否是大写字母字符

java.util.Calendar类:日历类

  • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,
  • 并为操作日历字段(例如获得下星期的日期)提供了一些方法
  • Calendar不能直接实例化!
  • 某一个类如果不能直接实例化:
  • 首先里面会存在一些静态功能,静态功能的返回值就是该类本身!
  • public static Calendar getInstance()
  • public int get(int field):获取的日历字段的值!
  • 参数:传递日历字段

Calendar的成员方法:

  • 给日历字段添加或者减去时间偏移量
  • public abstract void add(int field,int amount)
  • 日历对象.add(Calendar.DATE,-5):当前日历时间的5天前
  • 设置当前年月日,日历时间
  • public final void set(int year,int month, int date)

Date类

java.util.Date类

  • 特定的瞬间,精确到毫秒。
  • 构造方法:
  •  public Date() 无参构造
    
  • 成员方法:
  •  public long getTime() :返回1970 年 1 月 1 日所表示的时间毫秒	
    

java.util.Date 应用场景 String:文本格式 和Date格式的相互转换
关于

  • String文本格式 和Date日期格式相互转换
    Date---------------->String 日期文本格式 "格式化"操作
  • java.text.DateFormat:可以将日期和文本相互转换
  • DateFormat继承自Format类:都是抽象类,不能直接实例化!,提供更具体的子类
  •  java.text.SimpleDateFormat extends DateFormat
    
  • 它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)
  • SimpleDateFormat的构造方法
  •  public SimpleDateFormat(String pattern):
    
  • 创建一个SimpleDateFormat对象
  •  参数:指定一个模式 要遵循一定的规则(jdk对它规定了)
    
        y年	------2020		"yyyy"
     	M年中月份----10/03   "MM"
 		d月中的天数----05/21  'dd'
		h:表示上午/下午的小时数  hh
 		H:一天中的小时数		  HH
 		m:分钟数				  mm
 		s:秒数				  ss

模式

  • “yyyy-MM-dd HH:mm:ss”
  • “yyyy年MM月dd日 HH时mm分ss秒”
  • Date---->String
  • 格式化的步骤:
  • 1)存在Date对象
  • 2)创建SimpleDateFormat(String pattern)
  • 3)public final String format(Date date):格式化方法

解析
String----->Date

  • 步骤:
   1)存在String  "日期文本"   "2020-10-21"
    2)创建SimpleDateFormat(String pattern)
    3)public Date parse(String source)  throws ParseException
  • 解析:
  • SimpleDateFormat中的参数模式:必须和String 日期文本格式一致,否则出现解析异常(ParseException)
    例如:定义一个工具类
 /**
	 * 这个方法是将Date日期格式转换成日期文本格式
	 * @param date  当前日期对象
	 * @param pattern 指定模式 yyyy-MM-dd(年月日)
	 * @return 返回的结果表示是当前日期文本
	 */
	public static String date2String(Date date,String pattern) {
		//分步走
		//创建SipleDateFormat对象
		/*
		SimpleDateFormat sdf = new SimpleDateFormat(pattern) ;
		//格式化
		String dateStr = sdf.format(date) ;
		return dateStr ;
		*/
		return new SimpleDateFormat(pattern).format(date) ;
	}
	
	/**
	 * 这个方法是将日期文本转换成日期格式
	 * @param source  已知存在的日期文本
	 * @param pattern  指定模式 yyyy-MM-dd(年月日)
	 * @return 返回的结果是日期格式Date
	 * @throws ParseException 
	 */
	public static Date string2Date(String source,String pattern) 
			throws ParseException {
		//创建SimpleDateFormat对象
		/*
		SimpleDateFormat sdf = new SimpleDateFormat(pattern) ;
		Date date = sdf.parse(source) ;
		return date ;
		*/
		return new SimpleDateFormat(pattern).parse(source) ;
	}
测试:
public static void main(String[] args) throws ParseException {
		
		//Date--->String  格式化操作
		Date date = new Date() ;
		String dateStr = DateUtils.date2String(date, "yyyy"
				+ "-MM-dd") ;
		System.out.println(dateStr);
		System.out.println("---------------------------------");
		String dateStr2 = DateUtils.date2String(date, "yyyy-MM-dd HH:mm:ss") ;
		System.out.println(dateStr2);//2020-10-21 14:28:32
		
		System.out.println("---------------------------------");
		//String---->Date:解析操作
		String s = "2008-5-12 14:28:00" ;
		Date d = DateUtils.string2Date(s, "yyyy-MM-dd HH:mm:ss"); //模式必须和String文本格式一致
		System.out.println(d);//Mon May 12 14:28:00 CST 2008
	}

BigDecimal类

java.math.BigDecimal

  • 描述:对浮点类型的数据进行精确计算的!

  • 构造方法:

  • public BigDecimal(String val) :字符串"数字字符串"

  •  		"1.0"
    
  •  		"0.01.."
    
  • 成员方法:

  •  public BigDecimal add(BigDecimal augend) :求和
    
  •  public BigDecimal subtract(BigDecimal subtrahend):减法
    
  •  public BigDecimal multiply(BigDecimal multiplicand):乘法
    
  •  public BigDecimal divide(BigDecimal divisor)
    

Math类

java.lang.Math:

  • Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
  • public static double abs(double a/…):求某个数据的绝对值
  • public static double ceil(double a):向上取整
  • public static double floor(double a):向下取整
  • public static int min(int a, int b):求两个int数据的最小值
  • public static int max(int a,int b):求两个int数据的最大值
  • public static double random():随机数[0.0,1.0) ---------> Java提供随机数生成器:Random类 nextInt(int n)
  • public static int round(float a):四舍五入…
  • public static long round(double a)
  • public static double sqrt(double a):开根(一个正整数的平方根) 4—2
  • public static double pow(double a,double b):返回结果:a的b次幂
    动态导入:
  • import 包名.类名;
  • import java.util.Date/Scanner/List/ArrayList…

静态导入的格式:

  • import static 包名.类名.方法名;

  • 前提这些方法是静态 的

  • 使用静态导入的注意事项:

  •  如果当前类中出现了和导入的静态方法名一样,冲突了,在使用静态导入的这个的方法的时候
    
  • 就必须带上限定(包名.类名)

  例如:
             System.out.println(java.lang.Math.abs(-100));

Object array

对象数组

  • 能够存储对象的数组

使用数组存储引用数据类型是可以实现的,但是它不满足长度可变的需求,Java提供了 —“集合”,支持长度可变的

  • 集合特点:只能存储引用数据类型!

Random类

java.util.Random:随机数生成器

构造方法

  • public Random() :(推荐),产生的随机数是变化的
  • public Random(long seed):每次产生的随机数 是固定的!

成员方法:

  • public int nextInt():获取的是int范围内的随机数
  • public int nextInt(int n):获取0到n之间的随机数[0,n)

获取随机数两种方式:

  • Math类的random()方法: 返回值double类型
  • Random类空参构造+nextInt(int n):获取随机数

System类

System 类包含一些有用的类字段和方法。它不能被实例化。
字段:

  • public static final InputStream in :标准的"输入流"
  • public static final PrintStream out :标准的"输出流"
    键盘录入:
  •  	Scanner(InputStream in) ---->Scanner(System.in)
    

输出语句:

  •  System.out.println("xxx")----->System.out--->PrintStream ps (字节打印流)
    
  •  				ps.println("x") : 字节打印流调用方法名println(String str)
    

成员方法:

  •  public static void gc() 运行垃圾回收器(手动开启)
    
  • 实际开发中,开发者不需要开启
  • 运行垃圾回收器,它会调用Obejct类finalize(),回收没有更多引用的对象
  •  public static void exit(int status):参数状态为0:表示正常终止jvm
    
  •  public static long currentTimeMillis():获取当前系统时间的毫秒值
    
public static void arraycopy(Object src, int srcPos, Object dest,  int destPos, int length)		

 * 		从原数组中的指定位置开始进行复制指定length长度复制到目标数组中的某个位置
 * 		参数1:指定源数组
 * 		参数2:源数组中的某个位置
 * 		参数3:目标数组对象
 * 		参数4:目标数组对象中的某个位置
 * 		参数5:指定几个元素复制(长度)

集合

Collection集合

Collection中的高级功能:

  • boolean addAll(Collection c):添加一个集合中的所有元素

  • boolean removeAll(Collection c):只要集合中有一个元素被包含,将这个元素从c1删除掉,则返回true!

  • boolean containsAll(Collection c):包含所有元素才算包含,返回true

  • public boolean retainAll(Collection c) 取交集:boolean的真实含义是什么:
    c1.retainlAll(c2):c1集合的元素是否发生变化!A集合对B集合取交集,将交集的元素保存到A集合,boolean表达的是A集合是否发生变化如果A集合没有变化的,返回结果false;如果A集合有变化,则返回true!

  • 集合中Iterator迭代器本质:就是具体的子实现类的内部类间接实现了迭代器!

迭代器的注意事项:

  • 1)Object next()获取当前集合的元素(),不能使用多次,使用一次即可,
  • 获取所有元素信息
  • 2)能使用for循环,不推荐(因为以后集合中元素可能不知道个数,使用while循环)
    泛型
格式
 			<数据类型:引用数据类型>

集合为了迎合数组的特点,在创建数组的时候,将类型定义了,来保证集合中的元素类型一致的!
泛型的特点:
将集合的类型在创建的时候创建的时候就明确,保证集合操作的安全性!
好处:
1)避免了强制类型转换
2)将运行时期异常提前到了编译时期
3)解决了黄色警告线问题
4)提高了程序的安全性!
泛型可以应用在哪些地方

  • 泛型在集合中使用居多,可以定义类上,可以放在方法上,也可以放在接口上!
  • 没有加入泛型之前,程序存在安全隐患,出现类型不匹配:ClassCastException:属于运行时期异常!

泛型的高级通配符

  • <?> 当前Object类型/任意Java类型(自定义/jdk提供...)
  • <? extends E>:向下限定:E类型以及它的子类
  • <? super E>:向上限定:E类型以及它的父类

List集合

List集合 extends Collection

  • 有序的集合,可以允许元素重复!

  • 有序性:存储和取出一致

  • 使用List集合存储字符串并遍历

  • 使用List集合存储自定义对象并遍历(自己完成!)

  • 两种方式:

  •  1)Object[] toArray()
    
  •  2)Collection集合的Iterator
    

List集合的特有功能:
添加功能

  •  void add(int index,Object element):在指定位置处添加一个新的元素
    

删除功能

  • Object remove(int index):删除角标对应的元素

获取功能

  •  	Object get(int index) :获取指定位置处的元素
    
  •  	int size():获取集合的元素数 
    
  •      Object set(int index,Object element):在指定位置处使用当前元素element元素替换 		
    

ListIterator listIterator():List集合的专有遍历方式 :列表迭代器
ListIterator:列表迭代器

  • ListIterator listIterator()这个方法底层实现:是通过ArrayList里面的成员内部类
  •  		 ListItr extends Itr :实现的
    

正向遍历

  • boolean hasNext():判断是否有下一个元素
  • Object next() :获取下一个元素

逆向遍历

  • boolean hasPrevious():判断是否有上一个元素
  • Object previous():获取前一个元素

List集合的遍历方式:

  •  1)Collection集合的方法 Object[] toArray
    
  •  2)Collection集合的迭代器Iterator iterator() 
    
  •  3)size()+Object get(int index):普通for循环
    
  •  4)列表迭代器:ListIteraotr listiterator()
    
  •  5)增强for循环
    

List三个子实现类的特点:

	ArrayList	
			底层数据结构是可变数组结构: 查询快,增删慢
			
ArrayList底层可变数组: 
					ArrayList(int initialCapacity) :通过初始化容量构造ArrayList集合
					默认容量大小:capacity:10ArrayList()---->通过初试容量大小判断是否构造一个新Object[] 数组对象
					结论:它的扩容机制 ---1.5倍扩容
			线程角度:
					线程不安全的类----不同步的----执行效率高!	
					单线程程序中,通常没有告诉使用什么集合的时候,优先采用的是ArrayList集合!	
		
Vector :底层数据数组结构(对象数组)
				查询快,增删慢
			线程角度:
					线程安全的类 ---->同步的----->执行效率低
					多线程程序中要考虑安全问题,使用Vector
		LinkedList:
				底层数据结构:链接列表实现(链表)
				
线程角度:
				线程不安全-----不同步---->执行效率高
				特有功能:
							可以模拟栈结构的:先进后出!
		线程安全的类
				StringBuffer/Vector

Set集合

Set集合的特点:

  • 元素是不重复的,无序的!(存储和取出不一致,取决于底层HashMap实例)
  • 子实现类
  •  HashSet
    
  •  TreeSet
    

使用HashSet集合存储自定义对象并遍历

  • Student的姓名和年龄如果相同,认为同一个人;发现问题:HashSet集合没有去重

  • 底层依赖于HashCode和equals()方法

  • 可能出现一种情况:

  •  	成员信息不同,但是hash码值一样
    
  •  	比较每一个成员信息的内容是否相同:name  (String)
    
  • 使用HashSet:底层hash表结构 来保证元素的唯一性!

  • 存储自定义对象,必须重写hashcode()和equals()

  • TreeSet集合(重点:排序条件!)

  •  	排序
    
  • 底层是一种红黑树结构(TreeMap):“自平衡的二叉树”

  • Map集合:

  • 如何遍历Map集合

  •  HashMap
    
  •  TreeMap
    

ArrayList类

ArrayList集合实现了List接口!

  • 可以存储重复元素,存储和取出一致(有序的)!

  • ArrayList:单线程程序中考虑执行效率,优先采用!

  • 应用场景:

  •  网络聊天室  查看在线好友列表
    
  •  		   张三  (客户端 Socket)   ArrayList<Socket>
    
  •  		   李四
    
  •  		   王五
    

在一些嵌套中使用

  •  HashMap<String,ArrayList<String>>  :Map集合嵌套ArrayList   
    
  •  ArrayList<ArrayList<Student>> :ArrayList嵌套ArrayList
    

Vector集合

Vector集合:

  • 底层数组结构:查询快,增删慢

  • 线程安全的---->同步的---->执行效率低!

  • public boolean add(Object e):传统添加元素的方法
    特有功能:

  •  public void add(int index, E element):插入元素
    
  •  public Enumeration<Object> elements()		--- 相当于:Iterator iterator()
    
  •  		该接口有两个方法
    
  •  		boolean hasMoreElements():判断是否有下一个元素-----> 相当于:boolean hasNext()
    
  •  		Object nextElement():获取一个元素                          -----> 相当于:next()
    
  •  public Object elementAt(int index):通过角标获取指定的元素---->
    
  •                                                    相当于:Object get(int index)
    
  •  elementAt()+size() :vector的普通for遍历方式
    
  •   Enumeration和Iterator功能是重复的
    

场景:

  •  IO流:合并流 SequenceInputStream 可以将多个文件内容读出来复制到指定文件中!
    
  •  			操作的输入流!
    

LinkedList集合

LinkedList集合的特点:

  •  底层数据结构是链接列表,查询慢,增删快
    
  •  线程不安全的---不同的---->执行效率高!
    

应用场景:

  •  网站中	记录用户浏览过商品足迹  (Web技术:Cookie/Session)
    

特有功能
添加

  •  public void addFirst(Object e):将该元素添加到列表的开头!
    
  •  public void addLast(Object e):将该元素添加到列表的末尾!
    

删除

  •  public Object removeFirst():删除列表第一个
    
  •  public Object removeLast():删除列表最后一个
    

获取

  •  public Object getFirst():获取第一个
    
  •  public Object getLast() :获取第二个
    

弹栈和压栈

  •  public Object pop():此列表所表示的堆栈处弹出一个元素
    
  •  public void push(Object e):将元素推入此列表所表示的堆栈
    
例子:模拟栈的先进后出:
public class MyStack {
	
	//成员变量位置
	private LinkedList<String> link = null ;
	
	//无参构造方法
	public MyStack() {
		link = new LinkedList<String>() ;
	}
	
	//提供一个add方法,添加元素
	public void add(String obj) {
		//间接通过自定义的功能:使用LinkedList的功能
		link.addFirst(obj);
		//link.addFirst("hello") ;----"hello"
		//addFirst("world") --->"world","hello"
		//addFirst("java")---->"java","world","hello"
	}
	
	//在通过获取元素
	public String get() {
		//使用LinkedList里面 public Object removeFirst()
		return  link.removeFirst() ;
	}
	
	//判断功能
	public boolean isEmpty() {
		//利用LinkedList 的判断功能
		return link.isEmpty() ; //isEmpty():集合为空,返回值true
	}
	
}

froeach

JDK5之后提供了特性:

  • <引用类型>泛型,静态导入,增强for,可变参数,自动拆装箱

增强for的格式:

  •  for(数据类型 变量名 : 数组对象/集合对象(使用最多)){
    
  •  	输出变量名即可
    
  •  }
    

作用: 是替代迭代器使用,简化遍历集合的书写格式!

注意事项:

  •  1)增强for主要用在集合中,数组一般使用的时候普通for
    
  •  2)前提条件:
    
  •  	要使用增强for循环的话,必须保证该集合不能为null,否则就会出现空指针
    
  •  			NullPointerException 
    
  •  解决方案:
    
  •  		针对该对象非空判断即可!
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值