java入门与学习笔记(不定时更新)

目录

一、Elipse环境

二、输入输出操作

输出

输入

三、数组

数组的定义

Arrays工具类

四、关于类与对象

 抽象类与接口(面试常问)

int 和Integer的区别

五、Math类

六、String

String 构造方法

String 类的方法

String 类型的==和equals()的使用

七、容器 

Collection和Collections有什么区别?

collection接口

collections中的常见方法

List

ArrayList

 Vector

queue

PriorityQueue

set

HashSet

Map

HashMap


一、Elipse环境

参考链接:Eclipse简明使用教程(java集成开发环境)_广源的博客-CSDN博客_eclipse使用教程

二、输入输出操作

输出

  • System.out.println和System.out.print的区别:

一个输出要换行(println)。一个不用(print)。 

不带参数的println只打印一个空白行,

【我的理解:System.out.println();就相当于c++中的cout << endl;】

例如:

... ...        
System.out.println();
System.out.print("1");
System.out.println();
System.out.println();
System.out.print("2");
System.out.println("3");
System.out.println();
System.out.println("4");
''' '''

 结果:

输入

  • 从键盘扫描输入的值:

1、找到有扫描仪的商店,语法:import java.util.Scanner;写在public class的前面

(作用:用来构建Scanner对象;(没有这句话的话当你使用Scanner时会报错))
2、购买一台新的扫描仪,给它取一个名字
语法:Scanner input = new Scanner(System.in);
3、使用扫描仪的扫描功能
如果扫描整数:使用input.nextInt();
如果扫描小数:使用input.nextDouble();
如果扫描字符串:使用input.next();
【参考链接:https://blog.csdn.net/weixin_44490662/article/details/103005559】

三、数组

数组的定义

String[] pets = {"Penny", "Petty","Micky"};
int length = pets.length; //获取数组长度
  • 对数组进行操作:

    int[] f = new int[10];
    Arrays.fill(f, 1); //用1填充整个数组f

Arrays工具类

Arrays 工具类_一个程序员的成长之路。。。-CSDN博客_arrays工具类

Arrays——jdk提供的一个专门用来操作数组的工具类。

Arrays工具类提供了大量的静态方法。

常用方法:

public static List asList(T...a) -----返回由指定数组支持的固定大小的列表
public static String toString(int[] a) -----返回指定数组的内容的字符串表示形式
public static void sort(int[] a) ----------按照数字顺序排序指定的数组
public static int[] binarySearch(Object[] a, Object key)
public static int[] copyOfRange(int[] original, int from, int to) 将指定数组的指定范围赋值到新的数组中 
public static void fill(Object[] a, Object val)

asList :

int n = 10; String[] name = new String[n]; 
for(int i = 0; i< n; i++){ 
    name[i] = String.valueOf(i); 
}
List<String> list = Arrays.asList(name); //String[]数组转List

copyOfRange:

copyOfRange(int[] original, int from, int to)方法参数说明如下:

  • 参数 original 表示被复制的数组
  • 参数 from 表示被复制元素的初始索引(包括)
  • 参数 to 表示被复制元素的最后索引(不包括)
int[] arr = {9, 8, 3, 5, 2}; //初始化一个数组 
int[] copied = Arrays.copyOfRange(arr, 1, 3);

数组排序:Arrays.sort()

参考链接:java中的数组排序_运气可以啊的博客-CSDN博客 

java中关于Arrays.sort()的三种用法_粘衣_乱飞的博客-CSDN博客_arrays.sort()怎么用  

1、Arrays.sort(int[] a)

这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序

 2、Arrays.sort(int[] a, int fromIndex, int toIndex)

这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序

3、public static <T> void sort(T[] a,int fromIndex, int toIndex,  Comparator<? super T> c)

Arrays.sort(a, new Comparator<int[]>() {
            public int compare(int[] a1, int[] a2) {
                return a1[0] - a2[0];
            }
        });

//上面代码中 a的类型是int[][] 

Arrays.sort()也可以用在其他的数据类型的排序上。

力扣实例:

剑指 Offer 45. 把数组排成最小的数

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入:[10,2]
输出: "102"

示例 2:

输入:[3,30,34,5,9]
输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
public String minNumber(int[] nums) {
        String[] arr = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = String.valueOf(nums[i]);
        }
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1 + o2).compareTo(o2 + o1);
            }
        });
        StringBuilder sb = new StringBuilder();
        for (String s : arr) {
            sb.append(s);
        }
        return sb.toString();
    }

 (代码作者:Java攻城狮 - 力扣(LeetCode) (leetcode-cn.com)

四、关于类与对象

 抽象类与接口(面试常问)

参考链接:接口和抽象类,傻傻分不清楚?  

区别:(面试必须要会掌握!)

1)抽象类中的方法可以有方法体,能实现方法具体要实现的功能;接口中的方法不能有方法体。

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的,并且是隐式的,缺省的。(Java中final作用于变量、参数、方法及类该如何处理 )
3)接口中不能含有静态代码块以及静态方法(用static修饰的方法),而抽象类是可以有静态代码块和静态方法的。
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

抽象类:

  • 抽象类体现了数据抽象的思想,是实现多态的一种机制。抽象类定义了一组抽象的方法,至于这组抽象方法的具体表现形式由子类来继承实现。
  • 抽象类就是用来继承的,否则他就没有存在的任何意义。

如:

public abstract class Author {
	void sleep() {
		System.out.println("吃饭睡觉打豆豆");
	}
	abstract void write();
}
public class Wanger extends Author{

	@Override
	void write() {
		// TODO Auto-generated method stub
		System.out.println("沉默王二的作品《Web 全栈开发进阶之路》,读起来轻松惬意");
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Wanger wanger = new Wanger();
		wanger.sleep();
		wanger.write();
	}

}

 结果:

 接口:

  • 接口是一种比抽象类更抽象的“类”。
  • 接口的关键字是interface 声明的,类的关键字是class声明的。
  • 接口只是一种形式,就好像一纸契约,自身不能做任何事情。但知道某个类实现了这个接口,就必须按照这纸契约来办事:接口里提到的方法必须全部实现,少一个都不行(抽象类的子类可以忽视非抽象方法)
     
public interface ContractBeihang {
	void scriptBehang();
}
public class Wanger extends Author implements ContractBeihang{

	@Override
	void write() {
		// TODO Auto-generated method stub
		System.out.println("沉默王二的作品《Web 全栈开发进阶之路》,读起来轻松惬意");
	}

	@Override
	public void scriptBehang() {
		// TODO Auto-generated method stub
		System.out.println("一年内完成书稿啊,不然要交违约金的哦。");
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Wanger wanger = new Wanger();
		wanger.sleep();
		wanger.write();
		wanger.scriptBehang();
	}

}

结果:

  •  一个类只能继承一个父类,但是可以同事实现多个接口。如下:
public interface Contract51 {
	void script51();
}
public class Wanger extends Author implements ContractBeihang, Contract51{

	@Override
	public void script51() {
		// TODO Auto-generated method stub
		System.out.println("王老师,先把 Java 云盘的大纲整理出来。");
	}

	@Override
	void write() {
		// TODO Auto-generated method stub
		System.out.println("沉默王二的作品《Web 全栈开发进阶之路》,读起来轻松惬意");
	}

	@Override
	public void scriptBehang() {
		// TODO Auto-generated method stub
		System.out.println("一年内完成书稿啊,不然要交违约金的哦。");
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Wanger wanger = new Wanger();
		wanger.sleep();
		wanger.write();
		wanger.scriptBehang();
		wanger.script51();
	}

}
  • int 和Integer的区别

参考链接:java int和Integer的区别_ZjfScorpio-CSDN博客  

  1.  Integer是int的包装类,int则是java的一种基本数据类型
  2. Integer变量必须实例化后才能使用,而int变量不需要
  3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
  4. Integer的默认值是null,int的默认值是0

Integer类中四个常用的常量:

Java编程入门与应用 P156——演示Integer类的四个常量_乖珑珑的博客-CSDN博客

  • MAX_VALUE:值为2的31次方-1的常量,它表示int类型能够表示最大值
  • MIN_VALUE:值为-2的31次方的常量,它表示int类型能够表示的最小值
  • SIZE:用来返回以二进制补码形式表示int值的比特位
  • TYPE:表示基本类型int的Class实例

五、Math类

Java中Math函数的使用_xuexiangjys的博客-CSDN博客_java math

算数计算

  • Math.sqrt() 计算平方根
  • Math.cbrt() 计算立方根
  • Math.pow(a, b) 计算a 的b次方
  • Math.max( , ) 计算最大值
  • Math.min( , ) 计算最小值
  • Math.abs() : 取绝对值

进位

  • Math.ceil() 天花板的意思,就是逢余进一
  • Math.floor() 地板的意思, 舍去余数
  • Math.rint() 四舍五入,返回double值。 注意.5的时候会取偶数
  • Math.round() 四舍五入,float时返回int值,double时返回long值。

注意,这里所有的进位的方法都要保证是float或者是double 类型,否则进位方法将毫无意义。

随机数

  • Math.random() 取得一个[0,1)范围内的随机数

其中:

  • 随机数Math.random()

Math.random()会返回介于0到1的数

int rand1 = (int)(Math.random()*length);
  • Math.round()----返回最接近的long值

    • 参考链接:Java中Math.round()_万万没想到鲁大师-CSDN博客  
    • 三个特例:
      1.如果参数为 NaN(无穷与非数值),那么结果为 0。
      2.如果参数为负无穷大或任何小于等于 Long.MIN_VALUE 的值,那么结果等于Long.MIN_VALUE 的值。
      3.如果参数为正无穷大或任何大于等于 Long.MAX_VALUE 的值,那么结果等于Long.MAX_VALUE 的值。

六、String

java中String类的使用详解_六年鹿苑的博客-CSDN博客_java中string

String 构造方法

  • String()
  • String(byte[] bytes)
  • String(byte[] bytes, int offset, int length)
  • String(char[] value)
  • String(char[] value, int offset, int count)
  • String(String original)

String 类的方法

  • int length()
  • String subString(int beginIndex) 返回一个新字符串,它是此字符串的一个子字符串。
  • String subString(int beginIndex, int endIndex)
  • boolean startsWith(String prefix)
  • boolean endsWith(String suffix)
  • boolean contains(CharSequence s)
  • int indexOf(String str)
  • byte[] getByte()
  • char[] toCharArray()
  • boolean equals(Object anObject)
  • boolean eaualsIgnoreCase(String anotherString)
  • String toString()
  • String trim() 去掉两端的空格,但对于中间的空格不处理。
  • String[] split(String str) 将str作为分隔符分解,分解后的字符串在字符串数组中返回
String str = "asd!qwe|zxc#"; 
String[] str1 = str.split("!|#");//str1[0] = "asd";str1[1] = "qwe";str1[2] = "zxc";
public int compareTo(String anotherString)

按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。

按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。

如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0

String 类型的==和equals()的使用

java:String使用equals和==比较的区别_越来越好ing的博客-CSDN博客  

七、容器 

(图源:容器(二)_Jack方-CSDN博客

面试常见问题

参考链接:容器(二)_Jack方-CSDN博客

Collection和Collections有什么区别?

  • java.util.Collection是一个集合接口 (集合类的顶级接口)。它提供了对集合对象进行基本操作的通用方法。Collection接口在java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  • Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

collection接口

[Java] Collection接口_m0_47652477的博客-CSDN博客

collection的常用功能:

collection是所有单列集合的父接口,因此在collection中定义了单列集合的一些通用方法,这些方法可以用于操作所有的单列集合:

  • add
  • clear
  • remove
  • cotains
  • isEmpty
  • size
  • toArray
  • 迭代器 Iterator
boolean add(E e) 
          确保此 collection 包含指定的元素(可选操作)。 
          
void clear() 
          移除此 collection 中的所有元素(可选操作)。 
          
          
boolean remove(Object o) 
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。       
    
boolean contains(Object o) 
          如果此 collection 包含指定的元素,则返回 true。 
    
    
boolean isEmpty() 
          如果此 collection 不包含元素,则返回 true。 
    
int size() 
          返回此 collection 中的元素数。     
    
 Object[] toArray() 
          返回包含此 collection 中所有元素的数组。   
    
    
//示例
    package Practice;


import java.util.ArrayList;
import java.util.Collection;

public class Demo1 {
    public static void main(String[] args) {
        //创建集合对象,可以用多态
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);//重写了toString方法
        coll.add("你爹");
        coll.add("你爷爷");
        coll.add("你祖父");
        coll.add("你妈妈");
        System.out.println(coll);

        coll.remove("你爹");
        System.out.println(coll);

        boolean aa = coll.remove("233");
        System.out.println(aa);//说明删除失败


        Object [] ass = coll.toArray();//将ArrayList转化为Object的数组
        for(int i = 0;i< ass.length;i++){
            System.out.println(ass[i]);
        }

    }
}

collections中的常见方法

java中Collections常用方法总结(包括sort,copy,reverse等)_Shiny0815的博客-CSDN博客

  • sort(List l) --- 对集合进行排序
  • reverse(List l) ------ 反转集合中元素的顺序
  • sheffle(List l) ----- 对集合进行随机排序
  • fille(List list, Object 0) ---- 用对象o代替集合list中的所有元素
  • copy(List m, List n) ----- 将集合n中的元素全部复制到m中,并且覆盖相应索引的元素
  • min(Collection), ------采用Collection内含自然比较法
  • min(Collection, Comparator)------ 采用Comarator进行比较
  • max(Collection) max(Collection, Comparator)
  • indexOfSubList(List list, List subList) ----- 查找subList 在 list中首次出现位置的索引
  • lastIndexOfSubList(List source, List target)
  • rotate(List list, int m) ---------- 集合中元素向后移m个位置,在后面被遮盖的元素循环到前面来)。移动列表中的元素(m),负数表向左,正数表向右
  • swap(List list, int i, int j) --------- 交换集合中指定元素索引的位置
  • binarySearch(Collection, Object) ------- 查找指定集合中的元素,返回所查找元素的索引。
  • replaceAll(List list, Object old, Object new) -------- 替换集合中的所有old 为new , 若要替换的值存在,返回true,反之,返回false。
  • frequency(Collection Object o):返回指定集合中指定对象出现的次数

List

java中初始List的5种方法_John_chu的博客-CSDN博客_java list默认值

java中List的用法和实例详解 _vaniice的专栏-CSDN博客_java list

List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的方法,如下:

  • add(int index, Object obj) --- 用来向集合指定索引添加对象,其他对象的索引位置相对向后移一位,索引位置从0开始。
  • addAll(int, Collection) --- 用来向集合的指定索引位置添加指定集合中的所有对象
  • remove(int index) --- 用来清除集合中指定索引位置的对象
  • set(int index, Object obj) --- 用来将集合中指定索引位置的对象修改为指定的对象
  • get(int index)
  • indexOf(Object obj)
  • lastIndexOf(Object obj)
  • listIterator(int index) --- 用来获得一个包含索引位置到最后的ListIterator型实例。
  • subList(int from, int toIndex)

ArrayList

参考链接:javaArrayList

ArrayList<参数类型>  变量名字= new ArrayList<参数类型可以没有>(容量大小也可以不写)

ArrayList和LinkedList的区别

        最明显的区别就是ArrayList底层的数据结构是数组,支持随机访问,而LinkedList的底层数据结构是双向循环链表。不支持随机访问。使用下标访问一个元素,ArrayList的时间复杂度是O(1),而LinkedList是O(n)。

如何实现List到数组的转换?

  • List转成数组:调用ArrayList的toArray方法。
  • 数组转成List:调用Arrays的asList方法。

//toArray()的使用
ArrayList<String> list=new ArrayList<String>();
for (int i = 0; i < 10; i++) {
    list.add(""+i);
} 
String[] array= (String[]) list.toArray();

//asList
int i[]={11,22,33};
List intList=Arrays.asList(i);

 Vector

Java中vector的用法_倚世独殇-CSDN博客_java vector

Vector的四种构造方法:

1、Vector();    构造一个空向量,使其内部数据数组的大小为10,其标准容量增量为零。     Vector vec=new Vector();

2、Vector(Collection c);    构造一个包含指定collection中的元素的向量,这些元素按其collection的迭代器返回元素的顺序排列。  Vector v=new Vector(vec);

3、Vector(int initialCapacity);   使用指定的初始容量和等于零的容量增量构造一个空向量。

4、Vector(int initialCapacity,int capacityIncrement);   使用指定的初始容量和容量增量构造一个空的向量。
Vector类中的方法:

1、boolean add(E e);              将指定的元素添加到此向量的末尾。

2、void addElement(E obj);   将指定的组件添加到此向量的末尾,将其大小增加1。

3、void add(int indext,E e);     在此向量的指定位置插入指定的元素。

4、boolean addAll(Collection c);   将指定Collection中的所有元素添加到此向量的末尾,按照指定collection的迭代器所返回的顺序添加这些元素。

5、boolean addAll(int index,Collection c);   在指定位置将指定Collection中的所有元素插入到此向量中。

6、int  capacity();       返回此向量的当前容量。

7、Object clone();      返回向量的一个副本。

8、boolean contains(Object o);  如果此向量包含指定的元素,怎返回true。

9、boolean containsAll(Collection c);   如果此向量包含Collection中的所有元素,则返回true。

10、void copyInto(Object[] anArray);       将此向量的组件复制到指定的数组中。

11、E elementAt(int index);         返回指定索引处的组件。

12、Enumeration<E> elements();  返回此向量的组件的枚举。

13、void ensureCapacity(int minCapacity);    增加此向量的容量(如有必要),以确保其至少能够保证最小容量参数指定的组件数。

14、boolean equals(Object o);       比较指定对象与此向量的相等性。


原文链接:Java中vector的用法_倚世独殇-CSDN博客_java vector

queue

Java之Queue_mulanlong的博客-CSDN博客_java queue

常用操作:

  • add       增加一个元索 ,                如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  • remove   移除并返回队列头部的元素 ,如果队列为空,则抛出一个NoSuchElementException异常
  • element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
  • offer       添加一个元素并返回true       如果队列已满,则返回false
  • poll         移除并返问队列头部的元素    如果队列为空,则返回null
  • peek       返回队列头部的元素             如果队列为空,则返回null
  • put         添加一个元素                      如果队列满,则阻塞
  • take        移除并返回队列头部的元素     如果队列为空,则阻塞

PriorityQueue

例子:

295. 数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。

示例:

addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2

进阶:

  1. 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?
  2. 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?
class MedianFinder {
    
    PriorityQueue<Integer> min ;
    PriorityQueue<Integer> max ;
    /** initialize your data structure here. */
    public MedianFinder() {
        min = new PriorityQueue<>();
        max = new PriorityQueue<>((a,b) -> {return  b - a ;});
    }
    
    public void addNum(int num) {
        max.add(num);
        min.add(max.remove());
        if (min.size() > max.size())
            max.add(min.remove());
    }
    
    public double findMedian() {
        if (max.size() == min.size())
            return (max.peek() + min.peek()) / 2.0;
        else 
            return max.peek();
    }
}

 (代码摘抄自力扣用户cwk - 力扣(LeetCode) (leetcode-cn.com)

set

java中set的使用_深藏功与名-CSDN博客_set使用

set集合的特点

  • 不能同时存储相同的元素
  • 因为是一个抽象的接口,所以不能直接实例化为一个set对象:
    • Set s = new Set() 是错误的
    • 正确:Set s = new HashSet() 或者 Set s = new TreeSet()
  • 该接口主要继承于Collections 接口,所以具有Collection的一些常见的方法。

常见的方法:

add() //向集合添加元素
clear() //删除集合中所有的元素 
contains() // 判断集合中是否有某个元素 
isEmpty() 
iterator() //主要用于递归集合,返回一个Iterator()对象 
remove() //去掉集合中特定的对象 
size() //返回集合的大小
public class demo{
    public static void main(String[] args){
        Set hs = new HashSet();
        hs.add("1");
        hs.add("2");
        hs.add("3");
        System.out.ln(hs);
        //[1,2,3]
        Iterator it = hs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

set接口最常用的两大实现:

  • HashSet
  • TreeSet ------ TreeSet 会将里面的元素默认排序

HashSet

  • 哈希表边存放的是哈希值。
    • HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同)。是按照哈希值来存的,所以取数据也是按照哈希值取的。
  • HashSet不存入重复元素的规则,使用hashcode和equals
    • 如果对象的hashcode值是不同的,那么HashSet会认为对象是不可能相等的。因此我们自定义类的时候要重写hashcode,来确保对象具有相同的hashcode值。

HashSet的实现原理( 容器(二)_Jack方-CSDN博客 )

  • HashSet底层由HashMap实现
  • HashSet的值存放于HashMap的Key上
  • HashMap的Value统一为PRESENT

Map

HashMap

参考链接:java笔记--Map的用法_Linias的博客-CSDN博客_java map  

Java集合之一—HashMap_深入浅出学JAVA-CSDN博客_hashmap  


 HashMap<String , Double> map = new HashMap<String , Double>(); 
 map.put("语文" , 80.0); 
 map.put("数学" , 89.0); 
 map.put("英语" , 78.2); 

面试常问:容器(二)_Jack方-CSDN博客

HashMap和HashTable有什么区别?

  • hashMap去掉了Hashtable的contains的方法,但是加上了containsValue()和containsKey()方法。
  • Hashtable是同步的,而HashMap是非同步的,效率上比HashTable要高。
  • HashMap允许空键值,而HashTable不允许

如何决定使用HashMap还是TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMao是最好的选择。然而,加入你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

HashMap的实现原理

  • HashMap的概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
  • HashMap的数据结构:在Java编程语言中,最基本的结构就是两种:一个是数组,另一个是模拟指针(引用)。所有的数据结构都可以用这两种基本结构来构造,HashMap也不例外。HashMap实际上是一个“联表散列”的数据结构,即数组和链表的结合体。
  • 当我们往Hashmap中put元素的时候,首先根据key的hashcode重新计算hash的值,根据hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经放置了其他元素,那么这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组的该位置上没有元素,就直接将钙元素放到数组的该位置上。
  • 需要注意: JDK1.8 中HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,熊原来的O(n)到O(logn)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值