首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

ES7学习笔记(九)搜索

搜索是ES最最核心的内容,没有之一。前面章节的内容,索引、动态映射、分词器等都是铺垫,最重要的就是最后点击搜索这一下。下面我们就看看点击搜索这一下的背后,都做了哪些事情。 分数(score) ES的搜索结果是按照相关分数的高低进行排序的,咦?! 怎么没说搜索先说搜索结果的排序了?咱们这里先把这个概念提出来,因为在搜索的过程中,会计算这个分数。这个分数代表了这条记录匹配搜索内容的相关程度。分数是一个浮点型的数字,对应的是搜索结果中的_score字段,分数越高代表匹配度越高,排序越靠前。 在ES的搜索当中,分为两种,一种计算分数,而另外一种是不计算分数的。 查询(query context) 查询,代表的是这条记录与搜索内容匹配的怎么样,除了决定这条记录是否匹配外,还要计算这条记录的相关分数。这个和咱们平时的查询是一样的,比如我们搜索一个关键词,分词以后匹配到相关的记录,这些相关的记录都是查询的结果,那这些结果谁排名靠前,谁排名靠后呢?这个就要看匹配的程度,也就是计算的分数。 过滤(filter context) 过滤,代表的含义非常的简单,就是YES or NO,这条记录是否匹配查询条件,它不会计算分数。频繁使用的过滤还会被ES加入到缓存,以提升ES的性能。下面我们看一个查询和过滤的例子,这个也是ES官网中的例子。 GET /_search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } } 我们看一下请求的路径/_search,这个是请求的路径,而请求的方法是GET,我们再看请求体中,有一个query,这个代表着查询的条件。而bool中的must被用作query context,它在查询的时候会计算记录匹配的相关分数。filter中的条件用作过滤,只会把符合条件的记录检索出来,不会计算分数。 组合查询 组合查询包含了其他的查询,像我们前面提到的query context和filter context。在组合查询中,分为很多种类型,我们挑重点的类型给大家介绍一下。 Boolean Query boolean查询,前面我们写的查询语句就是一个boolean查询,boolean查询中有几个关键词,表格如下: 关键词 描述 must 必须满足的条件,而且会计算分数, filter 必须满足的条件,不会计算分数 should 可以满足的条件,会计算分数 must_not 必须不满足的条件,不会计算分数 我们看看下面的查询语句: POST _search { "query": { "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "filter": { "term" : { "tag" : "tech" } }, "must_not" : { "range" : { "age" : { "gte" : 10, "lte" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } }, { "term" : { "tag" : "elasticsearch" } } ], "minimum_should_match" : 1, "boost" : 1.0 } } } 上面的查询是一个典型的boolean组合查询,里边的关键词都用上了。很多小伙伴们可能对must和should的区别不是很了解,must是必须满足的条件,我们的例子中must里只写了一个条件,如果是多个条件,那么里边的所有条件必须满足。而should就不一样了,should里边现在列出了两个条件,并不是说这两个条件必须满足,到底需要满足几个呢?我们看一下下面的关键字minimum_should_match,从字面上我们就可以看出它的含义,最小should匹配数,在这里设置的是1,也就是说,should里的条件只要满足1个,就算匹配成功。在boolean查询中,如果存在一个should条件,而没有filter和must条件的话,那么minimum_should_match的默认值是1,其他情况默认值是0。 我们再看一个实际的例子吧,还记得前面我们创建的ik_index索引吗?索引中存在着几条数据,数据如下: _index _type _id ▲_score id title desc ik_index _doc fEsN-HEBZl0Dh1ayKWZb 1 1 苹果 苹果真好吃 ik_index _doc 2 1 1 香蕉 香蕉真好吃 ik_index _doc 1 1 1 香蕉 香蕉真好吃 ik_index _doc 3 1 1 橘子 橘子真好吃 ik_index _doc 4 1 1 桃子 桃子真好吃 只有5条记录,我们新建一个查询语句,如下: POST /ik_index/_search { "query":{ "bool":{ "must":[ { "match":{ "desc":"香蕉好吃" } } ] } }, "from":0, "size":10, } 我们查询的条件是desc字段满足香蕉好吃,由于我们使用的ik分词器,查询条件香蕉好吃会被分词为香蕉和好吃,但是5的数据的desc中都有好吃字段,所有5条数据都会被查询出来,我们执行一下,看看结果: _index _type _id ▲_score id title desc ik_index _doc 2 0.98773474 1 香蕉 香蕉真好吃 ik_index _doc 1 0.98773474 1 香蕉 香蕉真好吃 ik_index _doc 3 0.08929447 1 橘子 橘子真好吃 ik_index _doc 4 0.08929447 1 桃子 桃子真好吃 ik_index _doc fEsN-HEBZl0Dh1ayKWZb 0.07893815 1 苹果 苹果真好吃 哈哈,5条数据全部查询出来了,和我们的预期是一样的,但是,我们需要注意一点的是_score字段,它们的分数是不一样的,我们的查询条件是香蕉好吃,所以既包含香蕉又包含好吃的数据分数高,我们看到分数到了0.98,而另外3条数据只匹配了好吃,所以分数只有0.7,0.8。 Boosting Query 这个查询比较有意思,它有两个关键词positive和negative,positive是“正”,所有满足positive条件的数据都会被查询出来,negative是“负”,满足negative条件的数据并不会被过滤掉,而是会扣减分数。那么扣减分数要扣减多少呢?这里边有另外一个字段negative_boost,这个字段是得分的系数,它的分数在0~1之间,满足了negative条件的数据,它们的分数会乘以这个系数,比如这个系数是0.5,原来100分的数据如果满足了negative条件,它的分数会乘以0.5,变成50分。我们看看下面的例子, POST /ik_index/_search { "query": { "boosting": { "positive": { "term": { "desc": "好吃" } }, "negative": { "term": { "desc": "香蕉" } }, "negative_boost": 0.5 } } } positive条件是好吃,只要desc中有“好吃”的数据都会被查询出来,而negative的条件是香蕉,只要desc中包含“香蕉”的数据都会被扣减分数,扣减多少分数呢?它的得分将会变为原分数*0.5。我们执行一下,看看效果, index type _id score _source.id source.title source.desc ik_index _doc 3 0.08929447 1 橘子 橘子真好吃 ik_index _doc 4 0.08929447 1 桃子 桃子真好吃 ik_index _doc fEsN-HEBZl0Dh1ayKWZb 0.07893815 1 苹果 苹果真好吃 ik_index _doc 2 0.044647235 1 香蕉 香蕉真好吃 ik_index _doc 1 0.044647235 1 香蕉 香蕉真好吃 我们可以看到前3条数据的分数都在0.09左右,而后两条的数据在0.044左右,很显然,后两条数据中的desc包含香蕉,它们的得分会乘以0.5的系数,所以分数只有前面数据的分数的一半。 全文检索 在前面几节的内容中,我们介绍过,只有字段的类型是text,才会使用全文检索,全文检索会使用到分析器,在我们的ik_index索引中,title和desc字段都是text类型,所以,这两个字段的搜索都会使用到ik中文分词器。全文检索比起前面的组合检索要简单一点,当然,在ES的官方文档中,全文检索中的内容还是挺多的,在这里我们只介绍一个标准的全文检索。 我们看看下面的语句, POST /ik_index/_search { "query": { "match": { "desc": { "query": "苹果" } } } } 在请求体中,match代替了之前的bool,match是标准的全文索引的查询。match后面跟的字段是要查询的字段名,在咱们的例子中,查询的字段是desc,如果有多个字段,可以列举多个。desc字段里,query就是要查询的内容。我们还可以在字段中指定分析器,使用analyzer关键字,如果不指定,默认就是索引的分析器。我们执行一下上面的查询,结果如下: index type _id score source.id source.title source.desc ik_index _doc fEsN-HEBZl0Dh1ayKWZb 1.2576691 1 苹果 苹果真好吃 我们可以看到相应的数据已经检索出来了。 最后 在ES中,检索的花样是比较多的,这里也不能一一给大家介绍了,只介绍一些最基本、最常用的查询功能。下一篇我们看一下ES的聚合查询功能。

优秀的个人博客,低调大师

SAP Commerce(SAP Hybris)学习资料汇总

版本号:v1.02@TOC SAP官方帮助文档 Installer-Recipe 不能用于生产用途。文件夹位置:installer/recipes. 这个链接包含了所有recipe的说明。 Extension和Addon的概念 若干extensions组合在一起,以module的形式发布。 An extension can contain business logic, type definitions, a web application, or a Hybris Management Console configuration. That way, you link up in one place all of the functionality that covers a certain field of use, for example a webshop. Addon是一种特殊的extension,扩展了Commerce Accelerator的功能。这种extension添加了UI页面,但又没有直接修改Storefront的实现。 AddOns extend the functionality of the SAP Commerce Accelerator. They are a type of extension that allow you to add front-end files such JSP, HTML, CSS, and JavaScript files, and images without modifying the storefront front-end files directly. 这个链接包含了一个表格,可以查询Extension和Addon的ID和description. 总体架构 Extension专题 An extension is an encapsulated piece of software that extends SAP Commerce functionality by either modifying existing features, or introduction new features. Extension modules are structural elements of an extension. Extension module是extension的一部分。 You can implement JUnit tests for the extension's core extension module. The files for these JUnit tests must be located in the testsrc directory of the extension. 每个extension都有一个名叫core的 extension module,包含了该extension的type system definition,items.xml, 位于resources文件夹内。命名规范: The name of this file is always defined accordingly: <$extension> -items.xml where <$extension> is the name of an extension. 与类型相关的Java source code文件也位于core extension module内。 items.xml的链接. web extension module: 是extension的一部分,可以通过浏览器访问: To launch a web extension module via your web browser, go to the URL path to Platform on the server/name of extension/starting page. For example, if you are running myExtension locally on default settings, the URL would be http://localhost:9001/myExtension. Web application filter 如何创建新的extension Internationalization-and-localization 什么是extension的core module: A core module consists of an items.xml file (and therefore allows to add new types to the system), a manager class, classes for the JaLo Layer and the ServiceLayer and JUnit test classes. The following directories are required: /src, /resources, /testsrc. While the Commerce Platform can run without any package, no package can run without the Commerce Platform. Commerce platform也是由extension组成的,称为core extension. 在这些core extension之上才是build framework,和tomcat server. Hybris-initialization和update过程 什么是Hybris的initialization: Initialization drops existing type definitions from the database prior to rebuilding, so the entire type system is created from scratch. So during an initialization, type system definitions are created to match the type system definition in the items.xml files. Update: items.xml里定义的新类型,会施加到类型系统里。 Model 基于items.xml的定义生成types. SAP-Commerce里的Spring框架 是Service Layer的foundation. Dependent Injection: 组件的依赖不是其自身维护,而是配置在外部。 Dependency injection is a software architecture pattern in which a component's dependencies are not managed by the component itself but are configured externally. A so-called container (application context) reads the configuration file, resolves the dependencies, and puts together the objects. When the objects are ready, all the dependencies are already injected. <bean class="de.hybris.platform.order.OrderService"> <property name="stockService"> <bean class="de.hybris.platform.stock.StockService"/> </property> </bean> xml文件的位置:${HYBRIS_BIN_DIR}/platform/ext/core/resources命名规范: There you find files with the name pattern |component|-spring.xml, where is something like product, order, i18n, security, and so on. For the beans themselves, a name pattern such as xyzService is recommended, such as: productService, catalogService, and so on. Service Layer的API通过interface暴露出来。interface的实现就是Spring beans,id name可以从SAP commerce API doc里找到。 Accelerator SAP Commerce Accelerator is a ready-to-use web implementation template that enables you to jumpstart your implementation and easily build and maintain a feature-rich and flexible commerce solution. China Accelerator Service-Layer 是三层的统称:ServiceLayer Framework (including the actual ServiceLayer, the Infrastructure Services, and the Business Services) relies on so-called models, which are POJOs. Attributes on models have automatically generated getter and setter methods. Models are generated based on types. ProductModel是service layer的概念,基于type自动生成,getter和setter.Type layer也就是items.xml. Hybris-Type-System 类型系统是对象的模板。platform里每个对象都是类型的实例。 Types定义了持久化对象: Attribute存储对象的数据。 Deployment定义数据库表 java class A Type is the type definition in items.xml and its Java implementation. An object instance of a type is called an item: 类型分两种:System-related types and business-related types. System-related types又由下列类型组成: Infrastructure types: ComposedTypes (also referred to as ItemTypes) set up type definitions and may carry attributes to hold information. In the end, every persistent object in the SAP Commerce is an instance of ComposedType or of one of its subtypes. Business-related types: (like Order, Discount, Shoe) allow you to manage product and / or customer information so that you can run your business. every object stored in SAP Commerce is an instance of a type. Even type definitions are instances of the type Type. This means that there are two aspects of a type definition: it is an item and, at the same time, it defines other items. To differentiate between normal object instances and type definitions, non-type objects in Platform are referred to as items. The lower case spelling item refers to an object in Platform; the upper case spelling Item refers to the type definition. 小写的items代表platform里non-type对象, 大写的代表类型定义。 The following code snippet defines an item called SpecialProduct that is a subtype of Product but its type is not defined as a ComposedType, but as a SpecialComposedType (via the metatype attribute). Instances of SpecialProduct are thus subtypes of Product, but the type definition is stored as a SpecialComposedType. <item code="SpecialProduct" metatype="SpecialComposedType" extends="Product"> 类型定义attribute,如同Java 类定义fields, attribute可以是复合类型或者简单Java类型。 Platform-Services-and-Utilities backoffice 一个实际的例子:2455449 - How-to: Hide Backoffice explorer-tree nodes based on user access rights 其他网友的资料 SAP成都研究院Commerce开发人员Zhang Jonathan的三篇概述文章: 从产品展示页面谈谈Hybris的特有概念和设计结构 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator 从产品展示页面谈谈Hybris系列之三:Hybris Service层介绍 Jerry Wang的文章: 浅谈SAP CRM和Hybris Commerce里的价格架构折扣 其它文章: 安装和目录介绍 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

优秀的个人博客,低调大师

Java学习第4天:分支结构

二、程序流程控制 流程控制语句是用来控制程序中各语言执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。三种基本流程结构: 顺序结构 程序从上到下逐行执行,中间没有任何判断和跳转。 分支结构 根据条件,选择性地执行某段代码。有if-else和switch-case两种分支语句。 循环结构 根据循环条件,重复性的执行某段代码。有while、do……while,for三种循环语句注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。 if-else 所有三元运算符都可以用if-else结构替代,if-else不一定能改成三元运算符。如果既可以使用三元运算符又可以使用if-else,优先选用三元运算符。原因:简洁、执行效率高。例如,3个数取最大值class SanYuan{public static void main(String[] args){int n1=12;int n2=30;int n3=-43;int max=((n1>n2?n1:n2)>n3)?(n1>n2?n1:n2):n3;//不建议这么写,可读性差System.out.println("The max of n1 n2 n3 is " + max);int max1,max2;if(n1>n2){max1=n1;} else{max1=n2;} if(max1>n3){max2=max1;} else{max2=n3;}System.out.println("The max of n1 n2 n3 is " + max2);}} if语句三种结构(条件判断结构): 1、if(条件表达式){执行代码块} //只有一种选择2、if(条件表达式){执行代码块1} else {执行代码块2} //二选一3、if(条件表达式){执行代码块1} else if(条件表达式2){执行代码块2} else{执行代码块3} 多选一,中间可以多个elseif &和&&的异同 都是且的关系左边true,右边都执行左边false,短路与后面不执行,逻辑与后面执行 Scanner类 从键盘获取不同类型的变量,char型的获取,Scanner没有提供相关办法,只能获取一个字符串。当输入的值和获取的类型不一致时会报错。具体实现步骤:1、导包:import java.util.Scanner;写在类的上面,类Scanner在包util下。2、Scanner的实例化,Scanner scan=new Scanner(System.in);3、调用Scanner类的相关方法获取指定类型的变量,int num=scan.nextInt(); 例1: 输入一个整数并输出。import java.util.Scanner;class Scan{public static void main(String[] args){Scanner sc = new Scanner(System.in);int i = sc.nextInt();System.out.println("The input number is "+i);}}javac Scanner.java$ java Scan88The input number is 88 例2: 输入字符串。import java.util.Scanner;class ScannerString{public static void main(String[] args){Scanner sc =new Scanner(System.in);System.out.println("请输出你的名字:n");String userName = sc.next();System.out.println("欢迎"+userName+"登录系统");}}$ javac ScannerString.java$ java ScannerString请输出你的名字: lisi欢迎lisi登录系统 例3: 输入期末考试成绩,100分降落宝马,80-99奖励手机,60-80奖励玩具,不及格什么都没有。import java.util.Scanner;class IfTest{public static void main(String[] args){int score;Scanner scan = new Scanner(System.in);System.out.println("请输入成绩,在0到100之间");score=scan.nextInt();if(score == 100){System.out.println("奖励一辆BMW");}else if(score < 100 && score > 80){System.out.println("奖励一个手机");}else if(score >= 60 && score <= 80){System.out.println("奖励一个玩具"); }else{System.out.println("什么都没有");}}}说明1、else结构是可选的。2、针对条件表达式:如果多个条件表达式之间是“互斥”关系,哪个判断在上面或下面都无所谓;如果有交集,应该考虑清楚哪个条件应该在上面;如果条件表达式之间有包含关系,需要将范围小的声明在上面,否则小的永远不会执行,因为if else只有一个出口。 例4: 输入3个整数,按小到大输出排序。import java.util.Scanner;class SortTest{public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("Please insert the first number");int num1 = scan.nextInt();System.out.println("Please insert the second number"); int num2 = scan.nextInt();System.out.println("Please insert the third number"); int num3 = scan.nextInt();if(num1 > num2){if(num2 > num3){System.out.println(num3 + "," + num2 + "," + num1);}else if(num3 > num1){System.out.println(num2 + "," + num1 + "," + num3);} else{System.out.println(num2 + "," + num3 + "," + num1); }} else {if(num1 > num3){ System.out.println(num3 + "," + num1 + "," + num2); }else if(num3 > num2){ System.out.println(num1 + "," + num2 + "," + num3); } else{ System.out.println(num1 + "," + num3 + "," + num2); }}}}$ java SortTestPlease insert the first number1000Please insert the second number0Please insert the third number8880,888,1000说明:1、if-else可以互相嵌套,不过一遍不要嵌套3层以上,3层以上自己就晕了。2、if-else 后面如果只有一行执行语句,可以省略{},一般不建议省略.Java用法:String isHandsome=scan.next();if(isHandsome.equals("是")) switch-case 结构switch(表达式){case 常量1: 语句1; //break; case 常量2; 语句2; //break; case 常量N: 语句N; // default: 语句; //break; }分支结构之二:switch-case说明:1、根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,会进入相应case中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或到switch-case结构末尾为止结束,后面的case条件不会做判断。 例子: class SwitchCase{public static void main(String[] args){int num1=2;switch(num1){case 0:System.out.println("zero");case 1: System.out.println("one");case 2: System.out.println("two");case 3: System.out.println("three");default:System.out.println("others");}}}$ java SwitchCasetwothreeothers2、break可以用在switch-case结构中,表示一旦执行到次关键字就跳出switch-case结构3、switch结构中的表达式,只能是如下6中数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。4、case后面只能声明常量,不能是范围值。5、break关键字是可选的,不是必须加的,绝大多数情况都需要加。6、default相当于if-else中的else,default选项是可选的,而且位置是灵活的,通常放到最后。 例1 switch-case判断成绩,小于60输出不合格,大于等于60输出合格。class Test{public static void main(String[] args){int score=78;switch(score/60){case 0:System.out.println("不及格");break;case 1:System.out.println("及格");break;default:System.out.println("输入值有误");break;}}} 例2: 输入年月日,计算出是第几天import java.util.Scanner;class Date{public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("请输入年份");int years = scan.nextInt();System.out.println("请输入月份,1-12");int months = scan.nextInt();System.out.println("请输入日期,1-31");int days = scan.nextInt();int sum=0;switch(months){case 12:sum += 30;case 11:sum += 31;case 10:sum += 30;case 9:sum += 31;case 8:sum += 31;case 7:sum += 30;case 6:sum += 31;case 5:sum += 30;case 4:sum += 31;case 3://判断是否闰年if((years % 4 == 0 && years % 100 != 0)||(years % 400 == 0)){sum += 29;}else{sum += 28;}case 2:sum +=31;case 1:sum +=days;System.out.println(years + "年" + months + "月" + days + "日" + "是当年的第" + sum + "天");break;default:System.out.println("月份输入错误");}}}$ java Date请输入年份2019请输入月份,1-1212请输入日期,1-31312019年12月31日是当年的第365天 总结: 1、凡是可以使用switch-case的结构都可以转换为if-else。反之,不成立。2、当我们写分支结构时,我们发现既可以使用switch-case,case取值不太多,又可以使用if-else时,优先选择使用switch-case。原因:switch-case执行效率稍高。

优秀的个人博客,低调大师

Docker学习之安装JDK、Tomcat、Mysql

一.docker部署JDK 1.下载适当的jdk版本 docker pull java:8//docker pull NAME:TAG(version) 2.查看下载到的镜像 docker images //查看所有docker下载到的镜像 3.运行java jdk镜像到容器 /** ** run 启动一个镜像容器 ** -d 后台运行该容器 ** -I 以交互模式运行容器,通常与 -t 同时使用 ** -t 为容器重新分配一个伪输入终端 */ docker run -d -it --name java java:8 4.进入容器查看jdk 到这里,我们已经创建了一个jdk的docker容器。接下来我们要进入容器,查看安装的jdk版本以及其他操作。进入docker容器有几种方式,我们分别来看一下: 1.docker attach [容器ID(缩写/全称),容器名称]:docker自带方式,但是当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,并且在使用exit退出容器时会导致正在运行的容器停止。因此,一般不建议使用此方式进入容器。如果使用该方式,退出容器时不能使用exit和Ctrl+D,应该使用Ctrl+P+Q来退出,这样不会导致容器停止。 2.docker exec -it [容器ID(缩写/全称),容器名称] /bin/bash :这种方式是经常使用的操作。-I -t操作与前面说的docker run命令的-it操作一致 上面就是Docker中安装JDK过程,参考文章link 二、Docker部署Tomacat,Mysql,部署过程与安装JDK一样 1.docker pull tomcat:8[mysql:5] 2.docker images 3.docker run -d -it --name [容器名] [image]

优秀的个人博客,低调大师

第二天学习Java

一、复习: 计算机语言的发展迭代史 第一代:机器语言第二代:汇编语言第三代:高级语言 面向过程:C,Pascal、Fortran 面向对象:Java,JS,Python,Scala,。。。 Java语言的特点: 面向对象 两个要素:类、对象 三个特征:封装、继承、多态 健壮性去除了C语言中的指针;自动的垃圾回收机制(仍然会出现内存溢出、内存泄漏)跨平台性write once,run anywhere归功于JVM JDK的下载安装 下载:官网安装软件的路径中不能包含空格path环境变量:windows操作系统执行命令所搜寻的路径不看资料,手动编写类helloworld程序class test{public static void main(String[] args){ System.out.println("This is a test");}} 二、关键字和保留字 关键字 定义:被Java语言赋予了特殊含义,用作专门用途的的字符串(单词)特点:关键字中所有字母都为小写官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 保留字 现有Java版本尚未使用,但以后版本可能会作为关键字使用、自己命名标志符时要避免使用这些保留字goto,const 三、标识符 Java对各种变量、方法和类等要素命名时使用的字符序列称为标志符技巧:凡是自己可以起名字的地方都叫标识符 标识符定义规则 1、由26个英文字母大小写,0-9,_或$组成2、数字不可以开头3、不可以使用关键字和保留字,但能包含关键字和保留字4、Java中严格区分大小写,长度无限制5、标识符不能包含空格如果不符合以上规则,编译不通过。 标识符命名规范 命名规范并不是必须遵守的,一般建议遵守,否则不利于区分。1、包名:多单词组成时,所有字母都小写,xxxyyyzzz2、类名、接口名:多单词组成,所有单词首字母大写,XxxYyyZzz3、变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写,xxxYyyZzz4、常量名:所有字母都大写,多单词时,每个单词用下划线连接,XXX_YYY_ZZZ5、命名时,尽量有意义,做到见名知意6、Java采用unicode字符集,因此标志符也可以使用汉字声明,但是不建议使用。例子:编写一个变量并输出class OutPut{public static void main(String[] args){ int testNumber=8; System.out.println(testNumber);}}注:println输出变量时,不需要用“”。 四、变量 变量的概念:内存中的一个存储区域;该区域的数据可以在同一类型范围内不断变化;变量是程序中最基本的存储单元,包含变量类型、变量名和存储的值变量的作用:用于在内存中保存数据。使用变量的注意事项:1、先声明和赋值,后使用(不声明或不赋值程序会报错);2、使用变量名来访问这块区域的数据;3、变量的作用域为其定义所在的一对{}内;4、变量只有在其作用域内才有效;5、同一个作用域内,不能定义重名的变量。定义变量格式: 数据类型 变量名 = 变量值;例如 int myNumber=1001也可以int myNumber;myNumber=1001; 基本数据类型 不同的数据类型,在内存中分配不同大小的内存空间。数据类型包括基本数据类型(primitive type)和引用数据类型(reference type)。基本数据类型:数值型(整数类型(byte、short、int、long)、浮点类型(float、double),字符型(char),布尔型(boolean)。引用数据类型:类(class)、接口(interface)、数组(array[ ])。java是强类型,JS是弱类型(自动判断)整型byte 1字节=8bit,范围 -128-127short 2字节 ,范围 -32768-32767int 4字节 ,范围 -2147483648-2147483647,约21亿long 8字节 ,范围 -2的63次幂-2的63次幂减1,赋值必须以l或L结尾bit是计算机中的最小存储单元,byte是计算机中的基本存储单元。1个字节8位。通常定义整型变量为int。浮点类型float 4字节,单精度,尾数可以精确到7位有效数字。很多情况下很难满足需求。float类型结尾要以f或F结尾double 8字节,双精度,精度是float的两倍,通常采用此类型。字符型char 只能是一个字符,赋值时用单引号,可以是英文、中文、日文等;也可以赋值转意字符例如/n(换行)、/t(制表符)等;可以用unicode编码方式赋值,例如u0043表示C,这样的方式很少使用。字符输出时如果出现乱码,可能是存储Java程序的格式跟JDK输出格式不一样,解决办法为保存Java代码时选择ANSI。布尔类型:boolean只能取两个值之一:true、false布尔型常在条件判断、循环结构使用。为转意字符,例如要输出“”或n时,在前面加转意字符。编写小程序输出各种数据class VariableTest{ public static void main(String[] args){ byte testByte = -127; short testShort = -30000; int testInt = 6000000; long testLong = 999999999999l; float testFloat = -12.88f; double testDouble = 8888888.8888; char testChar = 'a'; char testUnicodeChar = '\u0043'; boolean testBoolean = true; System.out.println(testByte); System.out.println(testShort); System.out.println(testInt); System.out.println(testLong); System.out.println(testFloat); System.out.println(testDouble); System.out.println(testChar); System.out.println(testUnicodeChar); System.out.println(testBoolean); if(testBoolean){ System.out.println("你不能参加单身派对"); } else { System.out.println("你可以多谈谈女朋友"); }}} 基本数据类型变量间转换 基本数据类型运算规则(7种基本数据类型,不包含boolean)1、自动类型提升当容量小的数据类型变量与容量大的数据类型的容量做运算时,结果自动提升为容量大的数据类型,这里的大小指的数据类型的大小。byte、short、char->int->long->float->double。byte、short、char运算结果(即便相同类型)为int类型例子class Boost{public static void main(String[] args){char testChar = 'a';byte testByte = 10;int testInt = testChar+testByte;System.out.println(testInt);}}2、强制类型转换强制类型转换:自动类型提升运算的逆运算强制转换需要使用强转符()。强制类型转换采用截断方式(不是四舍五入),可能会有精度损失。例子$ vim Force.javaclass Force{ public static void main(String[] args){ float testFloat=12.9f; int testInt=(int)testFloat; System.out.println(testInt);}}$ javac Force.java$ java Force12 注:整型常量,默认类型为int型;浮点型常量,默认类型为double型。

优秀的个人博客,低调大师

spring boot学习4 多环境配置

说明: 在企业中,一个项目一般都有测试环境(test) 、开发环境(dev)、生产环境(pro)等等。在每个环境中,配置信息会不一样的。比如数据库、静态资源文件位置等都会不一样的。 那么使用spring boot怎么处理这些呢? 假设现在我们的开发环境端口是:“ 测试环境端口是: 生产环境端口为: 创建如下图的配置文件: 说明: 1: dev是开发环境的 2:pro是生产环境的 3:test是测试环境的 4:是默认配置文件。 那么现在我想要访问测试环境。也就是端口是8081的怎么配置? 需要在application.properties中配置: 使用如下: spring.profiles.active= 需要的环境名称 说明: 环境名称就是application- 后面对应的 如上图,说明我们配置的是测试环境的。也就是端口是8081.那么对不对呢? 个人博客:www.kaigejava.com 我们启动项目:查看打印日志: 直接切换到生产环境(pro)端口是8888的 保存后,在看打印日志。 可以看到已经切换端口是8888。 这样就可以在不同环境使用不同的配置文件了。

优秀的个人博客,低调大师

前端学习笔记(3) - JavaScript对象分类

JavaScript中的对象分类 宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。 内置对象(Built-in Objects):由 JavaScript 语言提供的对象。 固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。 原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。 普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。 函数对象与构造器对象 JavaScript中使用对象来模拟函数与构造器。JavaScript 为这一类对象预留了私有字段机制,并规定了抽象的函数对象与构造器对象的概念。 函数对象的定义是:具有 [[call]] 私有字段的对象,构造器对象的定义是:具有私有字段 [[construct]] 的对象。我们可以这样说,任何对象只需要实现 [[call]],它就是一个函数对象,可以去作为函数被调用。而如果它能实现 [[construct]],它就是一个构造器对象,可以作为构造器被调用。 程序员使用function关键字创建出来的对象同时拥有[[call]]、[[construct]]属性,所以既可以被当做函数调用也可以当做构造器,只不过它们的行为总是相似的。当返回值为对象时函数对象与构造器对象的作用是相同的。当作为构造器对象使用时过程如下: 以 Object.protoype 为原型创建一个新对象; 以新对象为 this,执行函数的 [[call]]; 如果 [[call]] 的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象。 es6中的=>函数只能被当做函数调用。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册