目录
一 类包
String类:
不可变字符串.
不适合频繁修改的字符串,因为它会不断创建新的对象,占用内存。但是因为它底层是数组,所以查询方便。
StringBuffer类:
线程安全。
可变字符串。
它是默认构造一个容量为16个字符的缓冲区,所以它在同一个StringBuffer中进行字符串的修改并不会创建一个新的对象,而是同一个对象指向缓冲区,只对缓冲区的内容进行修改,所以它是可变的。因此适合那些需要频繁修改的字符串。
StringBuilder类:
线程不安全(方法没有线程锁修饰)。
剩下和StringBuffer一样。
math类:
包含基本算数运算方法
final修饰,不能被继承。
static修饰的静态方法,可以直接类名调用
Math.round(x) //对x进行四舍五入运算
包装类:
*类型转换:
int value ;
1.int-->Integer: Integer val = new Integer(value) ;
2.Integer-->String: String str = val.toString();
2.int-->String: String str = value.toString();
BigDecimal类:
解决小数点误差问题.
Date日期类:
二 集合
List集合:
变量:保存单个数据。
数组:保存多个数据(基本类型+对象类型)
优点: 便于查询。
缺点:由于数组的长度不可变,无法往数组去动态添加或者删除数据。
集合: 保存多个对象数据。
List集合:有序集合,允许有重复元素。
ArrayList:
动态数组(即长度可变的数组)。它的底层是一个数组,但数组长度不是不可变的吗?
它一开始创建一个数组,当初始数组满了之后,它会创建一个新的长度更长的数组(一般是初始数组长度的倍数),后把初始数组的值全部复制过去,再让对象指向新的数组,这样就有空间新增元素了。删除也是同理,后面数据往前移,当数据个数是初始数据的倍数时,会重新创建一个新的小数组。
优点: 查找简单
缺点:新增和删除效率低
构造方法:
无参构造:创建一个初始长度默认为10的数组;
有参构造:创建一个指定初始长度的数组;
方法:
public class Main{
public static void main(String[] args){
List<String> list = new ArrayList<>(); //new一个List类型的集合变量list;
//1:往集合里添加元素:
list.add("java");
list.add("java");
list.add("黄嘉乐");
list.add("符雅珊");
System.out.println(list+"\n"+"=================================");
//2:在某个索引位置插入某元素:
list.add(2,"王浩");//在索引为2的位置,添加一个元素“王浩”
System.out.println(list+"\n"+"=================================");
//3:根据索引删除元素:
list.remove(2); //将索引为2的元素删除;
//list.remove("王浩");---->当然,这样子写也是可以的,结果都一样
System.out.println(list+"\n"+"=================================");
//4:根据索引获取元素:
String s = list.get(3);
System.out.println(s+"\n"+"=================================");
//5:修改索引位置处的元素:
list.set(1,"python");
System.out.println(list+"\n"+"=================================");//6:清除元素
list.clear();
//7.判断集合是否包含指定元素
list.contains("王浩") ;
//8.返回某个元素第一次/最后一次 出现的位置
list.indexOf("王浩") ;
list.lastIndexOf("王浩");
//输出结果:
/**
[java, java, 黄嘉乐, 符雅珊]
=================================
[java, java, 王浩, 黄嘉乐, 符雅珊]
=================================
[java, java, 黄嘉乐, 符雅珊]
=================================
符雅珊
=================================
[java, python, 黄嘉乐, 符雅珊]
=================================
*///=====================================================
//另外遍历方式也都可以用上一次讲的collection集合的通用遍历方式来遍历,只不过List可以用索引来遍历
}
}
linkedList :
底层结构时双链表结构。
优缺点: 添加和删除效率高,查询效率低.
Vector:
相当于线程安全的ArrayList集合.
Set集合:
无序而且不可重复
Set集合汇总:
/**
* Set系列集合特点:
* 无序:存取顺序不一致
* 不重复:可以去除重复
* 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
* ====================================================
* Set集合实现类特点:
* HashSet:无序,不重复,无索引
* LinkedHashSet:有序,不重复,无索引
* TreeSet:排序,不重复,无索引
* ====================================================
* Set集合是Collection集合的另一个分支
*/import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class Main{
public static void main(String[] args){
//Set集合的特点:HashSet,LinkedHashSet,TreeSet;
Set<String> sets = new HashSet<>(); //用多态的思想实现HashSet(因为他们都同属于Set的一个分支)
//添加元素
sets.add("java");
sets.add("java");
sets.add("MySQL");
sets.add("MySQL");
sets.add("spring");
sets.add("spring");
System.out.println(sets); //集合都是打印内容,数组才是打印地址
/**
* 打印内容如下:
* [spring, java, MySQL]
* 由此可见,HashSet是无序,不重复,无索引的(不过它的无序只是第一次打印是无序的,以后打印的顺序都是和上面一样的)
*
* ==========================================================
*
* 因为使用了多态的思想,所以我想要测其它的集合类,只需要将上面的HashSet进行替换即可,所以这里就不重新写了,直接输出打印结果
*
* ==========================================================
* LinkedHashSet类:[java, MySQL, spring]
* 由上可知,LinkedHashSet类是有序,不重复,无索引
*
* ======================================================
* TreeSet类:[MySQL, java, spring]
* 由上可知,TreeSet是有序(这里是按照单词首字母的顺序进行排序的),不重复,无索引
*/
//========================HashSet的底层原理是哈希表=========================================
}
}
HashSet:
底层哈希表
jdk1.8之前:数组+链表
jdk1.8之后:数组+链表+红黑二叉树
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class Main{
public static void main(String[] args){
//========================HashSet的底层原理是哈希表=========================================
/**
* 哈希值是根据对象的地址返回一个int型的值
* 哈希值可以用Object类中的hashCode获取;
*/
//获取对象的哈希值
String name = "黄嘉乐";
System.out.println(name.hashCode());
name = "hjl";
System.out.println(name.hashCode()); //同一个对象,内容改变,哈希值也会改变
//===================HashSet无序底层原理(结合哈希表)=================
/**
* 首先,底层会给你一个长度为16的数组,然后使用哈希算法求出每个元素应该放进哪个位置;
*
* 具体算法就是:它会用你存入的元素的哈希值来除以16然后取余,这样就一定会的到一个1~15的数,得到哪个数就把你这个元素
* 存入对应的数组索引的位置上(这就是为什么HashSet集合无序的原因,因为这个余数是随机的),
* 那么有一种情况就是,当两个元素获得的索引相同时,它首先会判断你存入的元素是否相同,
* 如果相同就不存入,(这就是为什么HashSet集合无重复的原因),如果不相同的话就把原先存在这个位置的元素
* 往下移(相当于给它新盖了一个房子),然后把新的这个元素存入这个位置,并且通过链表,新的元素将旧的元素
* 给它连接起来(这就是哈希表为什么用于增删改查性能很好的原因)
*
* 这里我们就会想一个问题,如果很多个元素同连接在同一个位置上,那么哈希表是不是很像二叉树结构,那么它也就照样
* 存在一个分支过长的缺点,所以JDK1.8后,就增加了红黑树,如果分支达到8就用红黑树进行平衡(这里的红黑树
* 是根据每个元素的哈希值大小来进行左右排序的),将分支改成红黑树后,查询性能再次提高。
*
*/
}
}