René's URL Explorer Experiment


Title: GitHub - Android-Star/Note-For-Java

Open Graph Title: GitHub - Android-Star/Note-For-Java

X Title: GitHub - Android-Star/Note-For-Java

Description: Contribute to Android-Star/Note-For-Java development by creating an account on GitHub.

Open Graph Description: Contribute to Android-Star/Note-For-Java development by creating an account on GitHub.

X Description: Contribute to Android-Star/Note-For-Java development by creating an account on GitHub.

Opengraph URL: https://github.com/Android-Star/Note-For-Java

X: @github

direct link

Domain: patch-diff.githubusercontent.com

route-pattern/:user_id/:repository
route-controllerfiles
route-actiondisambiguate
fetch-noncev2:9cc62336-d60e-befc-83a0-a0ab83779fc5
current-catalog-service-hashf3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb
request-idA7AE:8251F:2A3B657:3849014:6971CFF9
html-safe-nonce308ced13916895c1558bc498e8963d94bd9ddae917b20bb84467780736f6858b
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBN0FFOjgyNTFGOjJBM0I2NTc6Mzg0OTAxNDo2OTcxQ0ZGOSIsInZpc2l0b3JfaWQiOiI4NzYzMTI2NTM0MzQ1MTgzMjI1IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac15fd946ee0860d6c5004469565373aed19da711c5b6cbb0613019347e760cfb2
hovercard-subject-tagrepository:160126724
github-keyboard-shortcutsrepository,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location//
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/Android-Star/Note-For-Java
twitter:imagehttps://opengraph.githubassets.com/63e016384e5aa810e3fbeb7d0be19b9c761911f0b5405f9de0ee2bb7aa31f86e/Android-Star/Note-For-Java
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/63e016384e5aa810e3fbeb7d0be19b9c761911f0b5405f9de0ee2bb7aa31f86e/Android-Star/Note-For-Java
og:image:altContribute to Android-Star/Note-For-Java development by creating an account on GitHub.
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None7476eb4140129667a7530d10cfb7688f701883e35a4dcaa4673e3ec599af5199
turbo-cache-controlno-preview
go-importgithub.com/Android-Star/Note-For-Java git https://github.com/Android-Star/Note-For-Java.git
octolytics-dimension-user_id16065341
octolytics-dimension-user_loginAndroid-Star
octolytics-dimension-repository_id160126724
octolytics-dimension-repository_nwoAndroid-Star/Note-For-Java
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id160126724
octolytics-dimension-repository_network_root_nwoAndroid-Star/Note-For-Java
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release2cc0827c872b538cd08371730242ae4951d2d61a
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#start-of-content
https://patch-diff.githubusercontent.com/
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2FAndroid-Star%2FNote-For-Java
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2FAndroid-Star%2FNote-For-Java
Sign up https://patch-diff.githubusercontent.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=Android-Star%2FNote-For-Java
Reloadhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Reloadhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Reloadhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Android-Star https://patch-diff.githubusercontent.com/Android-Star
Note-For-Javahttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Notifications https://patch-diff.githubusercontent.com/login?return_to=%2FAndroid-Star%2FNote-For-Java
Fork 0 https://patch-diff.githubusercontent.com/login?return_to=%2FAndroid-Star%2FNote-For-Java
Star 2 https://patch-diff.githubusercontent.com/login?return_to=%2FAndroid-Star%2FNote-For-Java
2 stars https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/stargazers
0 forks https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/forks
Branches https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/branches
Tags https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/tags
Activity https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/activity
Star https://patch-diff.githubusercontent.com/login?return_to=%2FAndroid-Star%2FNote-For-Java
Notifications https://patch-diff.githubusercontent.com/login?return_to=%2FAndroid-Star%2FNote-For-Java
Code https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Issues 0 https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/issues
Pull requests 0 https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/pulls
Actions https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/actions
Projects 0 https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/projects
Security Uh oh! There was an error while loading. Please reload this page. https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/security
Please reload this pagehttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Insights https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/pulse
Code https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Issues https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/issues
Pull requests https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/pulls
Actions https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/actions
Projects https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/projects
Security https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/security
Insights https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/pulse
Brancheshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/branches
Tagshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/tags
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/branches
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/tags
12 Commitshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/commits/master/
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/commits/master/
README.mdhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/blob/master/README.md
README.mdhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/blob/master/README.md
java笔记.txthttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/blob/master/java%E7%AC%94%E8%AE%B0.txt
java笔记.txthttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/blob/master/java%E7%AC%94%E8%AE%B0.txt
READMEhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#note-for-java
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#1在java中如果被除数或者除数有一个为浮点类型0或者00是可以用作除数的结果得正负无穷取余操作亦是如此
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2java在70之后switch语句case后面支持string类型
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#3java嵌套循环中内部循环使用break或者continue来控制外部循环结束或者跳过可以使用标签示例代码
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#4java5之后提供了foreach循环此循环不需要知道数组或者集合的长度应用更方便注意使用foreach循环不能改变元素的值因为遍历过程中是创建的临时变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#5数组引用变量只是一个引用引用变量是访问真实对象的根本方式如果希望在程序中访问数组对象本身只能通过这个数组的引用变量来访问它
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#6实际的数组对象被存储在堆内存中如果引用该数组对象的数组引用变量是一个局部变量那么它被存储在栈内存中
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#7当一个方法执行时每个方法都会建立自己的内存栈在这个方法内定义的变量将会逐个放入这块栈内存中随着方法的执行结束这个方法的内存栈也将自然销毁-因此所有在方法中定义的局部变量都是放在栈内存中的在程序中创建一个对象时这个对象将被保存到运行时数据区中以便反复利用因为对象的创建成本通常较大这个运行时数据区就是堆内存堆内存中的对象不会随着方法的结束而销毁即使方法结束后这个对象还可能被另一个引用变量所引用在方法的参数传递时很常见则这个对象依然不会被销毁只有当一个对象没有任何引用变量引用它时系统的垃圾回收器才会在合适的时候回收它
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#8static修饰符的真正作用就是用于区分成员变量方法内部类初始化块这四种成员到底属于类本身还是属于实例在类中定义的成员static相当于一个标志有static修饰的成员属于类本身没有static修饰的成员属于该类的实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#9长度可变的形参只能处于形参列表的最后一个方法中最多只能包含一个长度可变的形参长度可变的形参既可以传入多个参数也可以传入一个数组
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#10如果同一个类中定义了teststring-books方法同时还定义了一个teststring方法则teststring-books方法的books不可能通过直接传入一个字符串参数来调用如果只传入一个参数系统会执行重载的teststring方法如果需要调用teststring-books方法又只想传入一个字符串参数则可采用传入字符串数组的形式
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#11如果一个java源文件里定义的所有类都没有使用public修饰则这个源文件的文件名可以是一切合法的文件名但如果一个java源文件里定义了一个public修饰的类则这个源文件的文件名必须与public修饰的类的类名相同
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#12当程序创建一个子类对象时系统不仅会为该类中定义的实例分配内存也会为它从父类继承得到的所有实例变量分配内存即使子类定义了与父类中同名的实例变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#13构造器相关
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#a子类构造器执行体的第一行使用super显式调用父类构造器系统将根据super调用里传入的实参列表调用父类对应的构造器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#b子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器系统将根据this调用里传入的实参列表调用本类中的另一个构造器执行本类中另一个构造器时即会调用父类构造器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#c子类构造器执行体中既没有super调用也没有this调用系统将会在执行子类构造器之前隐式调用父类无参数的构造器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#14不管上面哪种情况当调用子类构造器来初始化子类对象时父类构造器总会在子类构造器之前执行不仅如此执行父类构造器时系统会再次上溯执行其父类构造器依次类推创建任何java对象最先执行的总是javalangobject类的构造器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#15考虑到进行强制类型转换时可能出现异常因此进行类型转换之前应先通过instanceof运算符来判断是否可以成功转换
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#16当创建java对象时系统总是先调用该类里定义的初始化块初始化块虽然也是java类的一种成员但它没有名字也就没有标识因此无法通过类对象来调用初始化块初始化块只在创建java对象时隐式执行而且在执行构造器之前
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#17实际上初始化代码块是一个假象使用javac命令编译java类后该java类中的初始化块会消失初始化块中的代码会被还原到每个构造器中且位于构造器所有代码的前面
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#18与构造器类似创建一个java对象时不仅会执行该类的普通初始化块和构造器而且系统还会一直上溯到javalangobject类先执行javalangobject类的初始化块开始执行-javalangobject的构造器依次向下执行其父类的初始化块开始执行其父类的构造器最后才执行该类的初始化块和构造器返回该类的对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#19初始化块定义时使用static修饰符这个初始化块就变成了静态初始化块也被称为类初始化块普通初始化块负责对对象执行初始化类初始化块负责对类进行初始化静态初始化块是类相关的系统将在类初始化阶段执行静态初始化块而不是在对象创建时执行因此静态初始化块总是比普通初始化块先执行
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#20与普通初始化块类似的是系统在类初始化阶段执行静态初始化块时不仅会执行本类的静态初始化块而且还会一直上溯到javalangobject类如果他包含静态初始化块先执行javalangobject类的静态初始化块如果有然后执行其父类的静态初始化块最后才执行该类的静态初始化块
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#21静态初始化块和声明静态成员变量时所指定的初始值都是该类的初始化代码它们的执行顺序与源程序中的排列顺序相同
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#22java提供了final关键字来修饰变量方法和类系统不允许为final变量重新赋值子类不允许覆盖父类的final方法final类不能派生子类通过使用final关键字允许java实现不可变类不可变类会让系统更安全
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#23jdk15以后支持所谓的自动装箱即可以直接把一个基本类型值赋给一个包装类实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#结果是truefalse原因在于观察integer源码可知内部会管理一个长度为256的integer数组里面存了-128-127所有整数所以把一个-128-127之间的数自动装箱成一个integer实例时实际是指向cache数组中的一个元素所以它们完全相等而每次把不在-128-127之间的整数自动装箱就会不相等
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#24对于直接做运算的两个字符串字面量常量并不会放入string常量池中而是直接把运算后的结果放入常量池中对于先声明的字符串字面量常量会放入常量池但是若使用字面量的引用进行运算就不会把运算后的结果放入常量池中了总结一下就是jvm会对string常量的运算进行优化未声明的只放结果已经声明的只放声明
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#25final修饰的成员变量必须由程序员显式的指定初始值final修饰的类变量必须在静态初始化块中指定初始值或声明该类变量时指定初始值而且只能在两个地方的其中之一指定final修饰的实例变量必须在非静态初始化块声明该实例变量或构造器中指定初始值而且只能在三个地方的其中之一指定
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#26与普通成员变量不同final成员变量包括实例变量和类变量必须由程序员显式初始化系统不会对final成员变量进行隐式初始化
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#27当时用final修饰基本类型变量时不能对基本类型变量重新赋值因此基本类型变量不能被改变但对于引用类型变量它保存的仅仅是一个引用final只保证这个引用类型变量所引用的地址不会改变即一直引用同一个对象但是这个对象完全可以发生改变
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#28对于final变量只要满足使用final修饰符修饰在定义该final变量时指定了初始值该初始值可以在编译时就被确定下来这三个条件这个final变量就不再是一个变量相当于一个直接量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#29当定义final变量时就为该变量指定了初始值而且该初始值在编译时就能确定下来那么这个final变量本质就是一个宏变量编译器会把程序中所有用到这个变量的地方直接替换成该变量的值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#30抽象类必须使用abstract修饰符来修饰抽象方法也必须使用abstract修饰符来修饰抽象方法不能有方法体抽象类不能被实例化无法使用new关键字来调用抽象类的构造器创建抽象类实例即使抽象类里不包含抽象方法这个抽象类也不能创建实例抽象类可以包含成员变量方法普通方法和抽象方法都可以构造器初始化块内部类接口枚举5种成分抽象类的构造器不能用于创建实例主要是用于被其子类调用含有抽象方法的类包括直接定义了一个抽象方法或继承了一个抽象父类但没有完全实现父类包含的抽象方法或实现了一个接口但没有完全实现接口包含的抽象方法三种情况只能被定义成抽象类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#31接口里定义的内部类内部接口内部枚举默认都采用public-static两个修饰符不管定义时是否指定这两个修饰符系统都会自动使用public-static对它们进行修饰
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#32java8允许在接口中定义默认方法默认方法必须使用default修饰该方法不能使用static修饰无论程序是否指定默认方法总是使用public修饰如果开发者没有指定public系统会自动为默认方法添加public修饰符由于默认方法并没有static修饰因此不能直接使用接口来调用默认方法需要使用接口的实现类的实例来调用默认方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#33java8允许在接口中定义类方法类方法必须使用static修饰该方法不能使用default修饰无论程序是否指定类方法总是使用public修饰--如果开发者没有指定public系统会自动为类方法添加public修饰符类方法可以直接使用接口来调用
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#34内部类比外部类可以多使用三个修饰符privateprotectedstatic--外部类不可以使用这三个修饰符非静态内部类不能拥有静态成员
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#35大部分时候内部类都被作为成员内部类定义而不是作为局部内部类成员内部类是一种与成员变量方法构造器和初始化块相似的类成员局部内部类和匿名内部类则不是类成员
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#36如果外部类成员变量内部类成员变量与内部类里方法的局部变量同名则可通过使用this外部类类名this作为限定来区分
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#37java8之前java要求被局部内部类匿名内部类访问的局部变量必须使用final修饰java8之后如果局部变量被匿名内部类访问那么该局部变量相当于自动使用了final修饰
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#38lambda表达式形参列表形参列表允许省略参数类型如果形参列表只有一个参数甚至连形参列表的圆括号也可以省略箭头-必须通过英文中画线号和大于符号组成代码块如果代码块只包含一条语句lambda表达式允许省略代码块的花括号那么这条语句就不要用花括号表示语句结束lambda代码块只有一条return语句甚至可以省略return关键字lambda表达式需要返回值而它的代码块中仅有一条省略了return的语句lambda表达式会自动返回这条语句的值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#39lambda表达式的类型也被称为目标类型lambda表达式的目标类型必须是函数式接口函数式接口代表只含有一个抽象方法的接口函数式接口可以包含多个默认方法类方法但只能声明一个抽象方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#40lambda表达式的目标类型必须是明确的函数式接口lambda表达式只能为函数式接口创建对象lambda表达式只能实现一个方法因此它只能为只有一个抽象方法的接口函数式接口创建对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#41为了保证lambda表达式的目标类型是一个明确的函数式接口一般有如下三种常见形式将lambda表达式赋值给函数式接口类型的变量将lambda表达式作为函数式接口类型的参数传给某个方法使用函数式接口对lambda表达式进行强制类型转换
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#42如果lambda表达式的代码块只有一条代码还可以在代码块中使用方法引用和构造器引用
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#43引用类方法示例类名类方法说明函数式接口中被实现方法的全部参数传给该类方法作为参数对应的lambda表达式abc-类名类方法abc引用特定对象的实例方法示例特定对象实例方法说明函数式接口中被实现方法的全部参数传给该方法作为参数对应的lambda表达式abc-特定对象实例方法abc引用某类对象的实例方法示例类名实例方法说明函数式接口中被实现方法的第一个参数作为调用者后面的参数全部传给该方法作为参数对应的lambda表达式abc-a实例方法bc引用构造器示例类名new说明函数式接口中被实现方法的全部参数传给该构造器作为参数对应的lambda表达式ab-new-类名ab
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#例子1引用类方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2引用特定对象的实例方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#3引用某类对象的实例方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#4引用构造器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#44lambda表达式和匿名内部类的相同点lambda表达式与匿名内部类一样都可以直接访问effectively-final的局部变量以及外部类的成员变量包括实例变量和类变量lambda表达式创建的对象与匿名内部类生成的对象一样都可以直接调用从接口中继承的默认方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#45lambda表达式和匿名内部类的不同点匿名内部类可以为任意接口创建实例--不管接口包含多少个抽象方法只要匿名内部类实现所有的抽象方法即可但lambda表达式只能为函数式接口创建实例匿名内部类可以为抽象类甚至普通类创建实例但lambda表达式只能为函数式接口创建实例匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法但lambda表达式的代码块不允许调用接口中定义的默认方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#46枚举类和普通类的区别枚举类可以实现一个或多个接口使用enum定义的枚举类默认继承了javalangenum类而不是默认继承object类因此枚举类不能显式继承其他父类其中javalangenum类实现了javalangserializable和javalangcomparable接口使用enum定义非抽象的枚举类默认会使用final修饰因此枚举类不能派生子类枚举类的构造器只能使用private访问控制符如果省略了构造器的访问控制符则默认使用private修饰如果强制指定访问控制符则只能指定private修饰符枚举类的所有实例必须在枚举类的第一行显式列出否则这个枚举类永远都不能产生实例列出这些实例时系统会自动添加public-static-final修饰无需程序员显式添加
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#47枚举类默认提供了一个values方法该方法可以很方便的遍历所有的枚举值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#48java垃圾回收机制的特性垃圾回收机制只负责回收堆内存中的对象不会回收任何物力资源例如数据库连接网络io等资源程序无法精确控制垃圾回收的运行垃圾回收会在合适的时候进行当对象永久的失去引用后系统就会在合适的时候回收它所占的内存在垃圾回收机制回收任何对象之前总会先调用它的finalize方法该方法可能使该对象重新复活让一个引用变量重新引用该对象从而导致垃圾回收机制取消回收
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#49大部分时候程序强制系统垃圾回收后总会有一些效果强制系统垃圾回收有如下两种方式调用system类的gc静态方法systemgc调用runtime对象的gc实例方法runtimegetruntimegc
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#50对象的引用强引用strongreference程序创建一个对象并把这个对象赋给一个引用变量程序通过该引用变量来操作实际的对象软引用softreference需要通过softreference类来实现当一个对象只有软引用时它有可能被垃圾回收机制回收对于只有软引用的对象而言当系统内存空间足够时他不会被系统回收程序也可使用该对象当系统内存不足时系统可能会回收它软引用通常用于堆内存敏感的程序中弱引用weakreference通过weakreference类实现弱引用和软引用类似但是引用级别更低对于只有弱引用的对象而言当系统垃圾回收机制运行时不管系统内存是否足够总会回收该对象所占用的内存当然并不是说当一个对象又有弱引用时它就会立即被回收--正如那些失去引用的对象一样必须等到系统垃圾回收机制运行时才会被回收虚引用phantomreference通过phantomreference类实现虚引用完全类似于没有引用虚引用对对象本身没有太大影响对象甚至感觉不到虚引用的存在如果一个对象只有一个虚引用时那么它也没有引用效果大致相同虚引用主要用于跟踪对象被垃圾回收的状态虚引用不能单独使用虚引用必须和引用队列referencequeue联合使用
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#51使用这些引用类可以避免在程序执行期间将对象留在内存中如果以软引用弱引用或者虚引用的方式引用对象垃圾回收器就能够随意地释放对象如果希望尽可能减小程序在其生命周期中所占用的内存大小时这些引用类就很有用处
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#52由于垃圾回收的不确定性当程序从软引用弱引用中取出被引用对象时可能这个被引用对象已经被释放了如果程序需要使用这个对象就需要重新穿件具体操作有两种大致如下
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#正是由于垃圾回收的不确定性假如在if块内系统执行了垃圾回收后面obj就有可能拿到null所以该方法存在弊端
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#53java程序在不同操作系统上运行时可能需要取得平台相关的属性或者调用平台命令来完成特定功能java提供了system和runtime类来与程序的运行平台进行交互
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#54system类提供了一个identityhashcodeobject-x方法该方法返回指定对象的精确hashcode值也就是根据该对象的地址计算得到的hashcode值当某个对象的hashcode方法被重写后该类实例的hashcode方法就不能唯一的标识该对象但是通过identityhashcode方法返回的hashcode值依然是根据该对象的地址计算得到的hashcode值所以如果两个对象的identityhashcode值相同则两个对象绝对是同一个对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#55runtime可以直接单独启动一个进程来运行操作系统的命令启动系统记事本
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#56object类的clone方法是一种浅克隆只克隆该对象的所有成员变量值不会对引用类型的成员变量值所引用的对象进行克隆如果需要对对象进行深克隆则需要开发者自己进行递归克隆保证所有引用类型的成员变量所引用的对象都被复制了
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#57random类专门用于生成一个伪随机数它有两个构造器一个构造器使用默认的种子以当前时间作为种子另一个构造器需要程序员显式传入一个long型整数的种子threadlocalrandom类是java7新增的一个类它是random的增强版在并发访问的环境下使用threadlocalrandom来代替random可以减少多线程资源竞争最终保证系统具有更好的线程安全性
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#58random使用一个48位的种子如果这个类的两个实例是用同一个种子创建对他们以同样的顺序调用方法则它们会产生相同的数字序列当使用默认的种子构造random对象时他们属于同一个种子
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#59由于java的double类型进行基本运算时会造成精度丢失所以java提供了bigdecimal类创建bigdecimal对象时不要直接使用double浮点数作为构造器参数来调用bigdecimal构造器否则同样会发生精度丢失如果使用bigdecimalstring-val构造器的结果是可预知的因此通常建议优先使用基于string的构造器如果必须使用double浮点数作为bigdecimal构造器的参数时不要直接将double浮点数作为参数应该通过bigdecimalvalueofdouble-value静态方法来创建bigdecimal对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#60关于calendar类有个好用的方法add和roll功能类似都是接收两个参数一个field代表操作的是年月日时分秒之一第二个参数是要添加正数减少负数的值两个方法的区别add如果field添加超过限制会改变前一位roll不会
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#61calendar类的set方法有延时性每次执行set之后calendar对象并没有立即更改只是在内部标记了一个set了某字段的属性当再次调用getgettimegettimeinmillisadd或roll时才会改变这样可以避免不必要的计算
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#62当使用iterator对集合元素进行迭代时iterator并不是把集合元素本身传给了迭代变量而是把集合元素的值传递给了迭代变量所以修改迭代变量的值对集合元素本身没有任何影响
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#63iterator必须依附于collection对象若有一个iterator对象则必须有一个与之关联的collection对象iterator提供了两个方法来迭代访问collection集合里的元素并可通过remove方法来删除集合中上一次next方法返回的集合元素
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#64当使用iterator迭代访问collection集合元素时collection集合里的元素不能被改变只有通过iterator的remove方法删除上一次next方法返回的集合元素才可以否则将发生javautilconcurrentmodificationexception异常
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#65当使用foreach循环迭代访问集合元素时该集合也不能改变否则将引发concurrentmodificationexception异常
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#66java8位collection集合新增了一个removeifpredicate-filter方法可以批量删除filter条件的所有元素predicate也是函数式接口因此可使用lambda表达式作为参数使用predicate的test方法判断该对象是否满足predicate指定的条件
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#67hashset中不能存入相同的元素判断元素是否相等的标准是对象的hashcode方法的返回值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#67当向hashset中添加可变对象时必须十分小心如果修改hashset集合中的对象有可能导致该对象与集合中的其他对象相等hashcode值相等从而导致hashset无法准确访问该对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#68hashset中添加的元素都是无序的hashset的子类linkedhashset存入数据是有序的但相应的性能会略低于hashset
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#69treeset是sortedset接口的实现类可以确保元素处于排序状态因为treeset中的元素是有顺序的所以增加了访问第一个前一个后一个最后一个元素的方法并提供了三个从treeset中截取子treeset的方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#70treeset根据元素的实际值大小来进行排序不是根据插入顺序hashset根据hash算法确定元素的存储位置treeset采用红黑树的数据结构来存储集合元素treeset支持自然排序和定制排序
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#71自然排序treeset会调用集合元素的comparetoobject-obj方法来比较元素之间的大小关系然后将集合元素升序排列
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#72java提供了一个comparable接口该接口里定义了一个comparetoobject-obj方法该方法返回一个整数值实现该接口的类必须实现该方法例如obj1comparetoobj2如果该方法返回0则表明两个对象相等如果该方法返回一个正整数则表明obj1大于obj2如果该方法返回一个负整数则表明obj1小于obj2
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#73向treeset中添加元素时只有第一个元素无需实现comparable接口后面的所有元素必须实现即便如此从treeset中取出元素时仍然会引发classcastexception所以最好所有元素都要实现comparable接口
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#74一旦改变了treeset集合里可变元素的实例变量当再企图删除该对象时treeset也会删除失败甚至集合中原有的实例变量没有被修改但与修改后元素相等的元素也无法删除所以为了程序更加健壮不要修改放入hashset和treeset集合中元素的关键实例变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#75定制排序再创建treeset时提供一个comparator对象与该treeset集合关联
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#76enumset是一个专为枚举类设计的集合类所有元素必须是指定枚举类型的枚举值集合元素也是有序的以枚举值再enum类内的定义顺序来确定集合元素的顺序
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#77enumset在内部以位向量的形式存储enumset没有提供任何构造方法要通过提供的类方法构建实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#78list代表一个元素有序可重复的集合集合中每个元素都有其对应的顺序索引
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#79list集合是根据对象的equals方法的返回值来判断对象是否相等的
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#80arraylist和vector都是list的实现类都是基于数组实现的list类内部封装了一个动态的允许再分配的object数组它们内部使用initialcapacity参数来设置该数组的长度每次添加元素超出该数组长度时它们的initialcapacity会自动增长如果向arraylist或vector集合中添加大量元素时可使用ensurecapacityint-mincapacity将arraylist或vector集合的数组长度增加大于或等于mincapacity值方法一次性的增加initialcapacity可以减少重分配的次数提高性能
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#81如果开始就知道arraylist或vector集合需要保存多少个元素可以在创建的时候指定initialcapacity如果创建空的arraylist或vector集合默认长度是10
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#82arraylist和vector用法相同vector是一个非常古老的借口从jdk1存在方法名大多很长不方便使用但是是线程安全的arraylist使用方便但是多线程使用要注意很多问题线程不安全
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#83vector的子类stack是栈式存储结构但是由于古老推荐使用arraydequelist和deque的实现类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#84固定长度的listarraysarraylist是一个固定长度的list集合程序只能遍历访问该集合里的元素不可增加删除通过arrays工具类的aslistobject-a获得实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#85queue集合queue用于模拟队列这种数据结构队列先进先出头部保存在队列中存放时间最长的元素尾部保存在队列中存放时间最短的元素queue接口有一个priorityqueue实现类除此之外queue还有一个deque接口deque代表一个双端队列双端队列可以同时从-两端来添加删除元素因此deque的实现类既可以当队列使用也可以当成栈使用java为deque提供了arraydeque和linkedlist两个实现类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#86priorityqueue实现类一个对列实现类但是不是绝对标准的对列实现因为它保存队列的顺序不是按照加入队列的顺序而是按队列元素的大小进行重新排序的
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#87deque是queue接口的子接口代表双端队列arraydeque是deque的实现类也是基于数组实现的内部数组默认长度16
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#88linkedlist是list和deque的实现类与arraydeque和arraylist实现机制不同它内部以链表形式保存元素因此随机访问集合元素时性能较差但是在插入删除元素时性能出色而以数组形式实现的集合随机访问元素的性能较好
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#89collections类中提供了多个synchronizedxxx方法该方法可将指定集合包装成线程同步的集合解决多线程并发访问集合的线程安全问题
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#90数组和泛型有所不同假设foo是bar的一个字类型子类或者子接口那么foo依然是bar的子类型但gfoo不是gbar的子类型
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#91当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时所有在尖括号之间的类型信息都将被扔掉
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#92查看表结构desc-表名查看建表约束show-create-表名删除约束alter-table-表名-drop-index-street添加约束alter-table-table_name-add-constraint-constraint_name-unique-primary-keyforeign-key-column_name
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#93主键约束相当于非空约束和唯一约束即主键约束的列既不允许出现重复值也不允许出现null值如果对多列组合建立主键约束则多列里包含的每一列都不能为空但只要求这些列组合不能重复主键列的值可用于唯一的标识表中的一条记录
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#94每一个表中最多允许有一个主键但这个主键约束可由多个数据列组合而成主键是表中能唯一确定一行记录的字段或字段组合
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#95对于mysql而言如果在算数表达式中使用null将会导致整个算术表达式的返回值为null如果在字符串连接运算中出现null将会导致连接之后的结果也为null
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#96sql中判断两个值是否相等的比较运算符是单等号判断不相等的运算符是sql中的赋值运算符不是等号而是冒号等号
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#97使用distinct去除重复行它的作用是去除后面字段组合的重复值而不管对应记录在数据库是否重复
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#98mysql使用模糊查询时_代表一个字符代表多个字符如果真正需要用到这些字符用转义
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#99cross-join交叉连接即笛卡尔积natural-join自然连接基于有相同的列名的表作连接如果没有相同列效果和交叉连接相同using字句连接和自然连接相比可以指定连接参考的列如果指定的列在某张表不存在会报错on字句连接on后面跟连接条件左右全外连接leftrightfull-join连接条件也用on左外连接把左表不符合条件的行列出右外连接把右表不符合条件的行列出
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#100windows的路径分隔符使用而java程序中的反斜线表示转义字符所以如果需要在windows的路径下包括反斜线则应该使用两条反斜线或者直接使用也可以java程序支持将斜线当成平台无关的路径分隔符
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#101inputstreamreader所有输入流的基类前者是字节输入流后者是字符输入流outputstreamwriter所有输出流的基类前者是字节输出流后者是字符输出流
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#102读写文件时一定要注意字符流对应字符流字节流对应字节流如果进行输入输出的内容是文本内容则应该考虑使用字符流如果进行输入输出的内容是二进制内容则应该考虑使用字节流
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#103通过在实例变量前面使用transient关键字修饰可以指定java序列化时无需理会该实例变量使用transient修饰的实例变量将被完全隔离在序列化机制之外这样导致在反序列化恢复java对象时无法取得该实例变量的值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#104文件锁控制文件的全部或部分字节的访问java提供了filelock支持文件锁功能在filechannel中提供了locktrylock方法可以获得文件锁filelock对象从而锁定文件两个方法区别lock试图锁定某个文件时如果无法得到文件锁阻塞线程而trylock是尝试锁定文件它将直接返回不会阻塞返回文件锁或者null
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#105如果filechannel只想锁定文件的部分内容可以使用locklong-positionlong-sizeboolean-shared对文件从position开始长度为size的内容加锁阻塞式trylocklong-positionlong-sizeboolean-shared非阻塞式加锁当shared为true时表明该锁是一个共享锁它将允许多个进程来读取该文件但阻止其他进程获得对应文件的排它锁当shared为false表明该锁是一个排它锁它将锁住对该文件的读写可以通过filelock的isshared来判断它获得的锁是否为共享锁
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#106处理完文件后通过filelock的release方法释放文件锁
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#107并发性和并行性是两个概念并行指在同一时刻有多条指令在多个处理器上同时执行并发指在同一时刻只能有一条指令执行但多个进程指令被快速轮换执行使得在宏观上具有多个进程同时执行的效果
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#108多线程优势进程之间不能共享内存但是线程之间共享内存非常容易系统创建进程时需要为该进程重新分配系统资源但创建线程则代价小得多因此使用多线程来实现多任务并发比多进程的效率高java语言内置了多线程功能支持而不是单纯地作为底层操作系统的调度方式从而简化了java的多线程编程
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#109使用继承thread类的方法来创建线程类多个线程之间无法共享线程类的实例变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#110runnable对象仅仅作为thread对象的targetrunnable实现类里包含的run方法仅作为线程执行体而实际的线程对象依然是thread实例只是该thread线程负责执行其target的run方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#111采用runnable接口的方式创建的多个线程可以共享线程类的实例变量这是因为在这种方式下程序所创建的runnable对象只是线程的target而多个线程可以共享同一个target所以线程可以共享一个线程类实际上应该是线程的target类的实例变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#112线程的生命周期新建new就绪runnable运行running阻塞blocked和死亡dead
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#113new出一个线程类之后该线程处于新建状态调用start方法之后处于就绪状态如果手动调用了线程的run方法该线程类将被当做普通java对象调用单线程的只能对处于新建状态的线程调用start方法否则将引发illegaltheadstateexception异常
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#114如果希望调用子线程的start方法后子线程立即开始执行程序可以使用threadsleep1来让当前运行的线程主线程睡眠1毫秒-1毫秒就够了因为在这1毫秒内cpu不回空闲它会去执行另一个处于就绪状态的线程这样就可以让子线程立即开始执行
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#115调用线程的isalive方法可以测试某个线程是否死亡当线程处于就绪运行阻塞三种状态时该方法返回true当线程处于新建死亡两种状态时返回false
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#116thread提供了一个让一个线程等待另一个线程完成的方法-join方法当在某个程序执行流中调用其他线程的join方法时调用线程将被阻塞直到被join方法加入的join线程执行完为止
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#117调用setdaemontrue必须在start方法之前调用方法可以指定线程设置成后台线程如果所有前台线程都死亡后台线程会自动死亡前台线程创建的子线程默认是前台线程后台线程创建的子线程默认是后台线程
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#118通过调用thread类的静态sleep方法实现当前执行的线程暂停一段时间并进入阻塞状态
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#119yield方法也是thread类的一个静态方法可以让正在执行的线程暂停但不会阻塞该线程它只是将该线程转入就绪状态该方法只是让当前线程暂停让系统的线程调度器重新调度一次完全有可能还调度到自己事实上只有优先级比当前线程高或者和当前线程相等且处于就绪状态的线程才有可能执行
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#120任何时刻只有一个线程可以获得对同步监视器的锁定当同步代码执行完成后该线程会释放对该同步监视器的锁定
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#121synchronized关键字可以修饰方法可以修饰代码块不能修饰构造器成员变量等
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#122线程会在如下几种情况释放对同步监视器的锁定a当前进程的同步方法同步代码块执行结束b当前线程在同步方法同步代码块中遇到breakreturn终止了执行c当前线程在同步代码块同步方法出现未处理的error或exception导致异常结束d当前线程在执行同步代码块或者同步方法时程序执行了同步监视器对象的wait方法则当前线程暂停并释放同步监视器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#123如下情况线程不会释放同步监视器a线程执行同步方法或者同步代码块调用threadsleepthreadyield方法来暂停当前线程的执行当前线程不会释放同步监视器b线程执行同步代码块时其他线程调用了该线程的suspend方法将该线程挂起该线程不会释放同步监视器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#124object类提供的waitnotify和notifyall三个方法必须由同步监视器对象来调用对于有synchronized修饰的同步方法因为该类的默认实例this就是同步监视器所以可以在同步方法中直接调用这三个方法对于使用synchronized修饰的同步代码块同步监视器是synchronized后括号里的对象所以必须使用该对象调用这个方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#125wait导致当前线程等待直到其他线程调用该同步监视器的notify方法或notifyall方法来唤醒该线程wait方法有三种形式无参一直等待直到其他线程通知带毫秒参数的wait带毫秒微妙参数表示一段时间后释放对该同步监视器的锁定
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#126notify唤醒在此同步监视器上等待的单个县城如果所有线程都在此同步监视器上等待则会选择唤醒其中一个线程选择是任意性的只有当前线程放弃对该同步监视器的锁定后使用wait方法才可以执行被唤醒的线程
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#127notifyall唤醒再次同步监视器上等待的所有线程只有当前线程放弃对该同步监视器的锁定后才可以执行被唤醒的线程
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#128condition实例被绑定在一个lock对象上通过lock对象的newcondition方法获取condition实例condition实例提供了如下三个方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#129await类似于隐式同步监视器上的wait方法signal类似于notifysignalall类似notifyall方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#130blockingqueue可以作为线程同步工具当生产者线程试图向blockingqueue中放入元素时如果该队列已满则线程被阻塞当消费线程试图从blockingqueue中取出元素时如果该队列已空则改程序被阻塞
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#131blockingqueue继承了queue接口可以使用queue接口中的方法归纳如下a在队列尾部插入元素包括adde-eoffere-e和pute-e方法当该队列已满这三个方法分别会抛出异常返回false素色队列b在队列头部删除并返回删除的元素包括removepoll和take方法当该队列已空时这三个方法分别会抛出异常返回false阻塞队列c在队列头部取出但不删除元素包括element和peek方法当队列已空时这两个方法分别抛出异常返回false
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#132线程池通过executors工厂类来生产线程池
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#anewfixedthreadpoolint-nthreads创建一个可重用的具有固定线程数的线程池
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#bnewcachedthreadpool创建一个具有缓存功能的线程池系统根据需要创建线程这些线程将会被缓存在线程池中
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#cnewsinglethreadexecutor创建一个只有单线程的线程池它相当于调用newfixedthreadpool方法时传入参数为1
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#dnewscheduledthreadpoolint-corepoolsize创建具有指定线程数的线程池它可以在指定延迟后执行线程任务corepoolsize指池中所保存的线程数即使线程是空闲的也被保存在线程池内
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#enewsinglethreadscheduleexecuter创建只有一个线程的线程池它可以在指定延迟之后执行线程任务
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#fexecutorsevice-newworkstealingpoolint-parallelism创建持有足够的线程的线程池来支持给定的并行级别该方法还会使用多个队列来减少竞争
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#gexecutorservice-newworkstealingpool该方法是前一个方法的简化版本如果当前机器有4个cpu则目标并行级别被设置成4也就是相当于为前一个方法传入4作为参数
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#前三个方法返回executorservice对象代表一个线程池它可以执行runnable对象或callable对象所代表的线程中间两个方法返回scheduleexecutorservice线程池它是executorservice的子类可以在指定延迟后执行线程任务最后两个方法生成work-stealing池相当于后台线程池如果所有的前台线程都死亡了work-stealing池中的线程会自动死亡
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#133线程池使用步骤a调用executors类的静态工厂方法创建一个executorservice对象该对象代表一个线程池b创建runable实现类或callable实现类的实例作为线程执行任务c调用executorservice独享的submit方法来提交runnable实例或callable实例d-当不想提交任何任务时--调用executorservice对象的shutdown方法来关闭线程池
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#134forkjoinpool支持将一个任务拆分成多个小任务并行计算再把多个小任务的结果合并成总的计算结果forkjoinpool是executorservice的实现类因此是一种特殊的线程池两个构造器forkjoinpoolint-parallelism创建一个包含parallelism个并行线程的forkjoinpoolforkjoinpool创建一个以runtimeavailableprocessors方法的返回值作为parallelism参数来创建forkjoinpool
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#135创建forkjoinpool之后就可以调用submitforkjointask-task或invokeforkjointask-task方法来执行指定的任务forkjointask代表一个可以并行合并的任务forkjointask是一个抽象类他还有两个抽象子类recursiveaction和recursivetask其中recursivetask代表有返回值的任务而recursiveaction代表没有返回值的任务
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#136threadlocal代表一个线程局部变量通过把数据放在threadlocal中就可以让每个线程创建一个该变量的副本从而避免并发访问的线程安全问题
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#137同步机制是为了同步多个线程对相同资源的并发访问是多个线程之间进行通信的有效方式threadlocal是为了隔离多个线程的数据共享从根本上避免多个线程之间对共享资源的竞争也就不需要对多个线程进行同步了
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#138由于arraylistlinkedlisthashsettreesethashmaptreemap等都是线程不安全的如果程序中有多个线程可能访问这些集合可以使用collections提供的类方法把这些集合包装成线程安全的集合synchronizedcollectionsynchronizedlistsynchronizedmap-synchronizedsetsynchronizedsortedmapsynchronizedsortedset等
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#139除了上面的方法还有一些线程安全的集合类大致分为两类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#a以concurrent开头的集合类concurrenthashmapconcurrentskiplistmapconcurrentskiplistsetconcurrentlinkedqueue和concurrentlinkeddeque
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#b以copyonwrite开头的集合类如copyonwritearraylistcopyonwritearrayset
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#140当程序主动使用某个类时如果该类还未被加载到内存中系统会通过加载连接初始化三个步骤来对该类进行初始化
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#141类加载指的是将类的class文件读入内存并为之创建一个javalangclass对象也就是说当程序中使用任何类时系统都会为之建立一个javalangclass对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#142类的连接当类被加载之后系统为之生成一个对应的class对象接着将会进入连接阶段连接阶段负责把类的二进制数据合并到jar中类连接又可分为如下三个阶段
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#a验证验证阶段用于检验被加载的类是否有正确的内部结构并和其他类协调一致
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#b准备类准备阶段则负责为类的类变量分配内存并设置默认初始值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#c解析将类的二进制数据中的符号引用替换成直接引用
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#143类的初始化虚拟机负责对类进行初始化主要就是对类变量进行初始化在java中对类变量指定初始值有两种方式
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#a声明类变量是指定初始值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#b使用静态初始化块为类变量指定初始值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#144类初始化的时机
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#a创建类的实例使用new操作符来创建实例通过反射来创建实例通过反序列化的方式来创建实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#b调用某个类的类方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#c访问某个类或接口的类变量或为该类变量赋值
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#d使用反射方式来强制创建某个类或接口对应的javalangclass对象例如代码classfornameperson如果系统还未初始化person类则这行代码会导致该person类被初始化并返回person类对应的javalangclass對象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#e初始化某个类的子类当初始化某个类的子类时该子类的所有父类都会被初始化
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#f直接使用javaexe命令来运行某个主类当运行某个主类时程序会先初始化该主类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#145对于final型的类变量如果该类变量的值在编译时就可以确定下来那么这个类变量相当于宏变量java编译器会在编译时直接把这个类变量出现的地方替换成它的值因此即使程序使用该静态类变量也不会导致该类的初始化
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#146当使用classloader类的loadclass方法来加载某个类时该方法只是加载该类并不会执行该类的初始化使用class的forname静态方法才会导致强制初始化该类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#147类加载器负责加载所有的类系统为所有被加载入内存的类生成一个javalangclass实例一旦一个类被载入jvm中同一个类就不会被再次载入在java中一个类用其全限定类名包括包名和类名作为标识但在jvm中一个类用其全限定类名和其类加载器作为唯一标识
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#148jvm启动时会形成由三个类加载器组成的初始类加载器层次结构bootstrap-classloader根类加载器extension-classloader扩展类加载器system-classloader系统类加载器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#149bootstrap-classloader负责加载java核心类javajdk180jrelibrtjar不是javalangclassloader的子类而是由jvm自身实现extension-classloader负责加载fre的扩展目录jrelibext或者由javaextdirs系统属性指定的目录中jar包的类system-classloader负责在jvm启动时来加载来自java命令的-classpath选项javaclasspath系统属性或classpath环境变量所指定的jar包和类路径可以通过classloader的静态方法getsystemclassloader来获取系统类加载器如果没有特别指定用户自定义的类加载器都以类加载器作为父加载器
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#150类加载机制有三种全盘负责当一个类加载器负责加载某个class时该class所依赖的和引用的其他class也将由该类加载器负责载入除非显示使用另外一个类加载器来载入父类委托先让parent父类加载器试图加载该class只有在父类加载器无法加载该类-时才尝试从自己的类路径中加载该类缓存机制保证所有加载过得class都会被缓存当程序中需要使用某个class时类加载器先从缓存区中搜寻该class只有当缓存区中不存在该class对象时系统才会读取该类对应的二进制数据并将其转换成class对象存入缓存区中
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#151类加载器加载class大致要经过八个步骤
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#1检查此class是否载入过即在缓存区中是否有此class如果有直接进入最后一步否则执行第二步
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2如果父类加载器不存在如果没有父类加载器则要么parent一定是根类加载器要么本身就是根类加载器则跳第四步如果父类加载器存在则执行第三步
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#3请求使用父类加载器去载入目标类如果成功载入则跳8否则跳5
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#4请求使用根类加载器来载入目标类如果成功载入跳8否则跳7
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#5当前类加载器尝试寻找class文件从与此classloader相关的类路径中寻找如果找到则执行6找不到执行7
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#6从文件中载入class成功后跳8
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#7抛出classnotfoundexception异常
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#8返回对应的javalangclass对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#152jvm中除根类加载器之外的所有类加载器都是classloader子类的实例开发者可以通过扩展classloader的子类并重写该classloader所包含的方法来实现自定义的类加载器classloader有如下两个关键方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#loadclassstring-nameboolean-resolve该方法为classloader的入口点根据指定名称来加载类系统就是调用classloader的该方法来获取指定类对应的class对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#findclassstring-name根据指定名称来查找类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#如果需要实现自定义的classloader则可以通过重写以上两个方法来实现通常推荐重写findclass方法而不是重写loadclass方法loadclass方法的执行步骤如下
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#1用findloadedclassstring来检查是否已经加载类如果已经加载则直接返回
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2在父类加载器上调用loadclass方法如果父类加载器为null则使用根类加载器来加载
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#3调用findclassstring方法查找类
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#从以上步骤可以看出如果重写findclass方法可以避免覆盖默认类加载器的父类委托缓冲机制两种策略如果重写loadclass方法则实现逻辑更为复杂
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#153在classloader里还有一个核心方法class-defineclassstring-namebyte-bint-offint-len该方法负责将指定类的字节码文件即class文件如helloclass读入字节数组byte-b内并把它转换为class对象该字节码文件可以来源于文件网络等
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#154在java程序中获得class对象通常有如下三种方式
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#1使用class类的fornamestring-clazzname静态方法该方法需要传入字符串参数该字符串参数的值是某个类的全限定类名必须添加完整包名
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2调用某个类的class属性来获取该类对应的class对象例如personclass将会返回person类对应的class对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#3调用某个对象的getclass方法该方法是javalangobject类中的一个方法所以所有的java对象都可以调用该方法该方法将会返回该对象所属类对应的class对象
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#155通过反射来生成对象有两种方式
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#1使用class对象的newinstance方法来创建该class对象对应类的实例这种方式要求该class对象的对应类有默认构造器而执行newinstance方法时实际上是利用默认构造器来创建该类的实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#2先使用class对象获取指定的constructor对象再调用constructor对象的newinstance方法来创建该class对象对应类的实例通过这种方式可以选择使用指定的构造器来创建实例
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#156通过反射调用方法当获得某个类对应的class对象后可以通过该class对象的getmethods或者getmethod方法获取全部或指定方法这两个方法返回值为method数组或者method对象每个method对象对应一个方法可以调用method里包含的invoke方法来调用该方法
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#157如果程序需要调用某个对象的private方法可以先调用method对象的setaccessibleboolean-flag方法将method对象的accessible设置为指定的布尔值true指示该method在使用时应该取消java语言的访问权限检查值为false则指示该method在使用时要实施java语言的访问权限检查
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#158setaccessibleboolean-flag方法并不属于method而是属于它的父类accessibleobject因此methodconstructorfield都可调用该方法从而实现反射来调用private方法private构造器和private成员变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#159通过反射来访问成员变量通过class对象的getfieldsgetdeclaredfields获取各种访问修饰符的变量或者getfieldgetdeclaredfield获取各种访问修饰符的变量方法可以获取该类所包含的全部成员变量或者指定成员变量
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#getxxxobject-obj获取obj对象的该成员变量的值此处的xxx对应8种基本类型如果该成员变量的类型是引用类型则取消get后面的xxx
https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#setxxxobject-objxxx-val将obj对象的该成员变量设置成val值此处的xxx对应8种基本类型如果该成员变量的类型是引用类型则取消set后面的xxx
Readme https://patch-diff.githubusercontent.com/Android-Star/Note-For-Java#readme-ov-file
Please reload this pagehttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java
Activityhttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/activity
2 starshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/stargazers
1 watchinghttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/watchers
0 forkshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/forks
Report repository https://patch-diff.githubusercontent.com/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2FAndroid-Star%2FNote-For-Java&report=Android-Star+%28user%29
Releaseshttps://patch-diff.githubusercontent.com/Android-Star/Note-For-Java/releases
Packages 0https://patch-diff.githubusercontent.com/users/Android-Star/packages?repo_name=Note-For-Java
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.