Set和String
1. Set接口
1.1 Set接口特征和概述
Set接口
无序,不可重复
无序:
添加顺序和存储顺序不一致!!!【原则问题】
不可重复:
在Set集合中元素不可重复。
interface Set<E>
--| HashSet<E> 和哈希表有关,也就和hashCode有关
--| TreeSet<E> 底层存储数据的结构是一个平衡二叉树
1.2 HashSet存储过程
1.2.1 哈希表结构
哈希表结构
这里可以看做是一个Excel表格,在Excel表格中,每一个单元格都有唯一标识
N11
并且在实际使用Excel表格过程中,我们希望每一个单元格中的数据是唯一的!!!
哈希表结构
存储元素过程中需要提供对应元素的哈希值(hashCode方法获取),借助于哈希值来计算得到当前元素应该存储在当前哈希表中哪一个位置。
哈希值计算存储位置 ==> 【大量的移位运算】
1.2.2 存储过程
添加元素
1. 调用添加元素的hashCode方法,获取哈希值,计算在哈希表中的存储位置
2. 如果当前存储位置中,存在其他元素,会执行equals方法进行比较操作,比较结果为true,后期无法添加,这里不希望出现比较结果为false的情况,
1.3 TreeSet存储过程
1.3.1 树形结构
image.png
1.3.2 TreeSet存储数据
目前添加自定义Person类对象, 无法保存到TreeSet集合中
因为当前Person类没有【比较方式】
1.3.3 给自定义类添加比较方式【重点】
1. 自定义类遵从Comparable<T>接口, 实现compareTo方法。
interface Comparable<T> {
// 0 标示两个元素一致
// 大于零或者小于零,两者不一致,如果需要完成排序算法,可以尝试使用。
int compareTo(T t);
}
2. 提供自定义比较器作为TreeSet构造方法参数,需要完成compare方法
TreeSet(Comparator<T> compare);
interface Comparator<T> {
// 0 标示两个元素一致
// 大于零或者小于零,两者不一致,如果需要完成排序算法,可以尝试使用。
int compare(T o1, T o2);
// boolean compare(Worker w1, Worker w2);
}
2. String类 字符串【重点】
2.1 字符串比较和存储问题
package com.qfedu.b_string;
public class Demo1 {
public static void main(String[] args) {
String str1 = "大哥没有男朋友";
String str2 = "大哥没有男朋友";
String str3 = new String("大哥没有男朋友");
String str4 = new String(str1);
/*
* == 如果两边判断的是一个引用数据类型变量,那么这里判断的是引用数据类型变量中
* 保存的空间首地址
*/
System.out.println("str1 == str2 : " + (str1 == str2)); // true false
System.out.println("str2 == str3 : " + (str2 == str3)); // false
System.out.println("str3 == str4 : " + (str3 == str4)); // false
System.out.println("str4 == str1 : " + (str4 == str1)); // false true
System.out.println();
/*
* 【墙裂要求】
* 字符串比较必须使用equals方法!!!
*/
System.out.println("str1.equals(str2) : " + str1.equals(str2));
System.out.println("str2.equals(str3) : " + str2.equals(str3));
System.out.println("str3.equals(str4) : " + str3.equals(str4));
System.out.println("str4.equals(str1) : " + str4.equals(str1));
}
}
image.png
2.2 获取方法
int length();
获取字符串有效字符个数,字符串长度。
int indexOf(String str);
int indexOf(char ch);
int indexOf(String str, int fromIndex);
int indexOf(char ch, int fromIndex);
indexOf方法支持多种参数,可以是String字符串,char类型字符并且可以限制从指定下标开始进行查询操作,找到返回对应下标位置,未找到返回负数
int lastIndexOf(String str);
int lastIndexOf(char ch);
int lastIndexOf(String str, int fromIndex);
int lastIndexOf(char ch, int fromIndex);
lastIndexOf找出指定内容在字符串中最后一次出现的位置,可以支持字符和字符串类型,并且可以从指定下标开始。【指定下标方法有坑,可以不记,但是不能不抄】
char charAt(int index);
获取当前字符串中指定下标位置的字符。
char[] toCharArray();
返回值字符串所有内容的字符数组
String substring(int fromIndex);
从指定位置开始,到字符串末尾,截取子字符串
String substring(int fromIndex, int toIndex);
从指定位置开始,到指定位置结束,获取子字符串 (fromIndex <= n < toIndex)
2.3 判断方法
boolean endsWith(String str);
判断当前字符串是不是已指定字符串结尾
boolean startsWith(String str);
判断当前字符串是不是已指定字符串开头
boolean equals(Object obj);
判断两个字符串是不是相同字符串,判断的是字符串内容
boolean equalsIgnoreCase(String str);
忽略大小写判断两个字符串是否一致
boolean isEmpty();
是否是空字符串 JDK1.6方法
"" 空字符串
null 内存中编号为0x0内存空间地址,不可读,不可写,不可调用方法。
boolean contains(String str);
判断参数字符串是不是当前字符的一个子字符串。
2.4 整合方法
构造方法
String(char[] arr);
将一个字符数组中的所有内容转换成一个字符串
String(char[] arr, int offset, int length);
将一个字符数组中的数据,从指定下标offset位置开始,获取length长度,做成
字符串
例如:
char[] arr = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
String str = new String(arr, 2, 2);
str ==> "CD";
静态成员方法
static String valueOf(char[] arr);
static String valueOf(char[] arr, int offset, int length);
静态成员方法,通过String类直接调用,实际底层代码执行内容还是对应的构造方
法。
解释同上
2.5 转换方法
String[] split(String str);
调用当前方法的字符串,按照指定字符串要求进行切割操作,返回值类型是String类型
数组
例如:
String str = "路见不平一声吼,大哥没有男朋友,两只黄鹂鸣翠柳,大哥是个单身狗";
String[] strArr = str.split(",");
strArr ==> {"路见不平一声吼","大哥没有男朋友","两只黄鹂鸣翠柳","大哥是个单身狗"};
String toUpperCase();
所有字符内容小写英文字母转大写
String toLowerCase();
所有字符内容大写英文字母转小写
String trim();
去除字符串两边无用空格
String replace(char oldChar, char newChar);
使用新字符替换整个字符串中所有老字符
2.6 面试题
package com.qfedu.b_string;
public class Demo6 {
public static void main(String[] args) {
/*
* 1. 双引号包含的字符串内容,都是字符串常量!!!
* 2. 字符串使用+号生成新字符串,这里会出现新的字符串常量!!!
*
* 当前代码中共计 14个字符串常量
*
* 字符串常量不可以改变,如果按照+方法操作字符串拼接,会导致大量的数据类型
*
*/
String str = "红烧肉";
str += "烤羊肉串";
str += "烤韭菜";
str += "鲫鱼汤";
str += "砂锅面";
str += "热干面";
str += "蒜蓉油麦菜";
System.out.println("请问,这里有多少个字符串???");
/*
* 1
* 13
* 8
* 15
* 7
* 2
* 14 bingo
*/
}
}
3. Java文件和.class字节码文件
3.1 Java文件
Java文件中包含所有的当前Java程序所需的内容。
一般情况下 一个Java文件 ==> 对应一个类
类
成员变量
成员方法
构造方法
3.2 .class文件
.class文件 或者称之为 字节码文件
.class文件是通过Java编译器 编译Java文件得到的。
Java文件中包含所有的程序内容(类 成员变量,成员方法,构造方法)
Java文件 ==> Javac ==> .class文件
.class文件中包含所有的程序的内容(类 成员变量 成员方法 构造方法)。
.class文件包含Java程序所需的所有内容。
javac Demo1.java ==> Demo1.class
java Demo1 ==> 执行的就是Demo1.class
3.3 Java程序加载过程
1. Java程序加载,加载的内容是.class字节码文件
2. .class文件会被JVM存储内存的【方法区内存空间】。该内存空间,只读不可写可执行
image.png
网友评论