关于java-se:Java-HashMap源码分析含散列表红黑树扰动函数等重点问题分析

写在最后面这个我的项目是从20年末就立好的 flag,通过几年的学习,回过头再去看很多知识点又有新的了解。所以趁着找实习的筹备,联合以前的学习储备,创立一个次要针对应届生和初学者的 Java 开源常识我的项目,专一 Java 后端面试题 + 解析 + 重点常识详解 + 精选文章的开源我的项目,心愿它能随同你我始终提高! 阐明:此我的项目内容参考了诸多博主(已注明出处),材料,N本书籍,以及联合本人了解,从新绘图,从新组织语言等等所制。集体之力菲薄,或有不足之处,在劫难逃,但更新/欠缺会始终进行。大家的每一个 Star 都是对我的激励 !心愿大家能喜爱。 注:所有波及图片未应用网络图床,文章等均开源提供给大家。 我的项目名: Java-Ideal-Interview Github 地址: Java-Ideal-Interview - Github Gitee 地址:Java-Ideal-Interview - Gitee(码云) 继续更新中,在线浏览将会在前期提供,若认为 Gitee 或 Github 浏览不便,可克隆到本地配合 Typora 等编辑器舒服浏览 若 Github 克隆速度过慢,可抉择应用国内 Gitee 仓库 三 HashMap 源码剖析 1. 前置常识 1.1 什么是 Map 1.1.1 概述1.1.2 Map汇合和Collection汇合的区别1.2 什么是散列表 1.2.1 剖析一下为什么要用散列表1.2.2 散列表工作原理1.2.3 如何解决 Hash 抵触 1.2.3.1 JDK 1.71.2.3.1 JDK 1.81.3 什么是红黑树2. 源码剖析 2.1 类成员2.2 两个节点 2.2.1 Node 节点2.2.2 TreeNode 节点2.3 构造方法2.4 增加办法 ...

February 21, 2021 · 10 min · jiezi

关于java-se:Java-LinkedList-简单源码分析节选

写在最后面这个我的项目是从20年末就立好的 flag,通过几年的学习,回过头再去看很多知识点又有新的了解。所以趁着找实习的筹备,联合以前的学习储备,创立一个次要针对应届生和初学者的 Java 开源常识我的项目,专一 Java 后端面试题 + 解析 + 重点常识详解 + 精选文章的开源我的项目,心愿它能随同你我始终提高! 阐明:此我的项目内容参考了诸多博主(已注明出处),材料,N本书籍,以及联合本人了解,从新绘图,从新组织语言等等所制。集体之力菲薄,或有不足之处,在劫难逃,但更新/欠缺会始终进行。大家的每一个 Star 都是对我的激励 !心愿大家能喜爱。 注:所有波及图片未应用网络图床,文章等均开源提供给大家。 我的项目名: Java-Ideal-Interview Github 地址: Java-Ideal-Interview - Github Gitee 地址:Java-Ideal-Interview - Gitee(码云) 继续更新中,在线浏览将会在前期提供,若认为 Gitee 或 Github 浏览不便,可克隆到本地配合 Typora 等编辑器舒服浏览 若 Github 克隆速度过慢,可抉择应用国内 Gitee 仓库 LinkedList 源码剖析 1. LinkedList 概述 1.1 List 是什么?1.2 LinkedList 是什么?2. 源码剖析 2.1 类申明2.2 成员2.3 外部公有类 Node 类2.4 构造方法2.5 增加办法 2.5.1 add(E e)2.5.2 add(int index, E element)2.5.3 addLast(E e)2.5.4 addFirst(E e)2.5.5 addAll(Collection c )2.6 获取办法 ...

February 21, 2021 · 7 min · jiezi

关于java-se:数据库JDBC

JDBC概述咱们学习了数据库,数据库实现了数据的长久化,但咱们最终要在程序里解决数据啊,那java代码中怎么去拜访数据库读写数据呢? 这就要用到sun公司设定的一套数据库规范了,这套规范就是JDBC(Java Database Connectivity)。但它只是标准,不做具体实现。于是数据库厂商又依据JDBC规范,实现自家的驱动Driver。如:mysql驱动com.mysql.cj.jdbc.Driver,Oracle的驱动oracle.jdbc.OracleDriver。有了这套解决方案,java就能够拜访数据库中的数据了。 public interface Connection extends Wrapper, AutoCloseable {} public interface Statement extends Wrapper, AutoCloseable {}public interface PreparedStatement extends Statement {}public interface CallableStatement extends PreparedStatement {} public interface ResultSet extends Wrapper, AutoCloseable {}调用形式有三种:Statement语句、PreparedStatement预处理语句、CallableStatement存储过程,举荐应用第二种PreparedStatement,避免SQL注入,其也是预编译性能高。 JDBC的三种调用Statement语句:步骤:1.加载驱动2.创立数据库连贯connection3.创立sql语句对象(statement语句,preparestatement预编译语句,call存储过程X)4.执行查问语句,返回后果集ResultSet5.利用查问到的后果集对象进行数据处理 package test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class Test3JDBC { public static void main(String[] args) throws Exception { //根本查问语句 method(); } public static void method() throws Exception { //第一步,须要加载驱动 String driver = "com.mysql.jdbc.Driver"; //第二步,增加链接,用户名,明码 String url = "jdbc:mysql://localhost:3306/jtdb2007"; String usename="root"; String password="1234"; //创立driver申明的类的全门路的Class类对象 Class.forName(driver); //第三步,创立一个数据库链接connection Connection cn = DriverManager.getConnection(url,usename,password); //第四步,创立语句对象(statement语句,preparestatement预编译语句,call存储过程X) Statement state = cn.createStatement();//创立Statement对象,该对象来将sql发送到数据库。 //第五步,执行查问语句,返回后果集ResultSet String sql = "select * from emp"; ResultSet rs = state.executeQuery(sql); int cols = rs.getMetaData().getColumnCount();//获取列的数量 for (int i = 1; i <=cols ; i++) { //第六步,获取列名,元数据 System.out.print(rs.getMetaData().getColumnName(i)+"t");//ResultSetMetaData接口,获取指定列的名称 } //第七步,for循环打印表字段内容 while(rs.next()){ System.out.println(); for (int i = 1; i <=cols ; i++) { System.out.print(rs.getString(i)+"t"); } } }}PreparedStatement预处理语句: ...

November 27, 2020 · 2 min · jiezi

关于java-se:JAVASE注解反射内部类socketJDK新特性

1注解概述:注解能够加强咱们的java代码,同时利用反射技术能够裁减实现很多性能。它们被广泛应用于三大框架底层。传统咱们通过xml文本文件申明形式,而当初最支流的开发都是基于注解形式,代码量少,框架能够依据注解去主动生成很多代码,从而缩小代码量,程序更易读。例如最火爆的SpringBoot就齐全基于注解技术实现。 分类:1、JDK自带注解2、元注解3、自定义注解 JDK注解:JDK注解的注解,就5个:1、@Override2、@Deprecated标记就表明这个办法曾经过期了,但我就要用,别提醒我过期3、@SuppressWarnings(“deprecation”) 疏忽正告4、@SafeVarargs jdk1.7呈现,堆净化,不罕用5、@FunctionallInterface jdk1.8呈现,配合函数式编程拉姆达表达式,不罕用 元注解:形容注解的注解,就5个:1、@Target 注解用在哪里:类上、办法上、属性上 ElementType.FIELD 利用于字段或属性ElementType.METHOD 利用于办法级ElementType.TYPE 利用于类的元素2、@Retention 注解的生命周期:源文件中、class文件中、运行中 RetentionPolicy.RUNTIME 在运行时无效3、@Inherited 容许子注解继承4、@Documented 生成javadoc时会蕴含注解,不罕用5、@Repeatable注解为可反复类型注解,能够在同一个中央屡次应用,不罕用 自定义注解: //一,自定义注解:@interface 注解名//形容注解能够呈现的地位--多个地位上用@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.SOURCE)//形容注解的生命周期@interface Test{ //1,给注解增加性能--属性--语法非凡 String local()default "";//3,给属性设置默认值,不便间接应用@Test String value();//5,非凡的属性value}//二,应用注解:@Test//@Test(local="class")//2,当Test注解增加了属性时,须要给属性赋值class taotao{ String name;// @Test//4,因为属性设置好了默认值,用时就简略了// @Test("123")//6,因为value属性比拟非凡,能够简写,赋值时省略掉value= @Test(local = "method",value="")//7,给多个属性赋值时,不能省略value= public void show(){ System.out.println("show()..."); }}2反射概述:Reflection(反射) 是 Java 程序开发语言的特色之一,它容许运行中的 Java 程序对本身进行查看,或者说“自审“,也有称作“自省”。反射十分弱小,它甚至能间接操作程序的公有属性。咱们后面学习都有一个概念,private的只能类外部拜访,内部是不行的,但这个规定被反射赤裸裸的突破了。 反射就像一面镜子,它能够在运行时获取一个类的所有信息,能够获取到任何定义的信息(包含成员变量,成员办法,结构器等),并且能够操纵类的字段、办法、结构器等局部。 2.1创建对象Class.forName(“类的全门路”);类名.class对象.getClass();测试: //形式1: Class.forName("类的全门路"); Class clazz = Class.forName("java.lang.String");//形式2: 类名.class Class clazz2 = String.class;//形式3: 对象.getClass(); Class clazz3 = new String().getClass();2.2罕用办法测试: public static void main(String[] args) throws Exception {// method();//获取Class对象// method2();//获取构造方法// method3();//获取成员办法// method4();//获取成员变量// method5();//通过反射创建对象 } public static void method5() throws Exception { //1,获取Class对象 Class<Test2_Student> a = Test2_Student.class; //2,调用实例化办法 -- 也要触发构造方法,而且触发的是无参结构 //java.lang.InstantiationException没有无参结构报异样 Test2_Student as = a.newInstance(); System.out.println("as="+as); //重写toString()前:as=day18.Test2_Student@15db9742 //重写toString()后:as=Test2_Student [name=null, age=0, score=0.0] //怎么触发含参结构--匹配构造方法里 参数列表 Constructor<Test2_Student> ass = a.getConstructor(String.class);//指定 //X是创建对象时间隔的参数 Test2_Student ass2 = ass.newInstance("jack"); System.out.println("ass2="+ass2); //创立2个参数的构造方法 Constructor<Test2_Student> bss = a.getConstructor(String.class,int.class,double.class); Test2_Student bsss = bss.newInstance("taotao",20,20.1); System.out.println("bsss="+bsss); } //获取成员变量 public static void method4() { //1,获取Class对象 Class a = Test2_Student.class; //2,获取所有的成员变量--只能获取到public润饰的变量 Field[] as = a.getFields(); //3,遍历数组,失去每个变量ass for(Field ass:as) { //4,获取变量名 System.out.println(ass.getName()); //5,获取变量类型 System.out.println(ass.getType().getName()); } } //获取成员办法 public static void method3() { //1,获取Class对象 Class<Test2_Student> a = Test2_Student.class; //2,获取所有成员办法们 --包含本人的和父类的 Method[] as = a.getMethods(); //3,遍历数组,失去每个办法ass for(Method ass:as) { //4,获取办法名 System.out.println(ass.getName()); //5,获取办法的参数的类型 Class[] asss = ass.getParameterTypes(); System.out.println(Arrays.toString(asss)); } } //获取构造方法 public static void method2() { //1,获取Class对象 --封装了.class文件里的所有数据 Class c1 = Test2_Student.class; //2,调用办法// --取得所有公开的构造方法,并存入数组 Constructor[] cs = c1.getConstructors(); //3,获取每个构造方法 for(Constructor css:cs) { //4,获取构造方法的名字 System.out.println(css.getName()); //5,获取构造方法的参数 Class[] css1=css.getParameterTypes(); System.out.println(Arrays.toString(css1)); } } //获取Class对象 public static void method() throws ClassNotFoundException {// Class.forName(“类的全门路”);// 类名.class// 对象.getClass(); Class c = Class.forName("test.reflect.Test3_Reflect2"); Class c1 = Test3_Reflect2.class; Class c2 = new Test3_Reflect2().getClass(); }2.3暴力反射根本API: ...

November 12, 2020 · 4 min · jiezi

关于java-se:接口

接口通过interface关键字定义接口类通过implements实现接口接口不能够实例化接口中全部都是形象办法接口中的形象办法能够省略public abstract关键字实现类必须实现接口中的全副形象办法要么它就是一个抽象类在jdk1.8里容许接口中呈现一般办法,要求被static或者default润饰 // static public void hi() {} // default public void hi() {}public class Test1_Interface { public static void main(String[] args) { // TODO Auto-generated method stub Demo demo=new DemoImpl(); demo.eat(); demo.game(); }}interface Demo{ void eat(); void game();}class DemoImpl implements Demo{ @Override public void eat() { // TODO Auto-generated method stub System.out.println("eat()..."); } @Override public void game() { // TODO Auto-generated method stub System.out.println("game()..."); } }接口的用法接口里没有构造方法/没有变量都是常量接口里都是形象办法(jdk1.8能够有非凡的一般办法)接口里的常量能够简写,会主动拼接public static final接口里的办法能够简写,会主动拼接public abstract ...

November 7, 2020 · 2 min · jiezi

关于java-se:JAVASEBasic基础数据运算符分支循环结构数组

1 根底数据结构在JAVA程序运行过程中始终不会扭转的量称为常量。有的数据值是不固定的,总在变,咱们还须要记录这些值,咱们能够把这些值了解为变量。在java中数据类型分为两类:根本数据类型和援用类型。 1.1 根本数据类型根本数据类型总共有8种:根本数据类型的取值范畴: /* 整数型:byte 1字节 * short 2 * int 4 * long 8 *浮点型:float 4 * double 8 *字符: char 2 *布尔值:boolean 1 */ //整数型测试 byte short int long byte max = Byte.MAX_VALUE; byte min = Byte.MIN_VALUE; System.out.println(max);//127 2e7 System.out.println(min);//-128 short smax = Short.MAX_VALUE; short smin = Short.MIN_VALUE; System.out.println(smax);//32767 2e15 System.out.println(smin);//-32768 //int--integer int imax = Integer.MAX_VALUE; int imin = Integer.MIN_VALUE; System.out.println(imax);//2147483647 2e31 System.out.println(imin);//-2147483648 long lmax = Long.MAX_VALUE; long lmin = Long.MIN_VALUE; System.out.println(lmax);//9223372036854775807 2e63 System.out.println(lmin);//-9223372036854775808 //浮点型测试 float double float fmax = Float.MAX_VALUE; float fmin = Float.MIN_NORMAL; System.out.println(fmax);//3.4028235E38 8位有效数字 System.out.println(fmin);//1.17549435E-38 double dmax = Double.MAX_VALUE; double dmin = Double.MIN_NORMAL; System.out.println(dmax);//1.7976931348623157E308 16位有效数字 System.out.println(dmin);//2.2250738585072014E-308 //char测试 char c = 'a';//能够存一个字符'' char c1 = '1'; char c2 = '在';//能够存一个汉字 char c3 = 18;//能够存一个数字,会查看ASCII表(0-127有对应)进行打印,区间0-65535 System.out.println(c); System.out.println(c1); System.out.println(c2); System.out.println(c3);1.2 数据的字面值整数类型的字面值:int类型 ...

October 30, 2020 · 2 min · jiezi

关于java-se:注解和反射

1 注解简介注解(Annotation)是从JDK5.0开始引入的新技术 作用: 对程序作出解释(非必须,检查和束缚)被其余程序读取(编译器)格局:@注解名(有的还能够增加参数值) Annotation能够附加在package, class, method, field 等下面,相当于给他们增加了额定的辅助信息,能够通过反射机制编程实现对这些元数据的拜访 1.1 内置注解@Override:重写父类办法 @Deprecated:不举荐应用 @SuppressWarnings("all"):克制正告 1.2 元注解作用:注解其余注解,为其余annotation提供阐明 Java定义了4个规范的meta-annotation类型:@Target, @Retention, @Document, @Inherited @Target:形容注解的应用范畴@Retention:形容注解的生命周期(SOURCE<CLASS<RUNTIME)@Documented:阐明该注解被蕴含在javadoc中@inherited:阐明子类能够继承父类中的该正文1.3 自定义注解格局:public @ interface 注解名 {定义内容} public class Test extends Object{ //注解能够显式赋值,如果没有默认值,则必须赋值 @MyAnnotation(name = "XXX",schools = {"门头沟大学","家里蹲大学"}) public void test() { }}//定义一个注解//Target 形容注解应用范畴@Target(value = {ElementType.METHOD,ElementType.TYPE})//Retention 形容注解失效工夫@Retention(value = RetentionPolicy.RUNTIME)//Documented 示意将注解生成在javadoc中@Documented//Inherited 示意子类能够继承父类的注解@Inherited@interface MyAnnotation{ //注解的参数:参数类型+参数名() //如果只有一参数,倡议命名为value String name() default ""; int age() default 0; int id() default -1; String[] schools() default {""};}2 反射机制动态语言VS动静语言 ...

September 20, 2020 · 6 min · jiezi

一篇搞定Java过滤器

Filter:过滤器引言我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来说登陆的正确流程是这样的:用户在客户端发出请求 -> 后台判断是否登录 -> 是则不限制,否则 跳转回登录页面,判断是否登录和我们前面所学习的 Header中获取referer再判断达从而到防盗链的效果有相似的感觉,就是起一个判断过滤的样子,而Filter则是一个更好的解决这样问题的技术,当然强大的功能不止这一点,下面我们就好好来说一说!(一) 过滤器概述过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来 当然,过滤器既可以拦截request,也可以拦截返回的response,我们来看一张图 (二) 第一个过滤器程序过滤器的本质就是一个实现了 Filter 接口的 Java 类 我们先自己创建一个类,实现Filter接口(javax.servlet),重写其中的所有方法 @WebFilter("/*")public class FilterDemo1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //放行代码 chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { }}我们先不探究其中的方法,我们先看一下如何配置filter (三) filter配置第一种:web.xml配置<filter> <filter-name>filterDemo1</filter-name> <filter-class>package cn.ideal.web.filter.FilterDemo1</filter-class></filter><filter-mapping> <filter-name>filterDemo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern></filter-mapping>filter<filter-name></filter-name> :指定filter名字 <filter-class></filter-class> :指定filter全类名(带包名) filter-mapping<filter-name></filter-name> :这里的标签是为了与上面filter中的名字对应,从而指向到对应的文件中 ...

September 10, 2019 · 3 min · jiezi

北零工具箱-Ver-110-梦世界专版的使用

带家好 我是大咗北零 咱是大咗不是大佐 今天我带发慈悲给出使用教程 ①打开北零带哥的工具箱 ②点"开始防封"的按钮 ③打开网易我的世界盒子嗷 ④登陆账号 [如果第一次使用请点击"注入配置"的按钮 以后就不用了] ⑤启动游戏 ⑥到进度条85%的时候点"注入"那个按钮 ⑦进服后点"关闭盒子"按钮 ⑧飘飘飘 ================================================ 大佐们需要注意: ①如果进服崩端,尝试重新注入配置或换个id ②如果启动失败,删除你"MCLDownload/ext"的文件夹 <通常在c盘 如果没有到别的盘找找> 再启动游戏 ================================================ 大佐们赏点饭恰 9.99元的工具箱还送内部很划算QWQ

September 8, 2019 · 1 min · jiezi

Java 之路 - JDK基础 java.lang.Integer

静态常量Integer.SIZE,Integer.BYTESSIZE: Integer的长度,值为32,单位为位(bit)。BYTES:Integer的字节数,值为8,单位为字节(byte)。1字节byte = 8位bit最大值MIN_VALUE和最小值MAX_VALUEMIN_VALUE:0x80000000(16进制)= -(2的31次方) =-2147483648MAX_VALUE:0x7fffffff(16进制)= 2的31次方-1 = 2147483647TYPE Java类型声明为Class<Integer>,所以可以直接使用类反射方法。如newInstance()。构造方法1 new Integer(int value);将int型参数直接赋值给成员变量value;2 new Integer(String s);调用parseInt(String s, int radix)转换字符串为10进制数字,会抛出NumberFormatException。普通方法转成其他基本类型int : intValue(),byte: byteValue(),超过byte范围会符号取反。short: shortValue()float: floatValue(),double: doubleValue(),long: longValue()。各种整数类型长度类型字节位值int4字节32位最大值2的31次方-1short2字节,int的0.5倍16位最大值2的15次方-1,32767byte1字节,short的0.5倍8位最大值2的7次方-1,127;long8字节,int的2倍64位最大值2的63次方-1,9223372036854775807静态方法parseInt() 和 valueOf()parseInt返回int,valueOf返回Integer。parseInt(String)和 valueOf(String)将字符串转为10进制整数。parseInt(String s, int radix)和 valueOf(String, radix)radix:进制基数。将字符串数字按radix进制转为10进制整数。radix 范围,最小值2进制,最大值64进制System.out.println(“int :"+Integer.parseInt(“1000”, 2)); System.out.println(“int :"+Integer.parseInt(“B”, 16));System.out.println(“int :"+Integer.parseInt("-B”, 17));System.out.println(“Integer :"+Integer.valueOf(1));System.out.println(“Integer :"+Integer.valueOf(“1”));System.out.println(“Integer :"+Integer.valueOf(“B”,16));结果int :8int :11int :-11Integer :1Integer :1Integer :11toString(String s, int radix)跟parseInt()相同,结果为String类型。decode(String s)将字符串转为10进制如果字符串以0X、0x或#开头,radix为16进制;如果字符串以0开头,radix为8进制。System.out.println(Integer.decode(“0XA1”));//16进制,0X开头System.out.println(Integer.decode("#A1”));//16进制,#开头System.out.println(Integer.decode(“032”)); //8进制,0开头结果:0XA1 –> 1610XA1 –> 161032 –> 26转为2进制toBinaryString()、8进制toOctalString()、16进制toHexString()System.out.println(Integer.toBinaryString(10));System.out.println(Integer.toOctalString(10));System.out.println(Integer.toHexString(19));结果:10101213运算compare(int a ,int b)比较大小max()最大值min()最小值sum()求和

December 20, 2018 · 1 min · jiezi